内推
【长期有效】欢迎加入字节跳动我的团队:内推链接
公司项目开发时,同事见解总结。BUG基本都是在三星机器上出现。
1.PendingIntent.getBroadcast的第4个参数flags,建议用PendingIntent.FLAG_UPDATE_CURRENT,因为FLAG_CANCEL_CURRENT只是给Intent打上cancel标记,并没有立即取消,而FLAG_UPDATE_CURRENT只是更新那个Intent的状态,不会产生新的Intent。(可通过 adb shell dumpsys alarm 查看应用alarm相关信息)
2.PendingIntent.getBroadcast的第2个参数requestCode可以用来区分不同的闹钟。requestCode应当是一个常量,不然会产生多个闹钟。
3.不要使用AlarmManager.setRepeating方法。setRepeating注册的闹钟会常驻在Android系统进程里,那怕应用进程被杀掉,闹钟也不会被取消。如果需要重复性的闹钟,可以在接到闹钟广播后,再重新启动一个闹钟,自己模拟setRepeating。
示例代码:
Intent intent = new Intent("com.example.action.alarm");
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, requestCode, intent,PendingIntent.FLAG_UPDATE_CURRENT);
mAlarmManager.set(AlarmManager.RTC_WAKEUP, sTime, pendingIntent);
修改后覆盖安装,可能还有这个问题。因为覆盖安装,旧版本注册的闹钟还在,只有重启手机才会清空。