2010-12-14 69 views
0

我有一個活動,通過控制後臺服務的啓動和停止。按鈕點擊。當服務沒有運行時,按鈕顯示'START SERVICE',當服務運行時按鈕顯示'STOP SERVICE'。邏輯上,點擊按鈕時會發生什麼,以相同的方式切換(如果服務沒有運行,我們啓動它並在按鈕單擊時將其綁定,如果服務正在運行,我們將其停止並解除綁定)。Android後臺服務狀態信息

請看下面的代碼摘錄,瞭解更多信息。

綁定和取消綁定

雖然該服務目前只能可以通過停止服務按鈕停止了,我在解除綁定的的onPause服務,並重新綁定的onResume它。這有意義嗎? onPause和onResume生命週期方法經常被調用,所以這是很多綁定和解除綁定的開銷,但是因爲在應用程序被終止之前總是調用onPause,所以我認爲這是釋放服務綁定並避免泄漏的最佳位置。

BACK按鈕

我也不能確定按下BACK按鈕時該怎麼做。按下「返回」按鈕時服務是否仍然在後臺運行(與Android音樂應用程序中的行爲相同)?如果是的話,什麼是正確的方式來堅持信息,該服務正在運行(因爲onSaveInstanceState沒有得到調用BACK按鈕按下我想知道什麼是最乾淨的方式來堅持應用程序的狀態 - 在我的情況下isServiceRunning布爾變量)?當活動再次開始時,我需要這些信息在開始/停止按鈕(相對於後臺服務的狀態)中設置正確的文本。一種可能的選擇也是允許活動正常完成而不保存任何服務狀態信息(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

首先..我不明白unbinding onPause()的概念。如果你這樣做,服務將開始並停止你的活動(這也意味着服務本質上是一項活動)。

這是我的應用程序做的。

當用戶選擇從(明顯)活動開始時,服務已使用以下代碼開始。

startService(new Intent(this,MyService.class));

而當用戶選擇停止(無論是同一個按鈕或其他按鈕)

stopService(新意圖(此,MUMService。類));

在Service類上,我實現了onStart和onDestroy方法來控制服務進程。

我沒有覆蓋後退按鈕(這是由Android氣餒),但如果你需要可以..這裏是代碼(在你的活動)

@覆蓋

公共布爾的onkeydown( INT的keyCode,KeyEvent的事件){

如果(的keyCode == KeyEvent.KEYCODE_BACK){

+0

在解除綁定在onPause不停止服務,因爲該服務以startService啓動(我只是無法在活動暫停時與服務進行通信,但服務仍在運行)。 - 我正在尋找實施技巧,因爲我正在尋找設計技巧。 – Igor 2010-12-15 10:28:15