应用程序类是否保证在调用定义的引导接收器之前被实例化

8
对于这样一个基础的问题,十分抱歉。我知道当我的应用程序进程启动时,Application类会被实例化,而且我也明白当手机完成启动后,我的引导接收器将被调用。我假设由于手机通过清单知道我的应用程序具有BOOT_COMPLETED意图过滤器,重启过程就是这样的:手机重新启动,手机启动所有带有BOOT_COMPLETED的进程,手机触发BOOT_COMPLETED广播。我的担忧是想知道如果我在引导接收器中引用了Application类实例变量,是否会在Application类实例化之前调用接收器。

再次抱歉,如果这很明显,我从来没有完全理解过重启机制。

2个回答

7

应用程序始终在其任何活动/服务/接收器之前启动。以下是一些详细信息的博客:

[编辑]

但是,根据@CommansWare的评论:

根据日志记录,ContentProvider的实例是在Application的实例之后创建的。然而,在Application的onCreate()之前调用ContentProvider的onCreate()。

因此,在提供程序的onCreate()中尝试使用Application实例可能不安全。


也许我错过了,但我没有看到博客文章支持你的说法。例如,在第一篇文章中只出现了一次字符串“provider”,在第二篇文章中根本没有出现。第一篇文章中对“provider”的使用仅仅是定义了它的含义。同样,第一篇文章中使用了更通用的术语“component”,而第二篇文章中没有使用,也没有说明任何组件是在Application之前创建的。虽然两篇博客文章都提到了“application”,但我没有看到任何证据表明这些引用指的是Application实例,而是指“应用程序”的长形式“app”。 - CommonsWare
2
@CommonsWare的博客第二篇文章中提到:“此方法调用makeApplication()方法,该方法将应用程序特定的类加载到内存中。” 为了更清楚地了解makeApplication的代码,请查看makeApplication的代码,我们可以看到它返回一个Application实例。另外,问题甚至没有问到providers,但为了让你高兴 :-),我已经编辑了我的答案以删除那个词。 - cybersam
2
我同意你的编辑。ContentProvider 实际上是一个混合包。根据日志记录,ContentProvider 的实例是在 Application 的实例之后创建的。然而,在 ApplicationonCreate() 之前会调用 ContentProvideronCreate() - CommonsWare
非常有趣。因此,ContentProvider 不能依赖于存在 Application 实例的窗口。感谢您的准确表述。我已在我的答案中引用了您。 - cybersam

4

手机重新启动后,会触发BOOT_COMPLETED广播,然后正常的广播处理过程会进行,包括启动任何必要的进程。

我更倾向于这样表述:"手机重新启动后,会触发BOOT_COMPLETED广播,然后开始进行正常的广播处理过程,包括启动任何必要的进程。"

我的疑虑是如果我在启动接收器中引用应用程序类实例变量,那么接收器是否会在我的应用程序类被实例化之前被调用。

不应该会出现这种情况。实例化的顺序应该是:

  • 您在清单文件中定义的任何ContentProviders,然后

  • Application实例,然后

  • 触发进程需求的组件(在这种情况下,是您的ACTION_BOOT_COMPLETED BroadcastReceiver


谢谢你,CommonsWare。你有没有在d.android.com上讨论这个的链接? - Captain Kirk
2
@user1701153:我不知道在d.android.com上是否谈论了这个。这是你在Android上工作8年后,通过监测Google工程师的评论等方式获得的经验。 - CommonsWare
我已经添加了一个答案,并附上了几个链接,这些链接来自于曾在“高通Android性能团队”工作的人的博客。 - cybersam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接