我有一個活動,通過控制後臺服務的啓動和停止。按鈕點擊。當服務沒有運行時,按鈕顯示'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);
}
}
在解除綁定在onPause不停止服務,因爲該服務以startService啓動(我只是無法在活動暫停時與服務進行通信,但服務仍在運行)。 - 我正在尋找實施技巧,因爲我正在尋找設計技巧。 – Igor 2010-12-15 10:28:15