BroadcastReceiver 的 onReceive 中 Intent extra 为空

Posted

技术标签:

【中文标题】BroadcastReceiver 的 onReceive 中 Intent extra 为空【英文标题】:Intent extras are empty in onReceive of BroadcastReceiver 【发布时间】:2018-04-19 02:46:03 【问题描述】:

我想在 BroadcastReceiver 类的 onReceive() 方法中从 Intent 中获取一些参数。但是只有 int ALARM_COUNT = 1,虽然我放了两个 args:我的 Parcelable Alarm 对象和测试 int(用于警报对象有问题的情况)。

我这样设置闹钟:

private void setCurrentAlarm(Alarm alarm) 
        long time = System.currentTimeMillis() + getClosestTimeDifference(alarm);

        mAlarmManager.set(AlarmManager.RTC_WAKEUP, time, createPendingIntent(alarm));
    

我如何创建 PendingIntent 变量:

private PendingIntent createPendingIntent(@NonNull Alarm alarm) 
        Intent intent = new Intent(mContext, AlarmBroadcastReceiver.class);

        intent.putExtra(KEY_ALARM, alarm);
        intent.putExtra("TEST", 1010120012);

        return PendingIntent.getBroadcast(mContext, alarm.getId(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
    

我的 AlarmBroadcaseReceiver 类中的 onReceive() 方法:

    @Override
    public void onReceive(Context context, Intent intent) 
           Alarm receivedAlarm = intent.getParcelableExtra(KEY_ALARM); //is always null
           int receivedInt = intent.getIntExtra("TEST", -1); //the same empty, -1
    

如您所见,Intent 仅包含一些 ALARM_COUNT 额外内容,但没有我的额外内容。

怎么办?我怎样才能得到它们?

【问题讨论】:

嗨 Denis,我推荐这个链接 ***.com/a/42181785/7542998 ,它包含所有信息,让您了解如何使用 alarmManager。 【参考方案1】:

嗨,丹尼斯,您可以像字符串一样发送值,然后解析为 int。

private PendingIntent createPendingIntent(@NonNull Alarm alarm) 
    Intent intent = new Intent(mContext, AlarmBroadcastReceiver.class);

    intent.putExtra(KEY_ALARM, alarm);
    intent.putExtra("TEST", "1010120012");

    return PendingIntent.getBroadcast(mContext, alarm.getId(), intent, PendingIntent.FLAG_UPDATE_CURRENT);


@Override
public void onReceive(Context context, Intent intent) 
       Alarm receivedAlarm = intent.getParcelableExtra(KEY_ALARM); //is always null
       Bundle extras = intent.getExtras();
       String testString = (String) extras.get("TEST");
       int test = Integer.parseInt(testString)

您的方法 onReceive 中将具有“TEST”的值

【讨论】:

【参考方案2】:

使用下面示例中显示的标志对我很有帮助。

retrun PendingIntent.getBroadcast(mContext, alarm.getId(), intent, PendingIntent.FLAG_CANCEL_CURRENT)
retrun PendingIntent.getBroadcast(mContext, alarm.getId(), intent, PendingIntent.FLAG_IMMUTABLE)
retrun PendingIntent.getBroadcast(mContext, alarm.getId(), intent, PendingIntent.FLAG_ONE_SHOT)
retrun PendingIntent.getBroadcast(mContext, alarm.getId(), intent, PendingIntent.FLAG_UPDATE_CURRENT)

【讨论】:

以上是关于BroadcastReceiver 的 onReceive 中 Intent extra 为空的主要内容,如果未能解决你的问题,请参考以下文章

使用 BroadcastReceiver 询问用户是不是希望打开应用程序 onReceive

使用方法引用定义BroadcastReceiver.onReceive

BroadcastReceiver onReceive方法没有被调用?

android BroadcastReceiver有时会在onReceive上抛出NullPointerException

不调用来自BroadcastReceiver的onReceive

在onReceive之后保持BroadcastReceiver活着