我正在开发一个需要运行前台的服务,用户可以通过活动来打开/关闭它。所以基本上,活动可能被杀死,但只要服务没有被用户停止,服务就是安全的。
但是,我遇到了这个问题:如果服务开启,如何关闭服务?这意味着,如果我的活动被杀死,然后重新启动,那么我没有参考已启动的服务意图来调用stopService
。
以下是我目前的代码。如果用户在同一活动启动服务后调用deactivate,则它可以正常工作。按钮状态始终正确,但当操作系统重新启动我的活动时,this.serviceIntent
为空。
protected boolean isServiceRunning() {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (SynchronizationService.class.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
@Override
protected void onResume() {
super.onResume();
this.togglingByCode = true;
this.butActivate.setChecked(this.isServiceRunning());
this.togglingByCode = false;
}
public void onActivateButtonClick(final boolean pIsChecked) {
if (this.togglingByCode) { return; }
if (pIsChecked) {
this.saveSettings();
this.serviceIntent = new Intent(this, SynchronizationService.class);
this.serviceIntent.putExtra(KEY_WEBSERVICE, this.txtWebService.getText().toString());
this.serviceIntent.putExtra(KEY_PASSWORD, this.txtPassword.getText().toString());
this.serviceIntent.putExtra(KEY_INTERVAL, Integer.parseInt(this.txtRefreshInterval.getText().toString()));
this.serviceIntent.putExtra(KEY_TIMEOUT, this.preferences.getInt(KEY_TIMEOUT, DEFAULT_TIMEOUT));
this.serviceIntent.putExtra(KEY_RETRY, this.preferences.getInt(KEY_RETRY, DEFAULT_RETRY));
this.startService(this.serviceIntent);
} else {
this.stopService(this.serviceIntent);
this.serviceIntent = null;
}
}
请告诉我如何正确停止服务。谢谢。
P.s:我知道制作serviceIntent
static
的伎俩,但我对此并不安全。如果没有任何其他方式,那么我将使用它。
答案 0 :(得分:1)
只需在活动的onCreate中初始化您的serviceIntent ...您可以启动服务,终止活动,重新打开它并使用相同的serviceIntent停止服务。