3

私のアプリには、Application サブクラスの onCreate() で startService() を介して開始されるスティッキー サービスがあります。次に、そのサービスにバインドして対話します。ここではすべて問題ないようです。アプリを終了 (finish()) するか、ホーム キーを押してアプリに戻ったときに、バックグラウンドで実行されている同じサービスに再接続できます。

しかし、私を困惑させる使用例が 1 つあります。ホームキーを押して、他のアプリを起動したり、YouTube を見たりすると、しばらくすると、アプリケーションが再作成された (onCreate() が呼び出された) ことをログで確認できますが、これは問題ありません。しかし、今同じサービスにバインドしようとすると、サービスも再作成され (コンストラクターが呼び出され)、新しいインスタンスが取得されますが、チェックしていて、古いサービスがまだ実行されていると確信しています。既に実行されているサービスで処理されているデータが必要なため、これはユース ケースを壊します。

bindService() は既存のサービスにバインドし、それが実行されていない場合にのみ作成することになっていませんか? 新しいインスタンスが作成されるのはなぜですか? また、一般的に、このユース ケース (バックグラウンドでアプリケーションが再作成される) のフローはどこに記述されていますか?

PSもう1つの奇妙なことは、古いサービスのonDestroy()が呼び出されないことです。

コンテキストの Application クラスのコードを次に示します。

@Override
public void onCreate(){
    super.onCreate();
    Intent intent = new Intent(getContext(), MyService.class);
    if(!isMyServiceRunning()){
        getContext().startService(intent);
    }
    getContext.bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
}

private boolean isMyServiceRunning() {
    ActivityManager manager = (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (MyService.class.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}
4

1 に答える 1

2

アプリをサービス セットの 1 つのインスタンスに接続する場合

android:singleUser="true"

AndroidManifest.xml のサービスの説明。このフラグが true に設定されている場合、このコンポーネントの単一のインスタンスがすべてのユーザーに対して実行されることを意味します。

また、使用する場合に役立つ場合があります

android:stopWithTask="false"

これは、アプリのタスクが破棄された場合でも、サービスがアクティブなままであることを意味します。

于 2014-02-25T15:04:22.573 に答える