[英]Android : service not being launched after app restart
我面临的是我完全不了解的事情,这可能是由于我是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();
}
由于未调用onDestroy()
,您的服务可能已启动,因为它已经在运行。
从onDestroy()文档中:
注意:不要指望此方法被称为保存数据的地方! 例如,如果活动正在内容提供商中编辑数据,则这些编辑应在onPause()或onSaveInstanceState(Bundle)中提交,而不是在此处提交。 通常实现此方法以释放与活动相关联的线程之类的资源,以使被破坏的活动不会在其其余应用程序仍在运行时留下这些东西。 在某些情况下,系统会简单地终止活动的托管过程,而无需在其中调用此方法 (或任何其他方法 ),因此不应将其用于处理在过程消失后仍然存在的事情。
另外,您说您“杀死”您的应用程序。 我假设您的意思是您使用任务管理器关闭该应用程序。 这可能是为什么您的onDestroy()
没有被调用的原因,因此您的原始服务很可能没有被停止(如问题注释中所述)。 仅在您的应用程序上调用finish()
情况下,才能真正保证调用onDestroy()
方法。 您可以对此进行测试。
在您的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.");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.