【问题标题】:Intent extras missing when activity started活动开始时缺少意图附加功能
【发布时间】:2013-03-11 16:39:23
【问题描述】:

在广播接收器中,我想启动我的应用(Activity)并传入一些数据。

我的问题是额外内容似乎没有延续到活动中。我正在尝试获取 onNewIntent(Intent i) 函数中的数据。

有什么想法吗?

这是我目前在BroadcastReceiver中的尝试:

Intent intSlider = new Intent();
intSlider.setClass(UAirship.shared().getApplicationContext(), SliderMenuActivity.class);
intSlider.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

intSlider.putExtra("action", ScreensEnum.Object);
intSlider.putExtra("objectId", objectId);
intSlider.putExtra("objectCode", objectCode);
intSlider.putExtra("userId", userId);

UAirship.shared().getApplicationContext().startActivity(intSlider);

编辑 - 添加在 onNewIntent() 和 onCreate() 中使用的代码

当应用当前未运行时,以下代码在 onCreate() 中运行良好。因为当应用程序已经在运行时,onNewIntent() 函数中的相同代码不起作用(即没有额外内容)。

Intent intent = getIntent();

if(intent.hasExtra("objectId")) {

    loadDetail(intent.getStringExtra("objectId"), "2w232");
}

【问题讨论】:

  • 是否调用了onNewIntent 方法?你为SliderMenuActivity 指定了什么launchMode?
  • 嗨,是的 onNewIntent() 被调用。 launchMode 是 singleTask。
  • 你能发布你的onNewIntent方法吗?
  • 嘿@conor 你有没有得到这个有效的答案?我现在也有同样的问题

标签: android android-intent


【解决方案1】:

问题是getIntent() 方法。它总是返回开始活动的意图,而不是最近的。您应该使用传递给 onNewIntent 方法的意图作为参数。

【讨论】:

  • 同样的事情,调试时我正在检查两个意图。他们都是空的。
  • hmm..我从来没有遇到过这个问题,我在谷歌上找不到任何有用的信息.. =(
【解决方案2】:

从文档中提取

这对于将 launchMode 设置为“singleTop”的活动调用 他们的包,或者如果客户使用了 FLAG_ACTIVITY_SINGLE_TOP 标志 调用 startActivity(Intent) 时。无论哪种情况,当活动 在活动堆栈的顶部重新启动,而不是新的 正在启动的活动实例,将调用 onNewIntent() 在具有用于重新启动的 Intent 的现有实例上 它。

Activity 在接收到新的 Intent 之前总是会暂停,所以 你可以指望 onResume() 在这个方法之后被调用。

请注意,getIntent() 仍然返回原始 Intent。您可以使用 setIntent(Intent) 将其更新为这个新的 Intent。

我认为最后一段解释了您的问题。

【讨论】:

  • Ahmed,我认为您不太了解 Android 中的 Tasks 和 Back 堆栈是如何工作的,因此您的回答并不正确。在这里阅读它们的工作原理:developer.android.com/guide/components/…
  • 活动是否已经在运行也不影响额外内容是否交付,所以我想你误解了它是如何工作的
  • 是的。但它确实会影响意图交付的天气,不是吗?
  • 根据我的经验,没有。意图只是调用活动的方法,无论它是否被重用,所以信息仍然附加在它上面。如果没有使用 Intent,Android 怎么知道你想打开哪个 Activity?
  • 是的,再次阅读文档后,这似乎完全正确。
【解决方案3】:

您必须在清单文件中设置标志 FLAG_ACTIVITY_SINGLE_TOP 或设置 launchMode singleTop。

当然,当调用 onNewIntent 时,您不使用 getIntent,而是使用 Intent 作为参数接收。 当活动实例已经存在时,将调用 onNewIntent。例如,如果您上次按下主屏幕按钮。

我在这里写了一个适合我的解决方案:Intent with old extra in onCreate() for singleTask Activity

【讨论】:

    【解决方案4】:

    当我们尝试在 Activity 上启动/调用 onNewIntent 以响应本地通知点击时,我们偶然发现了这个问题。当onNewIntent 收到它时,我们在 Intent 上添加的额外内容正在消失。

    我不记得当时在任何地方都记录了这一点,但“问题”是我们没有在我们准备的 Intent 上设置操作字段。事实证明,如果您的 Activity 接收到的 Intent 没有使用 setAction 设置的操作,系统仍会将 Intent 传递到其目的地,但不会传输您在创建 Intent 时设置的额外内容。

    TL;DR:

    如果您在没有操作的 Intent 中遇到此问题,在发送 Intent 之前调用 setAction 设置任意操作值可能会解决此问题。

    【讨论】:

      【解决方案5】:

      您可以将最后收到的意图存储在成员变量 (mLastIntent) 中。 然后你可以在你的 onResume() 方法中使用这个成员来查询你的额外数据。

      private Intent mLastIntent;
      @Override
      protected void onNewIntent(Intent intent) {
          mLastIntent = intent;
      };
      

      【讨论】:

      • 请添加标签。这个问题没有得到很好的解释。编程语言是什么也不清楚。
      猜你喜欢
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多