第一步:配置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 自动启动