Android:应用程序重新启动后服务未启动

问题描述:

我正面临一些我根本不理解的事情,这可能来自我对Android非常陌生的事实。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

是您的服务清单文件中列出? – bubunyo

+0

是的。这很奇怪,就像我没有及时销毁服务,并且在我重新启动应用程序时不能重新创建 – krakig

+0

如果服务正在运行,则开始对服务进行检查 – bubunyo

你的服务可能不启动由于它已经在运行,由于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."); 
    } 
} 
+0

当我查看日志时,onDestroy()总是被调用。但是服务的onDestroy()会在几秒钟后被调用。这意味着如果我足够快地重新启动应用程序,服务中的onDestroy()不会被调用 – krakig

+0

@krakig - 正确,这就是为什么当您重新启动应用程序时服务仍在运行。 'onDestroy()'方法不是清理代码的好地方,因为这种方式不可预知。还有一系列其他线程和进程,系统正在同时完成,因此您可能会遇到像这样的计时问题。这就是Google正式推荐我在文档中提到的方式的原因。你应该在'onPause()'中调用'stopService'并测试'isFinishing()'。 – NoChinDeluxe

+0

问题在于,当屏幕锁定时(例如,活动触发onPause(),因此这意味着我的服务将无法接收事件),所以我想保持它活动状态。 – krakig