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