java - 返回 Activity 时失去 Intent 附加功能

标签 java android

我有一个应用程序,其流程大致是:

  • 启动Main Activity,输入一些数据
  • 启动 Activity A,在 Intent 中传递一个字符串
  • Activity A 使用字符串并为用户提供一些选项
  • 有时使用会启动 Activity B(将 A 留在后台)
  • 当用户从 Activity B 返回时,Activity A 被重新创建(调用 onCreate);我假设它已被删除以节省内存
  • getIntent() 返回的 Intent 没有将数据传递给 Activity A 的原始实例

我知道第一次调用时数据就在那里,因为如果不存在,应用程序就会死掉。

我知道当用户返回 Activity A(通过“后退”键)时数据不存在,因为应用程序死了(来自 onCreate() 中的 extras.getString(...) 的空指针)。

这是有意为之的行为吗?

我应该在 onSaveInstanceState() 中保存附加包的内容吗?

已编辑:以下代码 fragment :

Main Activity 使用以下方式启动新 Activity:

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 开始另一个 Activity 。启动新 Activity 的代码是:

/*
 * 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);
    }
}

用户运行扫描器,做一些其他的事情,最后按下“后退”键返回到这个 Activity 。此时他们会遇到下面列出的崩溃。相关部分:

at com.eleybourn.bookcatalogue.BookISBNSearch.onCreate(BookISBNSearch.java:142)

对应行:

} else if (by.equals("isbn")) {

从中我得出结论,'by' 为空。

此外,还有其他可能的代码路径启动其他(非外部) Activity ,这些 Activity 会出现相同的问题。这不会发生在我的手机中,也不会发生在 AVD 中,即使打开了自动删除 Activity 也是如此。

它只发生在一小部分用户身上。

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)

最佳答案

尝试将您的 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
        ...
    }
}

我希望这对您有所帮助:)

关于java - 返回 Activity 时失去 Intent 附加功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10371789/

相关文章:

java - 在我的类(class)中找不到 ( ) 的 setter /字段

java - 如何获取jongo的jar lib文件?

java - 如何从锁屏以编程方式更改亮度

java - 调用 PaintComponent 时数组的大小变为 0

javascript - 通过 SQL 加载器加载数据并在 JSP 上显示时如何合并空单元格

android - 无法从 CellSignalStrengthLte Android 获取 RSRP 和 RSRQ 的正确值

android - 在android中检测设备向左或向右方向的晃动?

android - 无法在 Android 中处理重复的推文

java - 在迭代列表时从列表中删除对象

java - 为什么 Eclipse 不将所有 jar 文件移动到服务器 lib 文件夹?