使用Android AlarmManger做定时任务

第一步:配置AndroidManifest

// 接收开机启动广播权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

// 广播接收器
<receiver
    android:name=".AlarmReceiver" >
    <intent-filter>
        <action android:name="com.android.test.ALARM" />
        <action android:name="com.android.test.SETTING" />
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

第二步:编写AlarmControl

package com.android.test;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.SystemClock;

public class AlarmControl {
    public static final String ACTION_ALARM = "com.android.test.ALARM";
    public static final String ACTION_SETTING = "com.android.test.SETTING";
    public static final String BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";

    private static AlarmControl instance;
    private SharedPreferences sharedPreferences;
    private AlarmManager alarmManager;
    private PendingIntent pendingIntent;

    public static AlarmControl getInstance(Context context) {
        if (instance == null) {
            instance = new AlarmControl(context);
        }
        return instance;
    }

    private AlarmControl(Context context) {
        Intent intent = new Intent(ACTION_ALARM);
        pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

        alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        sharedPreferences = context.getSharedPreferences("alarm", Context.MODE_PRIVATE);
    }

    /**
     * 设置定时任务
     */
    public void setAlarm() {
        alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 10 * 60 * 1000, pendingIntent);
        sharedPreferences.edit().putBoolean("alarm", true).apply();
    }

    /**
     * 取消定时任务
     */
    public void cancelAlarm() {
        alarmManager.cancel(pendingIntent);
        sharedPreferences.edit().putBoolean("alarm", false).apply();
    }

    /**
     * 获取定时任务状态
     *
     * @return
     */
    public boolean getStatus() {
        return sharedPreferences.getBoolean("alarm",false);
    }
}

第三步:编写AlarmReceiver

package com.android.test;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class AlarmReceiver extends BroadcastReceiver {
    private static final String TAG = "AlarmReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals(AlarmControl.ACTION_ALARM)) {
            Log.v(TAG, "AlarmReceiver: ACTION_ALARM");
        } else if (action.equals(AlarmControl.BOOT_COMPLETED)) {
            boolean status = AlarmControl.getInstance(context).getStatus();
            if (status) {
                AlarmControl.getInstance(context).setAlarm();
                Log.v(TAG, "AlarmControl: setAlarm");
            }
        } else if (action.equals(AlarmControl.ACTION_SETTING)) {
            boolean status = intent.getBooleanExtra("status", true);
            if (status) {
                AlarmControl.getInstance(context).setAlarm();
                Log.v(TAG, "AlarmControl: setAlarm");
            } else {
                AlarmControl.getInstance(context).cancelAlarm();
                Log.v(TAG, "AlarmControl: cancelAlarm");
            }
        }
    }
}

第四步:查看Android中的AlarmManager事件

adb shell dumpsys alarm

参考链接:
Android Service 自动启动

Android 定时任务的8种实现方法

[Android] 查看Android中的AlarmManager事件

发表评论