【问题标题】:What happens if I startService from onCreate in Activity, finish() the Activity and then start the app again?如果我从 Activity 中的 onCreate 开始服务,完成() Activity,然后再次启动应用程序,会发生什么?
【发布时间】:2011-10-12 15:59:58
【问题描述】:

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

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

我有一个 Activity,StartupActivity。该活动启动一个服务,然后我按下一个按钮来完成活动。然后我再次启动相同的应用程序/活动,从而再次执行 startService。

但是,我预计 Service 仍然存在(没有调用 onDestroy),但 Service 中的 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 步:我再次启动应用程序,再次执行 Activity 的 onCreate,从而启动相同的服务

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

但是,onCreate 会再次执行。我现在是否同时运行多个服务?

【问题讨论】:

  • 是的,您确实有 2 个服务正在运行。
  • 嗯,我不太确定。现在坐下来测试。与本地 TCP 服务器进行 TCP 连接。最多只建立一个 TCP 连接。此外,现在似乎服务的 onCreate 没有执行两次。只有当我运行调试器时才会发生...
  • 引用自here启动服务的多个请求会导致对服务的 onStartCommand() 的多个相应调用。但是,只需要一个停止服务的请求(使用 stopSelf() 或 stopService())来停止它。 似乎只有一个 Service 实例。
  • 嗯,看起来是这样......我想我在从 Eclipse 调试时感到困惑......有人可以关闭这个问题。或者 slkorolev 可以回答它,我会好的 =)

标签: android service


【解决方案1】:

但是,onCreate 会再次执行。我现在是否同时运行多个服务?

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多