12

私はおおよそ次のフローを持つアプリケーションを持っています:

  • メイン アクティビティを開始し、データを入力します
  • アクティビティ 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)
4

1 に答える 1

1

Intent-data を savedInstance に書き込んでみてください!

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(getIntent() != null) {
        // Activity was started and got an Intent with data
        ...
    } else if(savedInstanceState != null) {
        // No intent is available, try getting data from savedInstance
        ...
    }

}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    if(outState != null) {
        // Write here your data
        ...
    }
}

これがお役に立てば幸いです:)

于 2012-04-29T11:55:58.973 に答える