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