0

アプリケーションに長年問題があり、解決できませんでした。私のアプリは、StartActivityForResult で互いに呼び出す複数のアクティビティで構成されています。次に、応答を待って、それに応じて行動します。これは、通常の状況では正常に機能します。マニフェストに次のセットがあります。

android:alwaysRetainTaskState = "true"

Android OS がアプリ内のアクティビティを強制終了することを決定すると、ルート アクティビティを強制終了したいようです。次のようなログ エントリが表示されます。

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 に保存するので、何も失われませんが、データベースは暗号化を使用し、セキュリティ上の理由からキーが保存またはキャッシュされることはないため、データベースを再度開いて位置を復元することはできません。この場合、ルート アクティビティに戻りたいだけです。

アプリが強制終了された後に再起動したときにアプリを完全に再起動し、アクティビティを復元しようとしない方法があるかどうかを知りたいです。ユーザーが切り替えて戻った場合に常にルートに戻るように設定できる起動モードがあることは知っていますが、この場合はオプションではありません。ルート アクティビティが強制終了されたときにアプリを完全に強制終了したいだけです。

アドバイスをよろしくお願いします。

4

3 に答える 3

1

メインアクティビティAがサブアクティビティBを呼び出し、Bが静的Aの変数onCreateを参照していて、AndroidがBにいるときにメモリ上の理由でプロセスを強制終了した場合、次のようになります。

-ユーザーがアプリケーションを開くと、最初にBのoncreateが呼び出され、Aの変数が存在しないためにクラッシュします(プロセスが強制終了されました)。

私はこれを次のようにスムーズに処理し
ました。Bのoncreateで、Aの静的変数がnullかどうかを確認します。はいの場合は、メモリが原因でクラッシュが発生したことを意味します(上記のとおり)。次のようにする必要があります。

setResult(999); 
finish(); 
return;

次に、Aは通常どおりoncreateを続行し、静的変数を再作成します。AのonActivityResultに設定できます。

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

そして、AのonCreateの最後に:

if(comeFromCrash){launch B; comeFromCrash = false;}

次に、変数を追加して、Bがデフォルトで起動するか、クラッシュ後に起動するかを制御できます。

于 2012-04-02T16:58:19.080 に答える
0

アプリに実際のデータモデルを提供し、アプリでデータを取得するためのアクティビティに依存しないようにするには、こちらをご覧ください。

Intent.putExtrasのサイズ制限?

于 2012-02-24T23:06:07.957 に答える
0

おそらく、すべてのアクティビティを「ルート」アクティビティを「リッスン」するように設定します。「ルート」アクティビティは、その onStop メソッドが呼び出されたときにブロードキャストし、他のすべてのアクティビティに終了する時間を通知できますか? それがあなたに役立つかどうかはわかりませんが、どちらにしてもかなりの解決策ではありません.

于 2012-02-24T23:10:41.403 に答える