我有一个应用程序,其流程大致为:
- 启动 Main Activity,输入一些数据
- 启动 Activity A,在 Intent 中传递单个字符串
- 活动 A 使用字符串并为用户提供一些选项
- 有时使用会启动Activity B(将A留在后台)
- 当用户从 Activity B 返回时,将重新创建 Activity A(调用 onCreate);我认为它已被删除以节省内存
- getIntent() 返回的意图没有将数据传递给 Activity A 的原始实例
我知道数据在第一次调用中就在那里,因为如果不是,应用程序就会死掉。
我知道当用户返回 Activity A(通过“返回”键)时数据不存在,因为应用程序死掉了(来自 onCreate() 中 extras.getString(...) 的空指针)。
这是预期的行为吗?
我应该将附加包的内容保存在 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'为空。
此外,还有其他可能的代码路径启动其他(非外部)活动,这些活动表现出相同的问题。即使打开了自动删除活动,这也不会发生在我的手机中,也不会发生在 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)