我有一个活动,通过控制后台服务的启动和停止。按钮点击。当服务没有运行时,按钮显示'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