11

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

我的问题是额外的东西似乎没有延续到活动中。我正在尝试获取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");
}
4

5 回答 5

12

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

于 2013-03-11T17:16:57.957 回答
1

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

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

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

于 2014-09-16T01:55:54.443 回答
1

从文档中提取

如果活动在其包中将 launchMode 设置为“singleTop”,或者客户端在调用 startActivity(Intent) 时使用了 FLAG_ACTIVITY_SINGLE_TOP 标志,则会调用此方法。在任何一种情况下,当活动在活动堆栈的顶部而不是正在启动的活动的新实例时重新启动时,onNewIntent() 将在具有用于重新启动的 Intent 的现有实例上调用它。

在接收到新意图之前,活动将始终暂停,因此您可以指望在此方法之后调用 onResume()。

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

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

于 2013-03-11T16:49:41.417 回答
1

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

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

TL;博士:

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

于 2019-07-05T17:42:35.677 回答
0

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

private Intent mLastIntent;
@Override
protected void onNewIntent(Intent intent) {
    mLastIntent = intent;
};
于 2014-02-03T22:17:14.707 回答