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

由于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被杀或是手机深度休眠之后,闹钟依然是不准确的,这个就没办法了。。。如果哪位有新招求分享一下。。。

你可能感兴趣的:(android进阶)