设置Alarm时,Intent.getSerializableExtra(obj)在BroadcastReceiver的onReceive中返回null

时间:2019-11-11 12:34:05

标签: java android android-intent broadcastreceiver

我想启动警报并将对象传递给将由触发警报的BroadcastReceiver子类接收的意图,但是无论我传递给Intent的什么内容,都将不会保存,接收到的Intent将为null < / p>

这是我的代码:

(设置闹钟):

        private void startAlarm() {
           Girafe girafe = new Girafe("holly");
           int hash = 1
           // set the date of the alarm to be in one minute
           Calendar c = Calendar.getInstance();
           c.add(Calendar.MINUTE, 1); 

           // Create the alarm
           AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
           Intent intent = new Intent(this, AlertReceiver.class);

           // I pass here the object I want to be received on alarm fired
           intent.putExtra("myObject", girafe);
           intent.putExtra("myStr", "hello");
           PendingIntent pendingIntent = PendingIntent.getBroadcast(this, hash, intent, 0);
           alarmManager.setExact(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent);

        }

(接收和触发警报):

    public void onReceive(Context context, Intent intent) {

       String myStr = intent.getStringExtra("myStr") // I receive something null here
       Girage g = (Girafe) intent.getSerializableExtra("myObject"); // same here

    }

问题出在哪里?

PS:我知道这个问题已于7个月前在这里Intent getting null in onReceive in MyAlarm class even though I sat putExtra while sending intent提出,但没有人解决。

1 个答案:

答案 0 :(得分:0)

这不起作用。如果您传递了一个自定义对象(即:Android不知道的对象),则AlarmManager无法反序列化该对象,因此该对象将被忽略。这就是为什么在触发警报时您永远都不会在“ extras”中看到对象的原因。

要解决此问题,您可以将对象序列化为byte数组或String并将其放在“ extras”中。 AlarmManager知道byte个数组和String个数组,因此在触发警报时,您应该在“扩展名”中看到序列化的对象。然后,您将需要反序列化byte数组或String并自己重新创建对象。

另一个潜在的问题是您这样做:

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, hash, intent, 0);

此呼叫不一定总是创建新的PendingIntent。它可能会返回现有 PendingIntent,其中没有您的“附加”。为确保不会发生这种情况,您应该这样做:

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, hash, intent, PendingIntent.FLAG_UPDATE_CURRENT);

添加FLAG_UPDATE_CURRENT可以确保将您的“ extras”复制到PendingIntent中,即使返回现有的“ extras”也是如此。