Pat*_*len 57 lifecycle stack android android-activity
我正在处理的Android应用程序覆盖了Application类,以在静态变量中存储轻量级状态(用户名,gps位置等).此状态的大部分是在启动活动的OnCreate中设置的(从prefs检索的用户名,位置监听器运行).依赖启动活动来初始化Application类是否安全?是否有任何情况下可能会重新创建Application类而不会创建Launch活动?
问题出现了,因为我遇到了一个空指针异常,在手机处于睡眠状态几个小时之后恢复应用程序时访问应用程序类中的变量(应用程序在手机进入睡眠状态之前留在前台).是否可能在手机处于睡眠状态时杀死该进程,并且在唤醒手机时,重新创建了Application类,堆栈中的顶级活动已恢复,但启动的activity.onCreate未运行,因此Application类没有初始化?
请注意,我试图通过强制应用程序停止使用设置/管理应用程序来测试这些类型的方案.但是,我无法重现问题.在下一次运行时,将创建Application类,然后启动activity.onCreate.
假设Application类实例与进程一样存在,并且在创建Application类时,它等同于"重新启动"应用程序即可.从一个新的活动堆栈开始(堆栈上的第一个活动是启动活动)?
Yon*_*lan 20
不可以.完整的任务堆栈可以杀死并重新创建整个应用程序; 这使得系统可以在需要它的设备上回收内存,同时仍然向最终用户呈现多任务的无缝错觉.来自文档:
后台活动(用户不可见且已暂停的活动)不再重要,因此系统可以安全地终止其进程以回收其他前台或可见进程的内存.如果需要杀死它的进程,当用户导航回活动(再次在屏幕上显示)时,将使用之前在onSaveInstanceState(Bundle)中提供的savedInstanceState调用其onCreate(Bundle)方法,以便它可以在用户上次离开的状态下重启自己.
也就是说,进程(应用程序所依赖的进程)可以被终止,然后重新启动,并且各个活动应该有足够的信息来重新创建自己在被杀之前保存的内容,而不依赖于设置中的全局状态.其他活动的过程.
考虑存储持久共享状态,该状态需要由SharedPreference或SQLite数据库中的Activity进行初始化,或者将其作为Intent extra传递给需要它的Activities.
小智 6
您可以通过killing the process
正在运行的应用程序测试方案.
步骤1.打开您的应用程序,然后按Home
按钮将其隐藏到后台.
第2步.调用 adb shell
步骤3.输入命令su
(您必须获得ROOT权限才能终止进程)
步骤4. ps
(列出所有正在运行的进程ID并找到你的)
步骤5. kill 1234
(假设您的应用程序在流程1234上运行)
步骤6.然后,返回到您的设备并再次单击启动图标.您可能会发现活动堆栈上的最后一个活动是重新打开的.您还可以找到onRestoreInstanceState()
为该活动调用的方法.
简而言之:在 中进行初始化YourApplication.onCreate
,而不是在 LaunchActivity 中进行初始化
要检查的文档:
-进程和线程
- API 指南 > 活动
依赖启动活动来初始化 Application 类是否安全?
是的,只要您记住应用程序可以存在比活动更长的时间,并且活动可能会被终止并重新创建。我不确定 Intent 将复活 Activity 得到什么:启动或查看(对于当 Activity 因太重而被终止,而有长时间运行的服务绑定到应用程序时的情况)
是否存在可能重新创建应用程序类而未创建启动活动的情况?
是的,如果最后一个可见活动不是 LaunchActivity,
请检查Android 应用程序生命周期和静态的使用
是否有可能该进程在手机睡眠时被终止,并且在唤醒手机时,重新创建了 Application 类,恢复了堆栈中的顶部活动,但启动 Activity.onCreate 未运行,因此 Application 类没有初始化?
如果有几个不同的活动启动了 A、B、C 并且它们的整个进程被杀死,那么我认为 Android 操作系统很好,只创建应用程序和 C 活动,而 A 和 B 将在访问时重新构建,即返回到他们。
是否可以安全地假设应用程序类实例将与进程一样存在,
是的
并且当创建 Application 类时,它相当于“重新启动”应用程序,即。从新的活动堆栈开始(堆栈上的第一个活动是启动活动)?
我不确定何时重新启动启动活动将首先被调用,
但最后一个,即用户应该看到的那个。