Как говорится в заголовке, мне нужно запустить приложение на моем устройстве Android, пока мое устройство заблокировано или спал. Моя проблема в том, что я регистрирую GPS-координаты, и приложение останавливается, когда оно переходит в спящий режим. Я попытался создать службу, но я действительно не понимаю, как это работает. Я проверил почти каждую статью, которую я нашел в Google или на этом форуме, но код, который я нашел, всегда был неполным. Я не хочу копировать & вставить все, что я хочу понять. Поэтому полный учебник о том, как запустить locationmanager в качестве службы для получения текущего местоположения, будет отличным :).Храните Android-приложение во время блокировки устройства
Greetz
[EDIT]:
Хорошо я посмотрел в FusedLocationProvider и это то, что я сделал из него:
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import android.app.Service;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
public class GPSService extends Service implements LocationListener, ConnectionCallbacks, OnConnectionFailedListener, com.google.android.gms.location.LocationListener {
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
private boolean requestingLocationUpdate=true;
private double latitude;
private double longitude;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate()
{
Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
Log.d("GPSService", "onCreate");
mGoogleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this).addOnConnectionFailedListener(this).addApi(LocationServices.API).build();
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(10000);
mLocationRequest.setFastestInterval(5000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}
@Override
public void onDestroy()
{
Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
Log.d("GPSService", "onDestroy");
mGoogleApiClient.disconnect();
}
@Override
public void onStart(Intent intent, int startid)
{
Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
Log.d("GPSService", "onStart");
mGoogleApiClient.connect();
}
@Override
public void onLocationChanged(Location loc) {
updateContent(loc);
}
private void updateContent(Location loc)
{
Toast.makeText(this, "Location changed", Toast.LENGTH_SHORT).show();
latitude = loc.getLatitude();
longitude = loc.getLongitude();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onConnectionFailed(ConnectionResult arg0) {
// TODO Auto-generated method stub
}
@Override
public void onConnected(Bundle arg0) {
if(requestingLocationUpdate)
{
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,mLocationRequest,this);
Toast.makeText(this, "Started the location update", Toast.LENGTH_LONG).show();
}
}
@Override
public void onConnectionSuspended(int arg0) {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient,this);
}
}
Это прекрасно работает, и я получаю тост когда мое приложение работает в фоновом режиме, и местоположение меняется. Мои последующие шаги состоят в том, чтобы отправить координаты обратно в мою MainActivity. Это где появляется BroadcastReceiver?
Greetz
Я сохраняю GPS-координаты в специальном XML-файле, который мне нужен для более позднего (он должен быть xml, но вы правы Sqlite было бы намного лучше начать). Как только я получил координаты в моей MainActivity, я напишу их в xml-файл, и я хочу, чтобы я дал небольшую обратную связь с пользователем, чтобы показать ему, что устройство действительно что-то записывает. Так почему-то я должен «отправить» координаты обратно к нему. Вы упомянули обратный вызов. Можете ли вы объяснить, что именно вы имеете в виду, или дать мне дополнительную информацию, чтобы я мог начать собственное исследование об этом, пожалуйста? –
Основная концепция заключается в том, что у вас есть интерфейс. Этот интерфейс затем реализуется всеми классами, которые необходимо обновить новыми полученными данными. Вы передаете ссылку на этот класс в свой класс GPSLogger. @OneSoft дополнительно, переместите свои методы GPS в строго модельный класс. Внедрение службы запускает основной поток, и если вы получаете много очков, вы немного замедляете себя. – andrewdleach
Хорошо, я решил свою проблему с BroadcastReceiver. Спасибо за вашу помощь, сейчас он работает. –