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