2012-02-24 49 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是否正在發起在默認情況下,或在崩潰之後

相關問題