Android 7 BroadcastReceiver onReceive intent.getExtras丢失数据

Phi*_*l O 9 broadcastreceiver android-7.0-nougat

我的应用程序无法在Android 7上运行。调用了我的BroadcastReceiver.onReceive方法,但缺少intent.getExtras的内容。我已验证数据已正确加载。这是我的onReceive方法的一个片段,其中intent作为参数传递给onReceive。

Bundle bundle = intent.getExtras();
textMessage = bundle.getString("TEXT_MESSAGE");
ArrayList<MyPhoneNumber> phoneNumbersToText = bundle.getParcelableArrayList("PHONE_NUMBERS");
Run Code Online (Sandbox Code Playgroud)

textMessage和phoneNumbersToText均为null。

这是清单文件中的片段:

<receiver android:process=":remote" android:name="com.friscosoftware.timelytextbase.AlarmReceiver"></receiver> 
Run Code Online (Sandbox Code Playgroud)

以下是加载数据的代码段:

Intent intent = new Intent(context , AlarmReceiver.class);  
intent.putExtra(Constants.TEXT_MESSAGE, scheduledItem.getMessageToSend());
intent.putExtra(Constants.PHONE_NUMBERS, scheduledItem.getPhoneNumbersToText());    

PendingIntent sender = PendingIntent.getBroadcast(context, getRequestCodeFromKey(key), intent, PendingIntent.FLAG_UPDATE_CURRENT);

// Get the AlarmManager service
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, selectedDateTime.getTimeInMillis(), sender);
Run Code Online (Sandbox Code Playgroud)

相同的代码在Android 6中可以正常工作。

您对Android 7需要进行哪些更改有任何想法吗?

谢谢

Tar*_*ych 9

Android O 版本无法在 BroadcastReceivers 中正确获得附加功能。但是一个很好的解决方案是使用意图的setAction(String action)方法来发送可序列化的Alarm对象。然后将它返回到onReceive 中的对象。这是示例:

    Intent intent = new Intent(context, AlarmReceiver.class);
    intent.setAction(new Gson().toJson(alarm));
Run Code Online (Sandbox Code Playgroud)

然后在你的闹钟接收器中

public void onReceive(Context context, Intent intent) {

    String alarmSerializable = intent.getAction();
    if (alarmSerializable != null)
        alarm = new Gson().fromJson(alarmSerializable, Alarm.class);

    //TODO next, send notification
}
Run Code Online (Sandbox Code Playgroud)

这是 Android O 等常用的方式。


Ace*_*z44 1

+1,看来你和我遇到了同样的问题。我将其记录在跟踪器上,(https://code.google.com/p/android/issues/detail?id=216581我将其记录在您评论的

我的解决方案是使用 SharedPreferences 来存储我的自定义对象。然后,当警报管理器触发时,我运行以下命令来取出对象。tl;dr,我使用 GSON 将 SharedPrefs 中的自定义 POJO 作为字符串序列化/反序列化。例如:

 String json = getSharedPrefs(context).getString(NotificationUtility.NEXT_REMINDER_KEY, "No reminder found");
    try {
        Gson gson = new Gson();
        Reminder reminder = gson.fromJson(json, Reminder.class);
        if (reminder != null) {
            return reminder;
        }
    } catch (Exception error) {
        Log.i(TAG, "Error parsing json: " + error.getMessage(), error);
        return null;
    }
    return null;
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助你!