Я создал службу, которая имеет LocationListener. Во Фрагменте у меня есть BroadcastReceiver, который успешно получает местоположение от Сервиса. Все работает нормально, когда телефон подключен к моему компьютеру, и я нажал «запустить» (не режим отладки). Я получаю местоположение непрерывно, когда экран на моем телефоне выключен, как я вижу на консоли «Запуск» в Android Studio.Android - служба определения местоположения не работает в фоновом режиме, только при подключении к компьютеру
Однако, когда я отключу свой телефон от компьютера и выключил экран, я остановил получение обновлений местоположения. Или у меня есть только одно или два обновления местоположения до его остановки. Затем при повторном включении экрана Служба начинает отправку обновлений местоположения.
Я пробовал использовать WakeLock на Фрагменте и Сервисе, но он, кажется, имеет какой-то эффект.
Может кто-то мне помочь, пожалуйста ...!?, (
В моей службы я поставил ArrayList-> Строка в putExtra(), который содержит широту и TimeStamp, так что я могу видеть, если locationlistener сделал обновление местоположения, когда экран заблокирован и в фрагменте отобразить результаты в представлении, так что я могу вручную отладки
Вот мой код услуги:..
public class GpsService extends Service {
private LocationListener listener;
private LocationManager locationManager;
private Intent mIntent;
private ArrayList<String> latTimeArrayList = new ArrayList<>();
private PowerManager.WakeLock wakeLock;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
mIntent = new Intent("location_update");
PowerManager mgr = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
wakeLock.acquire();
return START_NOT_STICKY;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
listener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
mIntent.putExtra("Latitude", location.getLatitude());
mIntent.putExtra("Longitude", location.getLongitude());
if(latTimeArrayList.size() < 10){
latTimeArrayList.add(location.getLatitude() + " -> " + new Date());
}else if(latTimeArrayList.size() == 10){
mIntent.putExtra("latTimeArray", latTimeArrayList);
}
sendBroadcast(mIntent);
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
};
//noinspection MissingPermission
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 100, 0, listener);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0, listener);
}
@Override
public void onDestroy() {
super.onDestroy();
if(locationManager != null){
//noinspection MissingPermission
locationManager.removeUpdates(listener);
wakeLock.release();
}
}
}
private BroadcastReceiver broadcastReceiver;
ArrayList<String> aString = new ArrayList<>();
private String mmtext = "";
TextView debugtext = (TextView) mView.findViewById(R.id.hasCompletedTrack);
int doagain = 0;
@Override
public void onResume() {
super.onResume();
if(broadcastReceiver == null){
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
try{
if (doagain == 0){
aString = (ArrayList<String>)intent.getExtras().get("latTimeArray");
if(aString != null || aString.size() != 0){
for (int i =0; i< aString.size(); i++){
mmtext += aString.get(i) + "\n";
}
doagain = 1;
debugtext.setText(mmtext);
}
}
}catch(NullPointerException e){}