2010-12-14 110 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