私はバックグラウンドサービスの開始と停止を制御するアクティビティを持っています。ボタンをクリックします。サービスが実行されていないときにボタンに「START SERVICE」と表示され、サービスが実行されているときにボタンに「STOP SERVICE」と表示されます。ロジックは、ボタンのクリックで何が起こるべきか、同じ方法でトグルします(サービスが実行されていない場合は、ボタンをクリックして開始し、それをバインドして停止し、サービスが実行されている場合は停止します)。Androidバックグラウンドサービスの状態情報
詳細については、コードの抜粋をご覧ください。
バインドおよびサービスは、現在だけSTOPサービスボタンによって停止させることができますが、私はonPauseでサービスのバインドを解除し、onResumeでそれを再バインドしてい
をバインド解除。これは理にかなっていますか? onPauseとonResumeのライフサイクルメソッドはかなり頻繁に呼び出されるため、バインディングやバインドのオーバーヘッドが多いですが、アプリケーションが強制終了する前にonPauseが常に呼び出されるため、これはサービスバインディングを解放してリークを避けるための最良の場所です。
BACKボタン
私はまた、BACKボタンを押したときに何をすべきかわかりません。戻るボタンを押したときにサービスがバックグラウンドで実行されている必要がありますか(Android Musicアプリケーションと同じ動作)?はいの場合は、サービスが実行されている情報を維持する適切な方法は何でしょうか(onSaveInstanceStateがBACKボタンを押しても呼び出されない場合は、アプリケーションの状態を持続させる最もクリーンな方法isServiceRunning boolean variable)?この情報は、アクティビティが再び開始されるときに、(バックグラウンドサービスの状態に関して)開始/停止ボタンに正しいテキストを設定するために必要です。可能な代替手段の1つは、サービス状態情報(isServiceRunning)を保存せずにアクティビティを正常に終了できるようにすることです。 ActivityManagerからonCreateでこの情報を得ることができました。ここで実行中のサービスを問い合わせることができます。
一方、BACKボタンでサービスを停止する必要がある場合は、サービスの停止をどこで実行する必要がありますか? onDestroyはこの質問に対する自然な答えですが、onDestroyもアクティビティの再起動を要求されています(たとえば向きの変更など)、その場合にサービスを停止する必要はありません。
public class ServiceController extends Activity {
public void onStartClick(View v) {
if (!isServiceRunning) {
button.setText("STOP");
isServiceRunning = true;
startService(...)
bindService(...)
} else {
button.setText("START");
isServiceRunning = false;
unbindService(...)
stopService(...)
}
}
@Override
protected void onResume() {
super.onResume();
if (isServiceRunning) {
button.setText("STOP");
bindService(...);
}
}
@Override
protected void onPause() {
super.onPause();
if (mBoundAccService != null) {
unbindService(...);
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState != null) {
isServiceRunning = savedInstanceState.getBoolean(ID_SERVICE_RUNNING);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(ID_SERVICE_RUNNING, isServiceRunning);
}
}
アンバインドは、サービスを停止しませんstartServiceで開始されます(アクティビティが一時停止している間はサービスと通信できませんが、サービスは実行中のままです)。 - 私は設計のヒントを探しているので、実装のヒントについてはあまり見ていません。 – Igor