Служба запустилась снова после того, как была убита диспетчером задач

У меня есть различные варианты синхронизации данных между приложением Android и сервером. Я использую AlarmManager для запуска синхронизации с выбором пользователя. У меня есть один, который говорит Never Update (Update Manually), в котором я отменяю toStopServiceAlarm() AlarmManager.

Que:

Он работает нормально, пока мое приложение не будет остановлено каким-либо диспетчером задач. Как только он был убит диспетчером задач, служба приложений снова запустилась с Never Update(Update Manually), где я уже отменил любой триггер AlarmManager.

Может ли кто-нибудь помочь мне сохранить поведение моего приложения, даже если оно было убито диспетчером задач? Синхронизация вызывается только по выбору пользователя.

Фрагмент кода: -

public class ServiceAlarm extends WakefulBroadcastReceiver {

public void onReceive(Context context, Intent intent) {  
Intent service = new Intent(context, UploadData.class); //UploadData is my service
    startWakefulService(context, service);
}

public void startServiceAlarm(String times)
{
 context = SmartConsultant.getApplication().getApplicationContext();
 alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);      
 Intent intent = new Intent(SmartConsultant.getApplication().getApplicationContext(), UploadData.class);
 alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

 Calendar calendar = Calendar.getInstance();
 calendar.setTimeInMillis(System.currentTimeMillis());
 calendar.set(Calendar.HOUR_OF_DAY, 21);
 calendar.set(Calendar.MINUTE, 00);

 switch(Integer.parseInt(times))
 {
  case 0://midnight
            alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent);
  break;
  ... cases for different interval of sync
 }
}

public void toStopServiceAlarm(String times)
{
   if (alarmMgr != null) {
  alarmMgr.cancel(alarmIntent);
 }
}

person Vikalp Patel    schedule 21.04.2014    source источник
comment
Ваша проблема кроется в вашем сервисе, скорее всего. Перезапуск службы — это то, что произойдет, если ваш onStartCommand() вернет что-то вроде START_STICKY или START_REDELIVER_INTENT, и это поведение по умолчанию для IntentService. Вы можете позвонить setIntentRedelivery(false) в onCreate() вашего IntentService, чтобы отключить это.   -  person CommonsWare    schedule 21.04.2014
comment
@CommonsWare My Service extends Service. Я не отменяю onStartCommandin Service. Так должен ли я включать setIntentRedelivery(false) в onCreate()?   -  person Vikalp Patel    schedule 21.04.2014
comment
Так должен ли я включать setIntentRedelivery(false) в onCreate()? -- если вы измените свой сервис на расширение IntentService, да. В противном случае вернуть START_NOT_STICKY из onStartCommand(). Кроме того, убедитесь, что в какой-то момент вы останавливаете службу и одновременно выпускаете WakeLock.   -  person CommonsWare    schedule 21.04.2014
comment
@CommonsWare: Спасибо! Работайте как положено!   -  person Vikalp Patel    schedule 21.04.2014


Ответы (1)


Согласно CommonsWare, мне просто нужно переопределить onStartCommand() с помощью START_NOT_STICKY, что сделает мою службу слабо тесной с Android и не запустится после того, как ее убьет TaskManager. Вот какое поведение ожидается от работающего Service.

Фрагмент кода:

public class UploadData extends Service
{
...
  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub
    super.onStartCommand(intent, flags, startId);
    return START_NOT_STICKY;
    }
}
person Vikalp Patel    schedule 10.05.2014