2012-02-24 47 views
0

我的应用程序长期存在问题,无法解决。我的应用程序由多个使用StartActivityForResult互相调用的活动组成。然后他们等待回应并采取相应行动。这在正常情况下工作正常。我在清单如下设置:Android操作系统在重新加载时杀死根活动,尝试重新加载根和顶级活动。有没有办法阻止这种行为?

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

我添加了一些检查其它非根活动onCreate方法。如果根活动尚未初始化,则我调用完成方法并跳过其余的初始化。令人惊讶的是,它似乎在做伎俩 - 即使这个活动是在等待结果命令时调用的,它似乎只是静静地关闭,根活动回到顶端。所以我想我在这里有一个解决方案! – 2012-02-25 03:33:40

回答

0

看这里提供您的应用程序真正的数据模型,并没有得到相关的活动,让你的数据在你的应用程序:

Intent.putExtras size limit?

+0

感谢您的留言。数据库和它的格式是这个应用程序的核心,所以我必须使用NDK和本地库来对数据进行加密/解密/查询/排序等。因此,每个活动等待结果的原因是知道用户何时选择新参数进行过滤,以便我可以重新查询数据库以查找要显示的新记录列表。这就是为什么我需要依赖活动。问题是,由于核心应用程序正在关闭/重新启动,所有连接到数据库的连接都被清除了,但是那些深层次的活动并不知道它。 – 2012-02-25 01:02:24

0

也许将所有活动的“听”到“根“活动。当它的onStop方法被调用时,“根”活动可能会广播,从而通知所有其他活动的时间到了? 不知道这是否会帮助你,它不是一个漂亮的解决方案。

+0

感谢您的回复。问题在于应用程序关闭时不会调用OnDestroy方法。所以没有办法知道你即将被杀死。否则,我只是在那个时候关闭商店,一切都会很棒!不管怎么说,还是要谢谢你.. – 2012-02-25 00:57:44

1

如果你有一个叫子活动B,为B指静态A的变量的onCreate主要活动,而Android杀死内存原因你的过程,当你在B:

- 当用户打开应用程序,它将首先调用B的oncreate并且会因为A的变量不再存在而崩溃(进程已被终止)。

我已经处理了这个平稳是这样的:
对B的OnCreate中,检查A的静态瓦尔是否为空。如果是的话,这意味着你有内存崩溃(如上所述)。你应该做如下:

setResult(999); 
finish(); 
return; 

然后,将与OnCreate中继续为正常并重新创建静态变量。您可以在A的onActivityResult设置:

if (resultCode==999) A.comeFromCrash = true; 

,然后在的onCreate结束:

如果(comeFromCrash){推出B; comeFromCrash = FALSE;}

然后,可以添加额外的VARS来控制B是否正在发起在默认情况下,或在崩溃之后

相关问题