Android:应用重启后服务未启动

时间:2015-10-22 19:32:25

标签: 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();
}

1 个答案:

答案 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.");
    }
}