私はおおよそ次のフローを持つアプリケーションを持っています:
- メイン アクティビティを開始し、データを入力します
- アクティビティ A を開始し、Intent で単一の文字列を渡します
- アクティビティ A は文字列を使用し、ユーザーにいくつかのオプションを提供します
- 使用によりアクティビティ B が開始される場合があります (A はバックグラウンドのまま)。
- ユーザーがアクティビティ B から戻ると、アクティビティ A が再作成されます (onCreate が呼び出されます)。メモリを節約するために削除されたと思います
- getIntent() によって返されたインテントには、アクティビティ A の元のインスタンスに渡されたデータがありません
最初の呼び出しでデータがあったことはわかっています。
ユーザーが (「戻る」キーを使用して) アクティビティ A に戻ったときにデータが存在しないことがわかっています。これは、アプリが終了したためです ( onCreate() の extras.getString(...) からの null ポインター)。
これは意図した動作ですか?
extras バンドルの内容を onSaveInstanceState() に保存する必要がありますか?
編集:以下のコードスニペット:
メイン アクティビティは、次を使用して新しいアクティビティを開始します。
Intent i = new Intent(a, BookISBNSearch.class);
i.putExtra(BookISBNSearch.BY, "isbn");
a.startActivityForResult(i, R.id.ACTIVITY_CREATE_BOOK_ISBN);
BookISBNSearch の onCreate には次のように書かれています。
...
Bundle extras = getIntent().getExtras();
mIsbn = extras.getString("isbn");
String by = extras.getString(BY);
...
少し後でそれを使用します:
if (mIsbn != null) {
....do some stuff....
} else if (by.equals("isbn")) {
....do some other stuff....
ユーザーは BookISBNSearch から別のアクティビティを開始できます。新しいアクティビティを開始するコードは次のとおりです。
/*
* Start scanner activity.
*/
private void startScannerActivity() {
if (mScannerIntent == null) {
mScannerIntent = new Intent("com.google.zxing.client.android.SCAN");
}
if (!mScannerStarted) {
mScannerStarted = true;
startActivityForResult(mScannerIntent, ACTIVITY_SCAN);
}
}
ユーザーはスキャナーを実行し、他の多くのことを行い、最終的に「戻る」キーを押してこのアクティビティに戻ります。その時点で、以下にリストされているクラッシュが発生します。関連部分:
at com.eleybourn.bookcatalogue.BookISBNSearch.onCreate(BookISBNSearch.java:142)
次の行に対応します。
} else if (by.equals("isbn")) {
ここから、「by」は null であると結論付けます。
さらに、同じ問題を示す他の (外部以外の) アクティビティを開始する可能性のあるコード パスが他にもあります。これは私の電話でも、自動削除アクティビティがオンになっていても AVD では発生しません。
これはごく一部のユーザーでのみ発生します。
java.lang.NullPointerException
at com.eleybourn.bookcatalogue.BookISBNSearch.onCreate(BookISBNSearch.java:142)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3691)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670)
at dalvik.system.NativeStart.main(Native Method)