web-dev-qa-db-ja.com

常に実行中のバックグラウンドサービスを作成する方法

私の質問は、常に実行中のバックグラウンドサービスを作成する方法です。アプリが実行されている限り、バックグラウンドで実行されるIntentServiceを作成しました。ただし、アプリが強制終了されると、サービスも失われます。作成したいのは、常に実行して通知を送信するバックグラウンドサービスを作成することです。 (whatsapp、facebook、またはその他の同様のアプリケーションに似ています。)

通知をクリックすると、アプリケーションも起動するはずです。

どうすればできますか?

9
user3686811

これを行うのに最適なのは、インテントサービスではなくサービスを拡張するカスタムサービスを作成することです。サービスで別のスレッドを開始します。アプリの起動でサービスを開始するさらに重要なのは、オブジェクトにバインドしないことです。オブジェクトが破棄されると、サービスが強制終了されます。次に、onStartCommand()メソッドがSTART_STICKYを返します。サンプルの実装を示します。

public class CustomService extends Service {

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub
    return START_STICKY;
}

@Override
public void onTaskRemoved(Intent rootIntent) {
    // TODO Auto-generated method stub
     Intent restartService = new Intent(getApplicationContext(),
                this.getClass());
        restartService.setPackage(getPackageName());
        PendingIntent restartServicePI = PendingIntent.getService(
                getApplicationContext(), 1, restartService,
                PendingIntent.FLAG_ONE_SHOT);

        //Restart the service once it has been killed Android


        AlarmManager alarmService = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
        alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() +100, restartServicePI);

}

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();

    //start a separate thread and start listening to your network object
}

}

onTaskRemovedは、サービスが強制終了されると100ミリ秒後にサービスを再起動します。 START_STICKYはKitKatでは機能しません。 onTAskRemovedを実装する必要があります。そして、ユーザーがアプリの設定にアクセスしてサービスを停止した場合、もう1つ、サービスを再起動する方法はありません。

11
Preethi Rao

Startコマンドを使用してサービスを開始する必要があります。また、サービスのonStartCommmand関数を書き換える必要があります。

 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("LocalService", "Received start id " + startId + ": " + intent);
        // We want this service to continue running until it is explicitly
        // stopped, so return sticky.
        return START_STICKY;
    }

START_STIKYは、サービスが自動的に再開されることを意味します( http://developer.Android.com/reference/Android/app/Service.html#START_STICKY

StartCommandの代わりにbindService関数を使用すると、サービスが停止し、バインドされたすべてのアクティビティが停止します。

それ以上に、デバイスの起動後にサービスを自動起動する場合は、ACTION_BOOT_COMPLETEDインテントを受信するためにBroadcastReceiverを実装し、サービス開始のためにこのイベントを処理する必要があります。

3
busylee

次のことは、あなたの活動が周りにある限り実行されます。

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

残念ながら、アプリが強制終了され、デバイスのリソースが不足すると、強制終了されます。
ただし、サービスを数日間実行し続けたい場合は、サービスをフォアグラウンドで実行していることを確認してください。

0
Lazy Ninja