我面对的是一些我根本不懂的东西,这可能来自于我对Android很新的事实。
我启动了一个创建服务的简单活动。这里没有魔力。当我启动应用程序时,一切正常。但是如果我杀了它并在几秒钟内再次启动它,我的服务就无法启动(我在服务的OnCreate()方法上添加了一个日志,并且没有显示任何内容)。
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.d(TAG, "ON CREATE");
s_instance = this;
registerReceiver(deviceEventReceiver, new IntentFilter("com.horizon.watch.moto360.receiveDeviceEvent"));
setContentView(R.layout.activity_main);
//Launch default home page
defaultHomePage = (FrameLayout) findViewById(R.id.defaulthomepage);
defaultHomePage.setVisibility(View.VISIBLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
startService(new Intent(this, WearMessageListenerService.class));
}
@Override
protected void onDestroy() {
Log.d(TAG, "ON DESTROY");
stopService(new Intent(this, WearMessageListenerService.class));
unregisterReceiver(deviceEventReceiver);
super.onDestroy();
}
答案 0 :(得分:1)
由于onDestroy()
未被调用,您的服务可能无法启动,因为它已在运行。
来自onDestroy()docs:
注意:不要指望将此方法称为保存地点 数据!例如,如果活动正在编辑内容中的数据 提供者,这些编辑应该在onPause()或 onSaveInstanceState(Bundle),不在这里。这种方法通常是 实现释放资源,如与线程相关联的线程 活动,以便被破坏的活动不会留下这样的东西 当其余的应用程序仍在运行时。 有 系统将简单地杀死活动的主机的情况 进程中没有调用此方法(或任何其他方法),所以它 不应该被用来做那些打算留下来的东西 过程消失后。
另外,你说你"杀死"你的应用。我认为你的意思是你使用任务管理器关闭应用程序。这可能是导致onDestroy()
未被调用的原因,因此您的原始服务可能不会被停止(如您问题的评论中所述)。如果您的应用调用了onDestroy()
,则finish()
方法才能确保被调用。你可以测试一下。
在onPause()
方法中,您可以致电isFinishing()
来测试您的应用是否只是暂停,或者是否实际上已经完成。如果它实际上正在完成,您可以将stopService()
电话放在那里以实际停止服务。
编辑:回应以下评论......
这就是您如上所述实现onPause()
方法的方法......
@Override
protected void onPause() {
super.onPause();
if(isFinishing()) {
Log.d("APP SHUTTING DOWN", "The app is shutting down and the service should be stopped.");
stopService(new Intent(this, WearMessageListenerService.class));
unregisterReceiver(deviceEventReceiver);
} else {
Log.d("APP PAUSING", "The app has moved to the background, but is still active. The service should continue running.");
}
}