Android应用程序类生命周期

我正在处理的Android应用程序覆盖Application类来存储轻量级状态(用户名,gps位置等)在静态variables中。 这个状态的大部分是在启动活动的OnCreate中设置的(从prefs,位置侦听器运行中检索的用户名)。 依靠启动活动来初始化应用程序类是否安全? 是否有任何情况下应用程序类可能会重新创build没有启动活动也被创build?

这个问题出现了,因为我碰到一个空指针exception,在手机睡了几个小时之后(在手机进入睡眠状态前应用程序被留在前台),在应用程序类中访问一个variables以恢复应用程序。 是否有可能在电话进入睡眠状态并唤醒电话的过程中死亡,应用程序类重新创build,堆栈中的顶级活动恢复,但启动activity.onCreate未运行,因此Application类没有初始化?

请注意,我试图通过强制应用程序停止使用设置/pipe理应用程序来testing这些情况。 但是,我无法重现这个问题。 在下一次运行中,将创buildApplication类,然后是启动activity.onCreate。

假设应用程序类实例只要进程存在就可以安全地存在,并且在创build应用程序类时等同于“重新启动”应用程序。 从一个新的活动堆栈开始(堆栈上的第一个活动是启动活动)?

不可以。您的整个应用程序可以被完整地删除并重新创build任务堆栈; 这使得系统能够在需要的设备上回收内存,同时仍然向最终用户呈现多任务的无缝幻觉。 从文档:

后台活动(对用户不可见且已暂停的活动)不再重要,因此系统可以安全地终止其进程以回收其他前台或可见进程的内存。 如果它的进程需要被终止,当用户导航回到活动(使其再次在屏幕上可见)时,其onCreate(Bundle)方法将使用先前在onSaveInstanceState(Bundle)中提供的savedInstanceState调用,以便它可以在用户最后一次离开它的状态下重新启动。

也就是说,应用程序绑定到的进程可以被closures,但是之后重新启动,并且单独的活动应该有足够的信息来从死前保存的内容中重新创build自己,而不依赖于设置的全局状态由其他活动处理。

考虑在SharedPreference或SQLite数据库中存储需要由Activity初始化的持久共享状态,或者将其作为Intent额外的需要将其传递给活动。

您可以通过killing the process正在运行的应用程序killing the process来testing场景。

第1步。打开您的应用程序,然后按Homebutton将其隐藏到后台。

第2步。调用adb shell

第3步。input命令su (必须获得ROOT权限才能杀死进程)

步骤ps (列出所有正在运行的进程ID并find你的)

第5步。 kill 1234 (假设你的应用程序运行在进程1234上)

第6步。然后,返回到您的设备,再次点击启动图标。 您可能会发现活动堆栈上的最后一个活动重新打开。 您也可能会为该活动调用onRestoreInstanceState()方法。

简而言之:在YourApplication.onCreate执行YourApplication.onCreate ,而不是一些LaunchActivity

要检查的文档:
– 进程和线程
– API指南>活动

依靠启动活动来初始化应用程序类是否安全?

是的,只要你记得应用程序可以存在更长的活动和活动可能会被杀死和重新创build。 我不确定什么意图会复活活动得到:发射或查看(对于情景当活动死亡过重,而有长期运行的服务绑定到应用程序)

是否有任何情况下应用程序类可能会重新创build没有启动活动也被创build?

是的,如果最后一个可见的活动不是LaunchActivity
检查Android应用程序生命周期和使用静态

是否有可能在电话进入睡眠状态并唤醒电话的过程中死亡,应用程序类重新创build,堆栈中的顶级活动恢复,但启动activity.onCreate未运行,因此Application类没有初始化?

如果有几个不同的活动发起A,B,C和他们整个过程被杀害,那么我认为Android操作系统是好的,只创build应用程序和C活动,而A和B将被重新访问,即返回他们。

假设应用程序类实例只要进程存在就安全了,

当创build应用程序类时,它相当于“重新启动”应用程序,即。 从一个新的活动堆栈开始(堆栈上的第一个活动是启动活动)?

我不确定什么时候重新启动发射活动会先被调用,
但最后一个,即用户应该看到的那个。

“我遇到了一个空指针exception访问应用程序类中的variables恢复应用程序”

检查此链接.. http://www.developerphil.com/dont-store-data-in-the-application-object/