活动开始时缺少意图附加功能

时间:2013-03-11 16:39:23

标签: android android-intent

在广播接收器中,我想启动我的应用程序(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");
}

5 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

从文档中提取

  

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

     

在收到新意图之前,活动将始终暂停,所以   你可以指望在这个方法之后调用onResume()。

     

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

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

答案 3 :(得分:0)

当我们尝试在活动上启动/调用onNewIntent来响应本地通知时,我们偶然发现了这个问题。在onNewIntent收到Intent时,我们放置在Intent上的其他内容消失了。

我不记得当时在任何地方对此进行记录,但是“问题”是我们没有在准备的Intent上设置action字段。事实证明,如果您的“活动”收到的意图没有使用setAction设置的操作,则系统仍会将意图传送到其目的地,但不会传输您在创建意图时设置的额外信息。

TL; DR:如果在没有任何操作的情况下遇到此问题,则在发送该Intent之前调用setAction来设置一个任意操作值可能会解决该问题。

答案 4 :(得分:-1)

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

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