Android通知的PendingIntent额外空(Android Notification Pe

2019-07-04 04:47发布

我想从通知信息发送到调用的活动,而从我的活动我得到空。

通知的代码是:

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();
}

我已经验证了通知得到通知之前,包是不是空的,它有额外的ID。 虽然,当我试图从意图把它拿来,就不见了。 救命。

Answer 1:

在的PendingIntent使用此标志PendingIntent.FLAG_UPDATE_CURRENT这是为我工作

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);


Answer 2:

对于我来说,除了设置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(..),附加功能是对我的NotificationActivity收到的意向空。

这篇文章可以帮助解释: https://stackoverflow.com/a/3128271/2162226



Answer 3:

我刚刚得到了答案,添加一行: resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

注意:如果你将其添加为resultIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 它不会工作。

我也尝试过其他的标志,如“FLAG_ACTIVITY_NEW_TASK”和“FLAG_ACTIVITY_RESET_TASK_IF_NEEDED”。 无论在这里工作。



Answer 4:

当一个活动启动(当首次启动)或重新启动(当它带到堆栈的顶部) getIntent().getExtra()不会给null 。 但是,当活动是出现在堆栈的顶部 ,然后在开始使用该活动PendingIntent不会重新启动活动( onCreate()将不会被调用)来代替onResume()将被调用。 和getIntent().getExtra()将返回其与启动该活动(这是意图关联的值null )。
为了更新的意图执行以下步骤:

1)。 设置FLAG_ACTIVITY_SINGLE_TOPFLAG_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);
}

欲了解更多信息: 请参见本文档



Answer 5:

我是在一个本地通知插件的团结工作,当我遇到同样的问题- >我推出的应用程序,计划在本地通知,发送应用的背景下,本地通知出现了,当我点击它,应用程序是恢复和getIntent().getExtras()null

在我的情况下,问题是我试图在错误的意图得到了临时演员。 尝试用一个简单的toString打印意图,在创建时刻,当你得到它,以确保接收到的是你所期望的。

也看看到onNewIntent方法。



文章来源: Android Notification PendingIntent Extras null