24

アクティビティによって開始される (バインドされない) サービスがあります。アクティビティが破棄された場合 (たとえば、戻るボタンを押すことによって)、サービスは引き続き実行されます。これはもちろん意図されたものです。ただし、「最近のアプリ」リストからアクティビティをスワイプすると、サービスがすぐに再起動されます。これは再現可能です。アクティビティ/アプリがリストからスワイプされるたびに、サービスの onCreate メソッドが新たに呼び出されます。間に onDestroy を呼び出す必要はありません。

最初に、サービスがAndroidによって強制終了されると思いましたが、強制終了の理由がわかりませんでした(アクティビティもサービスもリソースを消費することはありません。実際、それらは最小限で何もしません)。しかし、その後、サービスが実際にクラッシュすることに気付きました。

V/MainActivity(856): onDestroy // swipe out of the list
I/ActivityManager(287): Killing 856:com.example.myapp/u0a10050: remove task
W/ActivityManager(287): Scheduling restart of crashed service com.example.myapp/.TestService in 5000ms

コードは注目に値するものではありませんが、ここにあります

アクティビティ:

public class MainActivity extends Activity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.v(TAG, "onCreate, starting service...");
        startService(new Intent(this, TestService.class));
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.v(TAG, "onStart");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.v(TAG, "onDestroy");
    }

    //[...]
}

サービス:

public class TestService extends Service {

    private static final String TAG = "Service";

    // onBind omitted

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.v(TAG, "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.v(TAG, "onDestroy");
    }

}

要するに、私のサービスはアクティビティのライフサイクルから独立していますが、最近のアプリのリストからアプリをスワイプしない限りのみです。その場合、サービスは再開されますが、onDestroy は呼び出されません。

これが発生するたびに、サービスの状態だけでなく、サービスが行っている作業も失われます。スワイプがこれの理由である理由を知りたいだけです。

4

4 に答える 4

0

マニフェストで定義されているブロードキャスト レシーバーに問題がある可能性があります。

アプリケーションレベルでマニフェストにレシーバー/インテントフィルターが定義されていますか? 私は同じ種類の問題を抱えていましたが、それはアプリケーションレベルのマニフェストで宣言されたレシーバーが原因でした

于 2013-12-11T11:07:34.230 に答える