我正在尝试将信息从通知发送到被调用的活动,而从我的活动中我得到了null。
通知代码是:
private void showNotification() {
Intent resultIntent = new Intent(this, MainActivity.class);
if (D)
Log.d(TAG, "Id: " + Id);
resultIntent.putExtra("ineedid", deviceId);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MeterActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,
PendingIntent.FLAG_UPDATE_CURRENT);
// Bundle tmp = resultIntent.getExtras();
// if (tmp == null) {
// Log.d(TAG, "tmp bundle is null");
// } else {
// long id = tmp.getLong("ineedid", -1);
// Log.d(TAG, "tmp id : " + id);
// }
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
BLEMessengerService.this)
.setSmallIcon(R.drawable.ic_action_search)
.setContentTitle("Event tracker")
.setContentText("Events received").setOngoing(true)
.setContentIntent(resultPendingIntent)
.setWhen(System.currentTimeMillis());
int mId = R.string.service_notification_start_service;
mNM.notify(mId, mBuilder.getNotification());
}
从主要活动中获取意外信息的代码;
Bundle extras = getIntent().getExtras();
if (extras != null) {
long deviceID = getIntent().getLongExtra("ineedid",
-1);
if (ID == -1) {
if (D)
Log.i(TAG_D, "Wrong Id received.");
finish();
} else {
device = dataSource.getDeviceByID(deviceID);
if (D)
Log.i(TAG_D, "Get the id.");
}
} else {
if (D)
Log.d(TAG_D, "Bundle is null");
finish();
}
我在通知收到通知之前已经验证过,bundle不是null,并且它在附加内容中有id。 然而,当我试图从意图中获取它时,它已经消失了。帮助
答案 0 :(得分:31)
使用此标记PendingIntent.FLAG_UPDATE_CURRENT
它为我工作
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
答案 1 :(得分:25)
对我来说,除了设置Intent.FLAG_ACTIVITY_SINGLE_TOP之外,我还必须为意图添加一个独特的动作:
Intent resultIntent = new Intent(caller, NotificationActivity.class);
String xId = getNextUniqueId();
resultIntent.putExtra("x_id", xId);
resultIntent.setAction(xId);
resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
..没有setAction(..),Extras在我的NotificationActivity收到的Intent上为null。
这篇文章有助于解释它:https://stackoverflow.com/a/3128271/2162226
答案 2 :(得分:13)
我刚才得到了答案,
添加行:resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
注意:如果您将其添加为resultIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
它不起作用。
我还尝试了其他标志,例如“FLAG_ACTIVITY_NEW_TASK”和“FLAG_ACTIVITY_RESET_TASK_IF_NEEDED”。这两个都不起作用。
答案 3 :(得分:5)
启动活动(首次启动时)或重新启动活动(将其移至堆栈顶部)时,getIntent().getExtra()
不会给出null
。但是,如果活动出现在堆栈的顶部上,则使用PendingIntent
启动该活动不会重新启动该活动(onCreate()
不会被调用)而是调用onResume()
。并且getIntent().getExtra()
将返回与启动活动的意图相关的值(即null
)。
为了更新意图,请执行以下步骤:
1)。根据您的意图设置FLAG_ACTIVITY_SINGLE_TOP
和FLAG_ACTIVITY_CLEAR_TOP
标志。
resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
2)。在调用onNewIntent()
的活动中覆盖getIntent().getExtra()
。 FLAG_ACTIVITY_SINGLE_TOP
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
有关更多信息:CSS Grid
答案 4 :(得分:1)
当我遇到同样的问题时,我正在Unity的本地通知插件中工作 - >我启动了应用程序,安排了本地通知,将应用程序发送到后台,出现了本地通知,当我点击它时,应用程序已恢复,getIntent().getExtras()
为null
。
在我的情况下,问题是我试图以错误的意图获取额外内容。尝试使用简单的toString打印意图,在创建时和获取时,确保收到的是您期望的。
另请参阅onNewIntent方法。
答案 5 :(得分:0)
如果您使用 隐式意图 构建PendingIntent,则可能会遇到此问题。
此问题的先前处理方法。
val intent = Intent()
intent.action = Intent.ACTION_VIEW
intent.data = Uri.parse("deeplink or applink here")
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
intent.putExtra("key", Parcelable)
PendingIntent.getActivity(context, abs(Random.nextInt()), intent, PendingIntent.FLAG_UPDATE_CURRENT)
基于隐式Intent尝试了上面列出的多种方法对我不起作用。
这是解决我的问题的方法。 将Intent从隐式更改为显式。
// only diff
val intent = Intent(context, YourIntentDestinationActivity::class.java)
// only diff
intent.action = Intent.ACTION_VIEW
intent.data = Uri.parse("deeplink or applink here")
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
intent.putExtra("key", Parcelable)
PendingIntent.getActivity(context, abs(Random.nextInt()), intent, PendingIntent.FLAG_UPDATE_CURRENT)
希望这对您有用。