0

我的应用程序长期存在问题并且无法解决。我的应用由多个通过 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 中,所以什么都不会丢失,但我无法重新打开数据库并恢复位置,因为数据库使用加密,并且出于安全原因从不存储或缓存密钥。在这种情况下,我只想返回根活动。

I would like to know if there is a way to have my app relaunch completely when it's restarted after being killed, and not try to restore any activities. I know that there are launchmodes I can set to always return to the root if the user switches out and back, but it's not an option in this case. I just want the app to be completely killed when the root activity is killed!

Thanks in advance for any advice.

4

3 回答 3

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的onCreate结束时:

if (comeFromCrash) { 启动 B ; 来自崩溃=假;}

然后您可以添加额外的变量来控制 B 是默认启动还是在崩溃后启动

于 2012-04-02T16:58:19.080 回答
0

查看此处为您的应用程序提供一个真实的数据模型,并且不要依赖活动来获取您的应用程序中的数据:

Intent.putExtras 大小限制?

于 2012-02-24T23:06:07.957 回答
0

也许将所有活动设置为“监听”“根”活动。“根”活动可以在其 onStop 方法被调用时进行广播,从而通知所有其他活动它的死亡时间?不确定这是否会对您有所帮助,无论哪种方式,这都不是一个很好的解决方案。

于 2012-02-24T23:10:41.403 回答