2

すべてのアクティビティに共通の動作を実装するベース アクティビティ クラスがあります。それらはすべて、この BaseActivity を拡張します。

BaseActivity の onStart メソッドでサービスにバインドし、onStop メソッドで条件付きでバインドを解除しています。条件付きとは、ユーザーが選択したオプションに応じて、アプリがバックグラウンドになったときにサービスをバックグラウンドで実行し続ける必要があるかどうかを意味します。

問題は、サービスが実行されるべきではないときに実行し続けることがあることです (これは、サービスを強制終了するオプションが有効になっていて、unbindService() が効果的に呼び出されている場合です)。

アクティビティが変更されるたびに、サービスのバインドが解除され、再びバインドされると考えています。バインドされたサービスは参照カウントされるため、私のサービスはバインドされていない回数よりも多くバインドされている可能性があります。

さらに、ドキュメントにはそれについて次のように書かれています。

通常、クライアントのライフサイクルの立ち上げと破棄の瞬間に一致するときに、バインドとバインド解除をペアにする必要があります。例えば:

アクティビティが表示されている間だけサービスと対話する必要がある場合は、onStart() 中にバインドし、onStop() 中にバインド解除する必要があります。

アクティビティがバックグラウンドで停止している間でも応答を受信したい場合は、onCreate() 中にバインドし、onDestroy() 中にバインド解除できます。これは、アクティビティがサービスを実行している間 (バックグラウンドであっても) サービスを使用する必要があることを意味することに注意してください。そのため、サービスが別のプロセスにある場合は、プロセスの重みを増やすと、システムが停止する可能性が高くなります。それを殺します。

私は両方のオプションを実装しようとしているので、これを実装するための最良のアプローチは何ですか?

4

1 に答える 1

0

最後に、アプローチを変更startService()し、ローカル ブロードキャスト レシーバーを使用してサービスのみを使用し、通信することにしました。

でサービスを開始し、Base ActivityonCreate()のメソッドで停止します。onDestroy()次に、サービスからアクティビティにメッセージを送信するには、次のようにします。

private void sendBroadcastMessage(String msg) {
    Log.d(LOG_TAG, "send broadcast message: " + msg);
    Intent intent = new Intent(MyService.class.getSimpleName());
    // Add data
    intent.putExtra("message", msg);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

次に、アクティビティで通知されるようにします。

// handler for the events launched by the service
private BroadcastReceiver mMyServiceReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Extract data included in the Intent
        String message = intent.getStringExtra("message");
        Log.d(LOG_TAG, "Got message: " + message);
        // Do stuff...
    }
};

レシーバーをアクティビティーに登録するには、次のようにします。

@Override
public void onResume() {
    super.onResume();

    LocalBroadcastManager.getInstance(this).registerReceiver(mMonitorReceiver,
          new IntentFilter(MyService.class.getSimpleName()));
}
于 2013-04-29T07:32:28.563 に答える