AlarmManager定时发送广播,定时保活,兼容个版本

xiaoxiao2021-02-28  114

由于android个手机版本的迭代和厂商对内核的修改导致AlarmManager的使用不想以前那么准确了。

在api19以前可以使用setRepeating设置重复发送广播,只用就需要自己在发送闹钟后,在接收处再次发送相同的闹钟,实现重复执行的效果;

下面对AlarmManager的使用做了一些兼容性的处理,可以定时发送广播:

/** * 每5分钟唤醒一次service * * @param context */ public static void setKeepAliveAlarm(Context context, boolean interVal) { // 防止4.4以下的重复执行setRepeating if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT && interVal) { return; } // 循环时间 int TIME_INTERVAL = 5 * 60 * 1000; AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); // Intent local = new Intent(context, KeepAliveReceiver.class); Intent local = new Intent(context, "ALERT_KEEP_ACTION"); local.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);// 表示包含未启动的App PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 999, local, PendingIntent.FLAG_UPDATE_CURRENT); // 此处必须使用SystemClock.elapsedRealtime,否则闹钟无法接收 long triggerAtMillis = SystemClock.elapsedRealtime(); // 更新开启时间 if (interVal) { triggerAtMillis += TIME_INTERVAL; } // pendingIntent 为发送广播 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtMillis, pendingIntent); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtMillis, pendingIntent); } else {// api19以前还是可以使用setRepeating重复发送广播 alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtMillis, TIME_INTERVAL, pendingIntent); } return; } // 广播接收器 public class KeepAliveReceiver extends BroadcastReceiver { public static final String TAG = KeepAliveReceiver.class.getSimpleName(); @Override public void onReceive(Context context, Intent intent) { try { String action = intent.getAction(); if (!TextUtils.isEmpty(action)) { if(action.equals("ALERT_KEEP_ACTION")){ // 定时闹钟发送的保活心跳 // 在次发送闹钟 setKeepAliveAlarm(context, true); // 处理自己的逻辑 } } } catch (Exception e) { e.printStackTrace(); } return; }

至此就可以快乐的发送接收闹钟事件了,但是由于系统为了省电,在app被杀或是手机深度休眠之后,闹钟依然是不准确的,这个就没办法了。。。如果哪位有新招求分享一下。。。

转载请注明原文地址: https://www.6miu.com/read-36463.html

最新回复(0)