我的申请存在长期问题,但无法解决。我的应用程序由多个活动组成,这些活动使用StartActivityForResult相互调用。然后他们等待响应并采取相应行动。这在正常情况下工作正常。我在清单中有以下内容:
android:alwaysRetainTaskState = "true"
当Android操作系统决定杀死我的应用中的活动时,它似乎想要杀死根活动。我看到一个这样的日志条目:
no longer want com.ddhsoftware.android.handbase
此时似乎关闭了根活动以及我运行的应用程序和服务。
然后,当我再次启动它(或从按下并按住主页按钮中选择)返回应用程序时,我收到强制退出消息。日志读到:
02-24 17:29:04.376 E/AndroidRuntime(14318): FATAL EXCEPTION: main
02-24 17:29:04.376 E/AndroidRuntime(14318): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ddhsoftware.android.handbase/com.ddhsoftware.android.handbase.ListViewScreen}: java.lang.NullPointerException
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.os.Handler.dispatchMessage(Handler.java:99)
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.os.Looper.loop(Looper.java:130)
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.app.ActivityThread.main(ActivityThread.java:3683)
02-24 17:29:04.376 E/AndroidRuntime(14318): at java.lang.reflect.Method.invokeNative(Native Method)
02-24 17:29:04.376 E/AndroidRuntime(14318): at java.lang.reflect.Method.invoke(Method.java:507)
02-24 17:29:04.376 E/AndroidRuntime(14318): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-24 17:29:04.376 E/AndroidRuntime(14318): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-24 17:29:04.376 E/AndroidRuntime(14318): at dalvik.system.NativeStart.main(Native Method)
02-24 17:29:04.376 E/AndroidRuntime(14318): Caused by: java.lang.NullPointerException
02-24 17:29:04.376 E/AndroidRuntime(14318): at java.util.Arrays$ArrayList. (Arrays.java:47)
02-24 17:29:04.376 E/AndroidRuntime(14318): at java.util.Arrays.asList(Arrays.java:169)
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.widget.ArrayAdapter. (ArrayAdapter.java:125)
02-24 17:29:04.376 E/AndroidRuntime(14318): at com.ddhsoftware.android.handbase.ListViewScreen.setupViewSelector(ListViewScreen.java:821)
02-24 17:29:04.376 E/AndroidRuntime(14318): at com.ddhsoftware.android.handbase.ListViewScreen.onCreate(ListViewScreen.java:114)
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
02-24 17:29:04.376 E/AndroidRuntime(14318): ... 11 more
02-24 17:29:04.386 W/ActivityManager( 96): Force finishing activity com.ddhsoftware.android.handbase/.ListViewScreen
问题在于,这是来自根目录的子活动,以及最后一个可见的子活动。它不再有效,因为它从在根活动中打开的数据库生成数组适配器,并且由于刚刚重新启动,此时没有数据库打开。虽然我确实将数据库和记录保存在OnSaveInstanceState中,因此不会丢失任何内容,但我无法重新打开数据库并恢复位置,因为数据库使用加密,并且出于安全原因,密钥永远不会被存储或缓存。我只想在这种情况下返回根活动。
我想知道是否有办法让我的应用程序在被杀后重启时完全重新启动,而不是尝试恢复任何活动。我知道有些启动模式我可以设置为在用户切换回来时始终返回根目录,但在这种情况下它不是一个选项。我只是希望在根活动被杀死时完全杀死应用程序!
提前感谢任何建议。
答案 0 :(得分:1)
如果您有主要活动A调用子活动B,B指向静态A的变量onCreate,并且当您在B中时,android会出于内存原因杀死您的进程:
- 当用户打开你的应用程序时,它将首先调用B的oncreate并且因为A的变量不再存在而崩溃(进程已经被杀死)。
我这样顺利地处理了这个问题:
在B的oncreate上,检查A的静态变量是否为空。如果是,则表示您遇到了由内存引起的崩溃(如上所述)。你应该这样做:
setResult(999);
finish();
return;
然后,A将正常进行oncreate并重新创建静态变量。您可以在A的onActivityResult上设置:
if (resultCode==999) A.comeFromCrash = true;
然后在A's onCreate结束时:
if(comeFromCrash){launch B; comeFromCrash = FALSE;}
然后你可以添加额外的变量以控制B是默认启动还是崩溃后
答案 1 :(得分:0)
点击此处为您的应用提供真实的数据模型,并且不依赖于活动来获取您的应用中的数据:
答案 2 :(得分:0)
也许将所有活动设置为“监听”“根”活动。当调用onStop方法时,“root”活动可以广播,从而通知所有其他活动它的死亡时间? 不确定这是否会对你有所帮助,无论如何都不是一个漂亮的解决方案。