2017-02-22 8 views
0

Я создал службу, которая имеет 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){} 

ответ

0

Я нашел ответ ...

мне пришлось выключить режим PoweSaving на моем Samsung Galaxy S6 краю.

Кроме того, в моем broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) {

, что в моем фрагменте, я сделал некоторые вычисления позиции для каждого обновления местоположения, которое я получил от моей службы с Intent getExtra() (это не в коде я отправил). Однако onReceive() запускается только при включенном экране (не заблокирован). Поэтому мои вычисления в фрагменте никогда не запускались, только когда экран находился на нем, вызвали методы расчета.

Моим решением было обработать все вычисления непосредственно в моем сервисе.