Android需求每天定时进行任务
public class TimerManager { private Context context; private AlarmManager alarmManager; public TimerManager(Context context) { this.context = context; alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); } public void setTimer(long startTimeMillis, TimerCallBack callback) { Intent intent = new Intent(context, TimerBroadcastReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE); alarmManager.set(AlarmManager.RTC_WAKEUP, startTimeMillis, pendingIntent); TimerBroadcastReceiver.setCallback(callback); } public long setDailyTimer(TimerCallBack callBack,int hour, int minute) { // 获取当前时间 Calendar calendar = Calendar.getInstance(); int currentHour = calendar.get(Calendar.HOUR_OF_DAY); int currentMinute = calendar.get(Calendar.MINUTE); // 设置下一次任务触发的时间为指定的时间 calendar.set(Calendar.HOUR_OF_DAY, hour); calendar.set(Calendar.MINUTE, minute); calendar.set(Calendar.SECOND, 0); Log.d("time_order", "setNext: "+hour+"//"+minute); // 如果当前时间已经超过指定时间,则将任务触发时间设置为明天的指定时间 if (currentHour > hour || (currentHour == hour && currentMinute >= minute)) {calendar.add(Calendar.DAY_OF_MONTH, 1); Log.d("time_order", "setDailyTimer: 已设置明天1"); }else{ Log.d("time_order", "setDailyTimer: 未超时"); } return calendar.getTimeInMillis(); // 设置定时任务 } public void setNext(TimerCallBack callBack,int hour,int minute){ long setDailyTimer = setDailyTimer(callBack,hour, minute); setTimer(setDailyTimer,callBack); Log.d("time_order", "setDailyTimer: 已设置明天2"); } }
通过TimerManager设置任务时间,到达指定时间进行任务,然后进行创建明天的任务
public interface TimerCallBack { void onTimerTriggered(); }
通过TimerCallBack接口可以在Activity中制定自己想要的任务逻辑
public class TimerBroadcastReceiver extends BroadcastReceiver { private static TimerCallBack callback; public static void setCallback(TimerCallBack callback) { TimerBroadcastReceiver.callback = callback; } @Override public void onReceive(Context context, Intent intent) { if (callback != null) { callback.onTimerTriggered(); } } }
到达任务时间后,Android 发送一条系统广播,通过本类获取到广播后调用callBack,执行代码逻辑
public class MainActivity extends AppCompatActivity implements TimerCallBack { private TimerManager timerManager; private final int hour=2; private final int minute=15; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); timerManager = new TimerManager(this); long setDailyTimer = timerManager.setDailyTimer(this,hour, minute); timerManager.setTimer(setDailyTimer,this); } @Override public void onTimerTriggered() { Log.d("time_order", "onTimerTriggered: 触发"); timerManager.setNext(this,hour,minute); } }
通过Activity调用
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WAKE_LOCK" /><application ... <receiver android:name=".TimerBroadcastReceiver" /> <activity android:name=".MainActivity" android:exported="true" > <intent-filter> <action android:name="android.intent.action.TIME_SET" /> <action android:name="android.intent.action.TIMEZONE_CHANGED" /> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.DROPBOX_ENTRY_ADDED" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
MainFest 文件获取权限
-----------------------------------------------------------------------------------------
*注前一版本TimerManager有Bug,没有准确定位到第二天,现已修复