6

リモートサービスを作成しました。このサービスは、最初に起動したときにアクティビティによって開始されます。その後、アクティビティは、サービスが再開されないように、サービスが開始されているかどうかを常に確認します。

このサービスは、onCreate関数でいくつかのメソッドを実行します。このサービスは常に実行されており、起動時にも開始されます。

問題(大きな問題ではありませんが、理由を知りたいです)は、アクティビティを停止するとonTaskRemovedが呼び出されてサービスが作成されると、これは正しいですが、数秒後にoncreateメソッドが再度呼び出され、サービスが開始されますまた。

なぜですか?そして、どうすればこれを制御できますか?

<service
        android:name=".Service"
        android:icon="@drawable/ic_launcher"
        android:label="@string/service_name"
        android:process=":update_process" >
</service>

AndroidManifest.xml

if (!isRunning()) {
    Intent service = new Intent(this, UpdateService.class);
    startService(service);
} else {
    //Just to debug, comment it later
    Toast.makeText(this, "Service was running", Toast.LENGTH_SHORT).show();
}

サービスが実行されていなかった場合にサービスが開始されたとき

4

2 に答える 2

9

問題は、サービスがデフォルトでスティッキーであるということです。これは、サービスを停止するように明示的に要求するまで、サービスが強制終了されると再起動されることを意味します。

onStartCommand()サービスのメソッドをオーバーライドして、を返すようにしSTART_NOT_STICKYます。その後、サービスが強制終了されてもサービスは再開されません。

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    return START_NOT_STICKY;
}
于 2014-02-03T08:56:08.657 に答える
7

Bjarkeのソリューションは有効ですが、サービスでリカバリを実行する必要がある場合をカバーする代替ソリューションを提案したいと思います。

AndroidはonStartCommand()、サービスを再起動した後、サービスプロセスが予期せずクラッシュしたことを通知するためにもう一度呼び出しており(タスクスタックが削除されたため)、現在再起動中です。

intentの引数を見ると、onCreate()nullそのような再起動の場合のみ)になります。これは、Androidが、予期せずクラッシュした以前のスティッキーサービスを再作成していることを示しています。

場合によってはNON_STICKY、そのような再起動の場合にのみ戻り、必要なクリーンアップ/リカバリを実行してサービスを停止し、正常に終了することが賢明です。

サービスが正常に開始された場合でも、戻ってくる必要がありSTICKYます。そうしないと、回復を実行するためにサービスが再起動されることはありません。

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    // intent is null only when the Service crashed previously
    if (intent == null) {
        cleanupAndStopServiceRightAway();
        return START_NOT_STICKY;
    }
    return START_STICKY;
}

private void cleanupAndStopServiceRightAway() {
        // Add your code here to cleanup the service

        // Add your code to perform any recovery required
        // for recovering from your previous crash

        // Request to stop the service right away at the end
        stopSelf();
}

もう1つのオプションは、Androidが最初にサービスを強制終了する必要がないように、stopSelf()の一部として(を使用して)サービスの停止を要求することです。onTaskRemoved()

于 2015-07-21T03:29:33.937 に答える