2014-11-27 4 views
2

Я работаю с сервисом, который позволяет экономить GPS LatLng-х продолжительнуюAndroid: Служба перезапуска автоматически

Но много раз служба становится перезапущен автоматически, что приводит к потере данных ...

так там любой способ, которым мы можем ограничить сервис от перезапуска. или любая идея, чтобы устранить эту проблему.

+0

эй я думаю, вы должны начать нить в вашу службу, которые работают для бесконечного времени. поэтому из этой парадигмы вы можете добиться того, что ваша служба не будет перезагружаться или не будет закрыта в любое время. просто запустите 1 поток в свою службу и в этом потоке запустите цикл, который запускает бесконечное время и выполняет вашу работу в этом цикле. –

ответ

1

Вы можете создать новый процесс для обслуживания, упоминая его в файле Manifest в

android:process=":newservice" 

Внутри тега службы

1

Вы можете сделать пару вещей. 1) отсоедините все компоненты жизненного цикла пользовательского интерфейса, предпочтительно переключите службу на: удаленный процесс, используя манифест. Таким образом, если ваша активность выйдет из строя/будет убита, ваш сервис останется незатронутым, потому что они были на разных процессах. Посмотрите на андроид IPC (простой способ обмена данных между вашей деятельностью и этой услугой, когда на другом процессе, чтобы использовать сокеты на локальном хосте)

<service 
    android:name="myName.GPS" 
    android:enabled="true" 
    android:exported="false" 
    android:process=":remote"> 
</service> 

2) сделать его обслуживание высокого приоритета переднего плана (это создаст постоянное уведомление)

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     //retrieve persisted data here 
     final Intent i = new Intent(this, ClassNameOfService.class); 
     i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     final PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0); 
     final NotificationCompat.Builder note = 
       new NotificationCompat.Builder(this) 
         .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.icon)) 
         .setSmallIcon(R.drawable.icon) 
         .setContentTitle("GPS Running") 
         .setOngoing(true) 
         .setContentIntent(pi); 
     startForeground(10001, note.build()); //replace 10001 with whatever id you like 
     return super.onStartCommand(intent, flags, startId); 
    } 

3) ручка onLowMemory, OnDestroy и т.д., изящно, так что вы можете перезапустить службу. Вы можете использовать общие привилегии или создавать базу данных sql для сохранения ваших данных в зависимости от того, что вам подходит. Ваша служба будет убита в какой-то момент. Поэтому лучше иметь стратегию сохранения.

@Override 
    public void onDestroy() { 
    //persist your data here 
     super.onDestroy(); 
} 
1

Но много раз служба становится перезапущен автоматически, что приводит к потере данных ...

если единственная проблема у вас есть «потери данных», то вы можете хранить все, данных, которые вам нужны в одном из persistent ways. например, хранить его (база данных SQLite, SharedPreferences)

так можно каким-либо образом ограничить службу перезагрузкой.

при условии, что у вас есть веские причины, чтобы сделать так, что я считаю, это не так - есть способ start service as a foreground service (это расслоение службы с постоянной undissmisable видимой Notification) при запуске переднего плана обслуживания - систем дает ему гораздо больше приоритета - и не убьет его, если у него действительно нет какой-либо доступной памяти для запуска текущего приложения переднего плана.

также у меня есть вырубка, что ваше местоположение, получающее реализацию, не самое лучшее подход - если ваше приложение должно получать периодические обновления местоположения, тогда вы должны использовать Google Play location services. вы можете использовать этот API с обратным вызовом PendingIntent, который пробудит вашу услугу (и весь процесс, если она остановится системой) каждый раз, когда обновления локализованы на основе параметров, которые вы ему предоставили. если вы будете использовать этот API, вам не нужно будет беспокоиться о случаях остановки вашего сервиса, потому что процесс Google Play Services пробудит ваш сервис каждый раз, когда он уведомит вас о появлении нового местоположения.

Смежные вопросы