2010-12-14 18 views
0

私はバックグラウンドサービスの開始と停止を制御するアクティビティを持っています。ボタンをクリックします。サービスが実行されていないときにボタンに「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); 
} 
    } 

答えて

0

まず、私はonPause()のバインド解除の概念を理解できませんでした。これを行うと、サービスが開始され、アクティビティが停止します(これは、サービスが本質的にアクティビティであることを意味します)。

これは私のアプリケーションがしたものです。

ユーザーが(明らかに)アクティビティから開始を選択すると、サービスは次のコードで開始されました。

startService(新しいインテント(this、MyService.class));

、ユーザーが(同じボタンまたは他のボタンのいずれか)

stopService(新しいテント(これ、MUMServiceを停止]を選択したとき。クラス));

サービスクラスでは、サービスプロセスを制御するためにonStartメソッドとonDestroyメソッドを実装しました。

@Override

パブリックブールonKeyDownメソッドを、私は戻るボタンを無効にすることはありませんでした(これは、Androidで推奨されて)いますが...必要であれば、ここでのコードは、(あなたの活動に)ありますINTキーコード、のKeyEventイベント){

(のkeyCode == KeyEvent.KEYCODE_BACK場合)サービスので{onPauseで

+0

アンバインドは、サービスを停止しませんstartServiceで開始されます(アクティビティが一時停止している間はサービスと通信できませんが、サービスは実行中のままです)。 - 私は設計のヒントを探しているので、実装のヒントについてはあまり見ていません。 – Igor

関連する問題