启动活动时缺少意图附加项

13

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

我的问题是额外的数据似乎没有传递到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 - Vladimir Mironov
是的,onNewIntent()被调用了。launchMode 是 singelTask。 - jim
你能否发布你的 onNewIntent 方法? - Vladimir Mironov
嘿@conor,你有没有得到一个可行的答案?我现在也遇到了同样的问题。 - Kibi
5个回答

14

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


1
同样的事情,在调试时我检查了两个意图。它们都是空的。 - jim
哦嗯..我从未遇到过这个问题,且在谷歌上找不到任何有用的信息.. =( - Vladimir Mironov

2
我们曾经遇到过这个问题,当我们试图在本地通知点击时启动/调用Activity的onNewIntent方法时。我们放在Intent上的额外信息在onNewIntent方法接收到它时消失了。
我不记得那时候有人在任何地方记录这个问题,但是“问题”是我们没有在准备的Intent上设置操作字段。结果发现,如果您的Activity接收到的Intent没有使用setAction设置操作,则系统仍会将Intent传递到其目标,但不会传输您在创建Intent时设置的额外信息。
简而言之:
如果您遇到一个没有操作的Intent的这个问题,请在发送Intent之前调用setAction来设置任意操作值可能会解决它。

1

从文档中提取

这是为那些将launchMode设置为"singleTop"的活动而调用的,或者如果客户端在调用startActivity(Intent)时使用了FLAG_ACTIVITY_SINGLE_TOP标志。无论哪种情况,在重新启动活动时,如果该活动位于活动堆栈的顶部而不是启动新的活动实例,则会在现有实例上调用onNewIntent()并传递用于重新启动它的Intent。

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

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

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


Ahmed,我认为你还没有完全理解Android中的任务和返回栈是如何工作的,所以你的答案并不正确。请在这里阅读有关它们如何工作的信息:http://developer.android.com/guide/components/tasks-and-back-stack.html - Matt Taylor
无论活动是否正在运行,都不会影响额外信息的传递,因此,我认为您误解了所有操作的工作方式。 - Matt Taylor
是的,但它确实会影响意图是否能够被传递,不是吗? - Ahmed Aeon Axan
根据我的经验,不是这样的。意图只是调用活动的方法,无论它是否被重复使用,因此信息仍然与其相关联。如果没有使用意图,Android怎么知道您想要打开哪个活动呢? - Matt Taylor
是的,在再次阅读文档后,那似乎是绝对正确的。 - Ahmed Aeon Axan

1

您需要在清单文件中设置FLAG_ACTIVITY_SINGLE_TOP标志或设置launchMode为singleTop。

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

我在这里编写了一个对我有效的解决方案:在singleTask Activity的onCreate()中使用旧extra的Intent


0
你可以将最后接收到的意图存储在成员变量(mLastIntent)中。 然后,在onResume()方法中,你可以使用这个成员变量来查询你的额外数据。
private Intent mLastIntent;
@Override
protected void onNewIntent(Intent intent) {
    mLastIntent = intent;
};

请添加标签。问题没有很好地解释清楚,也不清楚是哪种编程语言。 - JC Lizard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接