AlarmManager是Android提供的全局定时器,利用系统闹钟定时发送广播。可以实现定时执行代码的目的。只要我们APP在后台运行,那么我们就可以定时执行我们的代码。当然,由于高版本Android对于系统安全性的提高,我们可能无法做到唤起APP的目的,不过做一些定时执行的任务还是可以的。
我们具体实现的代码如下
public class MainActivity extends AppCompatActivity {
private Button bt_nz;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_nz = findViewById(R.id.bt_nz);
bt_nz.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 创建一个广播事件的意图
Intent intent = new Intent(ALARM_EVENT);
// 创建一个用于广播的延迟意图
PendingIntent pIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
// 从系统服务中获取闹钟管理器
AlarmManager alarmMgr = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
// 给当前时间加上若干秒
calendar.add(Calendar.SECOND, 5);
// 开始设定闹钟,延迟若干秒后,携带延迟意图发送闹钟广播
alarmMgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
}
});
}
// 声明一个闹钟广播事件的标识串
private String ALARM_EVENT = "com.example.senior.AlarmActivity.AlarmReceiver";
private static String mDesc = ""; // 闹钟时间到达的描述
private static boolean isArrived = false; // 闹钟时间是否到达
// 定义一个闹钟广播的接收器
public static class AlarmReceiver extends BroadcastReceiver {
// 一旦接收到闹钟时间到达的广播,马上触发接收器的onReceive方法
public void onReceive(Context context, Intent intent) {
if (intent != null) {
if (!isArrived) {
isArrived = true;
//TODO 接收到闹钟到达广播的动作
Intent intent1 = new Intent(context, MainActivity.class);
context.startActivity(intent1);
}
}
}
}
// 适配Android9.0开始
@Override
public void onStart() {
super.onStart();
// 从Android9.0开始,系统不再支持静态广播,应用广播只能通过动态注册
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// 创建一个闹钟的广播接收器
alarmReceiver = new AlarmReceiver();
// 创建一个意图过滤器,只处理指定事件来源的广播
IntentFilter filter = new IntentFilter(ALARM_EVENT);
// 注册广播接收器,注册之后才能正常接收广播
registerReceiver(alarmReceiver, filter);
}
}
@Override
public void onStop() {
super.onStop();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// 注销广播接收器,注销之后就不再接收广播
unregisterReceiver(alarmReceiver);
}
}
// 声明一个闹钟的广播接收器
private AlarmReceiver alarmReceiver;
// 适配Android9.0结束
}
清单文件中配置
<receiver android:name=".MainActivity$AlarmReceiver" >
<intent-filter>
<action android:name="com.example.senior.ScheduleDetailActivity.AlarmReceiver" />
</intent-filter>
</receiver>
这样我们如果版本高于9.0,可以实现我们要的定时任务。如果版本低于9.0我们也可以实现我们想要的即使退出app依旧可以执行代码的目的。