如果我从Activity中的onCreate启动服务,完成()活动,然后再次启动应用程序,会发生什么?

时间:2011-10-12 15:59:58

标签: android service

我正在试图弄清楚Android在生命周期问题上的工作原理。

我决定使用一个长期运行的服务来保存我的TCP连接和其他东西。

我有一个Activity,StartupActivity。该Activity启动一项服务,然后按一个按钮完成活动。然后我再次启动相同的app / Activity,从而再次执行startService。

但是,我预计服务仍然存在(没有调用onDestroy),但服务中的onCreate方法仍在执行。

为什么?

第1步:在StartupActivit中执行onCreate:

@Override
protected void onCreate(android.os.Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.startup);

    startService(new Intent(StartupActivity.this, SamcomService.class));
    registerReceiver(connectionReceiver, new IntentFilter("STARTUP_PROGRESS_MESSAGE"));
    registerReceiver(connectionReceiver, new IntentFilter("STARTUP_FINISH"));

    final Button button = (Button) findViewById(R.id.buttonExit);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            finish();
        }
    });
}

第2步:我按下按钮,调用Activity.finish()(我返回主屏幕)

第3步:我再次启动应用程序,再次执行活动的onCreate,从而启动相同的服务

现在,当我第二次启动应用程序时,应该运行服务(如何检查?)。我没有看到调用Service onDestroy时显示的Toast,我也看到了服务创建的通知(并删除了onDestroy)。

然而,onCreate第二次执行。我现在有多个服务同时运行吗?

1 个答案:

答案 0 :(得分:7)

  

然而,onCreate第二次执行。我现在有多个服务同时运行吗?

不,我知道这很令人困惑,但startService()方法无法启动该服务。它将在您运行它的服务<​​strong>每次中调用。例如,如果服务未启动,它将启动它然后运行它。如果服务已启动,它将运行它。 android文档说它是这样设计的,因此startService()方法是与服务进行通信的最简单方法。

  

第2步:我按下按钮,调用Activity.finish()(我返回主屏幕)

这取决于您的服务是否与您的活动在同一进程上运行。如果您在清单中的服务声明中有:process =“something”,并且您完成了其他所有操作,则该服务处于另一个流程中,并且只有三种情况会导致您的服务被销毁。 1,你的活动被破坏(几乎保证不会发生,因为你的进程有其活动的活动优先级),2,存在极低的内存,3服务调用selfStop()。

由于finish()不会破坏你的应用程序(Android会将其保留在内存中,用户会回复它),您的服务要么暂停(如果它在同一个进程中),要么仍在运行(如果是在另一个过程中)。无论对startService()的另一个调用是否会重新启动它如果它被暂停并运行服务的startService方法。你只有一个服务。