【问题标题】:Can I startService from Application#onCreate()?我可以从 Application#onCreate() 开始服务吗?
【发布时间】:2011-08-26 00:40:26
【问题描述】:

我想在我的应用程序从任何组件初始化时启动服务。

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        startService(new Intent(getApplicationContext(), MyService.class)); 
    }
}

服务是否在onCreate() 状态下可用? super.onCreate() 会初始化 AndroidManifest.xml 中注册的 Application 的所有组件吗?

我可以在我的galaxy中运行这段代码,但我不能确保它会在所有设备和平台上运行,我找不到任何关于Android APP初始化的文档。

【问题讨论】:

  • 在这种情况下,我们如何才能将 Service 对象返回到 Application... 以及从哪里调用 onBind ?

标签: service oncreate android


【解决方案1】:

是的,您可以按照您的方式在onCreate() 中启动服务。但不能保证服务会成功启动 - 只要服务存在于设备上并且能够运行,它就会成功。 super.onCreate() 不做任何从应用程序中启动服务所需的准备工作。 “服务是否在 onCreate() 状态下可用”是什么意思?

【讨论】:

  • 该服务来自我的应用程序,所以它肯定存在。 “服务是否在 onCreate() 状态下可用”是指服务是否准备好在 Application#onCreate() 中启动(而不是 Activity#onCreate())。
  • 服务将准备好启动。 onCreate 不需要在服务可以启动之前运行(即 onCreate 不会执行从应用程序加载服务所需的类加载)。
【解决方案2】:

简而言之,Context.startService() 是的,但文档还说,如果它返回 null,则服务不可用。

如果服务正在启动或已经在运行, 返回实际启动服务的 ComponentName;别的 如果服务不存在,则返回 null

此 API 不会因设备而异,因此您可以对自己在模拟器和设备上的体验充满信心。需要注意的是,需要“大量”资源的服务可能会有不同的行为,即 CPU 时间或内存等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-28
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2013-04-03
    相关资源
    最近更新 更多