Как перезапустить службу после того, как ее убили приложения, такие как "Advanced Task Killer"?

У меня есть открытый класс, который "расширяет службу", и эта служба запускается из активности с использованием startService (...). Но после того, как я использую Advanced Task Killer, служба будет убита и больше никогда не будет перезапущена.

Я заметил, что некоторые приложения, такие как Facebook Messenger Android App перезапускаются автоматически, даже убив их из Advanced Task Killer... как это делают приложения facebook/twitter?

enter image description here

Ответ 1

Если вы хотите перезапустить службу автоматически после того, как ее убили другим процессом, вы можете использовать следующие константы в своей службе,

@Override
public int onStartCommand(Intent intent, int flags, int startId) { 
    return START_STICKY;
}

Дополнительную информацию о START_STICKY и START_NON_STICKY можно найти в разделе

START_STICKY и START_NOT_STICKY

Также укажите свой код для более конкретного ответа.

Ответ 2

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

Calendar cal = Calendar.getInstance();

Intent intent = new Intent(this, MyService.class);
PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);

AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
// Start every minute
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 60*1000, pintent); 

Вы можете запустить этот код, когда пользователь запустит приложение (то есть в oncreate из первого действия), но вы должны проверить, выполнено ли это, так что, вероятно, будет лучше, если вы создадите широковещательный приемник, чем запускаете этот код при перезагрузке системы.

Ответ 3

Сделайте onStartCommand() в вашей службе return START_STICKY

  /**
     * Constant to return from {@link #onStartCommand}: if this service's
     * process is killed while it is started (after returning from
     * {@link #onStartCommand}), then leave it in the started state but
     * don't retain this delivered intent.  Later the system will try to
     * re-create the service.  Because it is in the started state, it will
     * guarantee to call {@link #onStartCommand} after creating the new
     * service instance; if there are not any pending start commands to be
     * delivered to the service, it will be called with a null intent
     * object, so you must take care to check for this.
     * 
     * <p>This mode makes sense for things that will be explicitly started
     * and stopped to run for arbitrary periods of time, such as a service
     * performing background music playback.
     */
    public static final int START_STICKY = 1;