web-dev-qa-db-ja.com

「AdvancedTaskKiller」のようなアプリによって殺された後にサービスを再起動するにはどうすればよいですか?

'extends Service'というパブリッククラスがあり、このサービスはstartService(...)を使用してアクティビティから起動されます。しかし、 Advanced Task Killer を使用した後、サービスは強制終了され、再起動されることはありません。

Facebook Messenger Android App からそれらを殺した後でも自動的に再起動する Advanced Task Killer ...のようないくつかのアプリに気づきました... Facebook/Twitterアプリはそれをやっていますか?

enter image description here

11
user1406716

別のプロセスによって強制終了された後にサービスを自動的に再起動する場合は、サービスで次の定数を使用できます。

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

START_STICKYとSTART_NON_STICKYの詳細については、次のURLをご覧ください。

START_STICKYおよびSTART_NOT_STICKY

また、より具体的な回答のためにコードを提供してください。

10
GDroid

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で)にこのコードを実行できますが、既に実行されているかどうかを確認する必要があるため、このコードを起動するよりも、ブロードキャストレシーバーを作成した方がよいでしょう。システムの再起動。

12
Carlos Robles

サービスのonStartCommand()を返す 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;
2