56

我正在尝试将信息从通知发送到调用的活动,而从我的活动中我得到了空值。

通知代码如下:

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 不为空,并且它在 extras 中有 id。虽然,当我试图从意图中获取它时,它已经消失了。帮助。

4

7 回答 7

62

在 PendingIntent 中使用这个标志PendingIntent.FLAG_UPDATE_CURRENT它对我有用

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
于 2016-03-28T21:17:34.440 回答
36

对我来说,除了设置 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 收到的 Intent 上的 Extras 为空。

这篇文章有助于解释它:https ://stackoverflow.com/a/3128271/2162226

于 2014-06-04T20:34:58.920 回答
16

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

注意:如果您将其添加为resultIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 它将不起作用。

我还尝试了其他标志,例如“FLAG_ACTIVITY_NEW_TASK”和“FLAG_ACTIVITY_RESET_TASK_IF_NEEDED”。在这里都不起作用。

于 2012-11-28T02:01:18.230 回答
15

当一个活动被启动(当它第一次启动时)或重新启动(当它被带到堆栈的顶部时),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);
}

有关更多信息:请参阅此文档

于 2018-09-03T21:09:38.250 回答
1

当我遇到同样的问题时,我正在使用 Unity 的本地通知插件 -> 我启动了应用程序,安排了本地通知,将应用程序发送到后台,出现本地通知,当我点击它时,应用程序恢复并且getIntent().getExtras()null.

就我而言,问题是我试图以错误的意图获得额外的东西。尝试使用简单的 toString 打印意图,在创建时刻和获得它时,以确保收到的是您所期望的。

另请查看onNewIntent方法。

于 2017-10-17T13:42:22.303 回答
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)

希望这对你有用。

于 2020-07-26T23:33:24.420 回答
0

对我来说,我的三星设备不断从意图中删除额外内容,有时甚至使应用程序崩溃。尝试了所有组合,但这种行为的实际原因不是明确地将PendingIntent.FLAG_IMMUTABLE标志添加到待处理的意图。

虽然,这是 Android 12 及更高版本的要求

val pendingIntent = PendingIntent.getActivity(
                                this, 0,
                                getIntent(),
PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE
                            )
于 2022-02-15T20:47:01.883 回答