本文主要是介绍AlarmManager闹钟管理者,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
AlarmManager是Android提供的一个全局定时器,利用系统闹钟定时发送广播。这样做的好处是:如果App提前注册闹钟的广播接收器,即使App退出了,只要定时到达,App就会被唤醒响应广播事件。
AlarmManager设置的PendingIntent待定意图,只要未cancel,就会按时启动,无论程序是否关闭。
请注意,静态注册的广播接收者在即使程序关闭也依然生效;动态注册的广播接收者在程序关闭后自动注销,动态注册的广播接收者也可使用unregisterReceiver()手动注销。在Android8.0以后,只有小部分接收系统广播的广播接收者允许静态注册;其他广播接收者只能动态注册,否则收不到广播。
一、使用方法
(1) 创建用于广播的Intent(意图)
Intent intent=new Intent();
intent.setAction( "MyTestBroadcast" );
(2) 创建发送广播的PendingIntent(待定意图)
PendingIntent pendingIntent=PendingIntent.getBroadcast(MainActivity.this,2333,intent,PendingIntent.FLAG_IMMUTABLE);
第一个参数为环境;第二个参数为请求码;第三个参数为要执行的Intent(意图);第四个参数为请求时PendingIntent已存在的解决方案。
(3) 创建执行PendingIntent的时间
//创建Calendar
Calendar calendar=Calendar.getInstance();
//将时间设置为当前时间
calendar.setTimeInMillis(System.currentTimeMillis());
//增加时间
calendar.add(Calendar.SECOND,7);
//获取最终时间
long time=calendar.getTimeInMillis();
(4) 创建AlarmManager并设置PendingIntent
//创建AlarmManager闹钟管理者
AlarmManager alarmManager= (AlarmManager) getSystemService(ALARM_SERVICE);
//设置闹钟
alarmManager.set(AlarmManager.RTC_WAKEUP,time,pendingIntent);
alarmManager.set()方法的参数:第一个参数为闹钟类型,第二个参数为long型的执行PendingIntent的时间,第三个参数为到达时间后执行的PendingIntent。
二、闹钟类型
(1) ELAPSED_REALTIME : 以手机开机时间为基准。
(2) ELAPSED_REALTIME_WAKEUP : 以手机开机时间为基准,并且可以在休眠时发出广播。
(3) RTC : 以UTC标准时间为基准。
(4) RTC_WAKEUP 【常用】:以 UTC标准时间为基准,并且可以在休眠时发出广播。
三、使用AlarmManager
//创建Intent意图,用于发送广播
Intent intent=new Intent().setAction("MyTestBroadcast");
//根据Intent意图创建PendingIntent等待意图
PendingIntent pendingIntent=PendingIntent.getBroadcast(MainActivity.this,2333,intent,PendingIntent.FLAG_IMMUTABLE);//获取执行时间
//创建Calendar
Calendar calendar=Calendar.getInstance();
//将时间设置为当前时间
calendar.setTimeInMillis(System.currentTimeMillis());
//增加时间
calendar.add(Calendar.SECOND,7);
//获取最终时间
long time=calendar.getTimeInMillis();//创建AlarmManager闹钟管理者
AlarmManager alarmManager= (AlarmManager) getSystemService(ALARM_SERVICE);
//设置闹钟
alarmManager.set(AlarmManager.RTC_WAKEUP,time,pendingIntent);
四、例子
1.创建广播接收者
AndroidManifest.xml清单文件
<application......><receiverandroid:name=".MyBroadcastReceiver"android:enabled="true"android:exported="true"></receiver><activity......>......</activity>
</application>
MyBroadcastReceiver.java文件
public class MyBroadcastReceiver extends BroadcastReceiver{private Context context;public MyBroadcastReceiver(Context context){this.context=context;}public void onReceive(Context context, Intent intent) {//广播接收者NotificationManager notificationManager= (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {NotificationChannel notificationChannel=new NotificationChannel("id","name",NotificationManager.IMPORTANCE_HIGH);notificationManager.createNotificationChannel(notificationChannel);}Notification.Builder builder=new Notification.Builder(context);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {builder.setChannelId("id");}builder.setContentText("接收到广播");builder.setSmallIcon(R.drawable.icon2);builder.setWhen(System.currentTimeMillis());builder.setAutoCancel(true);Notification notification=builder.build();notificationManager.notify(2333,notification);}
}
2.注册广播接收者&&设置定时发送广播闹钟
MainActivity.java文件
public class MainActivity extends AppCompatActivity {private MyBroadcastReceiver myBroadcastReceiver;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//注册广播接收者-接收"MyTestBroadcast"广播myBroadcastReceiver=new MyBroadcastReceiver(MainActivity.this);IntentFilter intentFilter=new IntentFilter();intentFilter.addAction("MyTestBroadcast");registerReceiver(myBroadcastReceiver,intentFilter);//获取控件Button button=findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {public void onClick(View view) {//创建Intent意图,用于发送广播Intent intent=new Intent().setAction("MyTestBroadcast");//根据Intent意图创建PendingIntent等待意图PendingIntent pendingIntent=PendingIntent.getBroadcast(MainActivity.this,2333,intent,PendingIntent.FLAG_IMMUTABLE);//获取执行时间//创建CalendarCalendar calendar=Calendar.getInstance();//将时间设置为当前时间calendar.setTimeInMillis(System.currentTimeMillis());//增加时间calendar.add(Calendar.SECOND,7);//获取最终时间long time=calendar.getTimeInMillis();//创建AlarmManager闹钟管理者AlarmManager alarmManager= (AlarmManager) getSystemService(ALARM_SERVICE);//设置闹钟alarmManager.set(AlarmManager.RTC_WAKEUP,time,pendingIntent);//销毁页面MainActivity.this.finish();}});}protected void onDestroy() {super.onDestroy();// 不 注销广播接收者if(myBroadcastReceiver!=null){//unregisterReceiver(myBroadcastReceiver);}}
}
这篇关于AlarmManager闹钟管理者的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!