android - WakefulBroadcastReceiver 不适用于 Nougat 和 Oreo 设备
问题描述
我有一个使用警报管理器设置警报的警报应用程序。一旦警报响起,接收器就会接收到它,该接收器启动唤醒服务,该服务处理警报并允许用户停止或打盹警报。
下面是代码片段
public class AlarmReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, final Intent intent) {
Alarm alarm = intent.getParcelableExtra(Constants.ARGS_ALARM);
}
}
我在旧版本的 Android 中得到了正确的值,但在 Nougat 和 Oreo 上得到了 null 的警报。我的应用支持 minSdkVersion 17 的 Nougat。
这段代码可能有什么问题?
解决方案
从这篇博客文章中引用我自己的话:
使用自定义
Parcelable
对象的代码AlarmManager
可能适用于旧版本的 Android将无法在 Android N 上运行。Matthias Urhahn 指出 [a] 解决方法:将 转换
Parcelable
为您byte[]
自己,将其存储在Bundle
. 然后,操作系统进程会将其视为一些随机byte[]
的。这个 Stack Overflow 答案 展示了这项技术。
这个示例项目也说明了这种技术。
推荐阅读
- python - 在 Python 中循环时使用 SQL Alchemy 将数据加载到 SQL Server 数据库时内存溢出
- expression - 不要在调整大小时缩放笔触(保持笔触一致) AfterEffects | 表达方式
- angular - 不使用 index 或 .length 如何计算 Angular 9 ngFor 的迭代次数?
- python - Pandas:如何根据另一列中的值创建类似于 Excel 的 OFFSET 函数的基于行的布尔掩码
- javascript - ReactJS 在使用父值的子按钮中调用父方法
- typescript - HTTP 获取请求不适用于 FireStore
- swift - 添加多个 pod
- python - 创建谢尔宾斯基三角形
- visual-studio - Android模拟器错误:无法启动模拟器pixel_2_pie_9_0__-_api_28
- c++ - 我有一个#include 错误
提出“没有这样的文件或目录”