当前位置: 首页 > news >正文

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);}}
}

http://www.lryc.cn/news/215615.html

相关文章:

  • Opencv实现的三次样条曲线(Cubic Spline)插值
  • 【ElasticSearch系列-03】ElasticSearch的高级句法查询Query DSL
  • 【C++ 系列文章 -- 程序员考试 201811 下午场 C++ 专题 】
  • javaEE -15( 13000字 JavaScript入门 - 2)
  • AWS SAP-C02教程11-解决方案
  • ClickHouse Java多参UDF
  • 修改Typora默认微软雅黑字体
  • ESP32网络开发实例-Web服务器显示LM35传感器数据
  • ATFX汇市:美联储11月利率决议再暂停加息,紧缩货币政策或已接近尾声
  • g.Grafana之Gauge的图形说明
  • MySQL笔记--Ubuntu安装MySQL并基于C++测试API
  • 与AI对话的艺术:如何优化Prompt以获得更好的响应反馈
  • outlook是什么软件outlook邮箱撤回邮件方法
  • 电脑如何录制小视频
  • vue使用百度富文本
  • 【Springboot】集成Swagger
  • [SpringCloud | Linux] CentOS7 部署 SpringCloud 微服务
  • 阿里面试:让代码不腐烂,DDD是怎么做的?
  • NoSQL数据库使用场景以及架构介绍
  • RFID系统提升物流信息管理效率应用解决方案
  • ONNX的结构与转换
  • vue3中,使用html2canvas截图包含视频、图片、文字的区域
  • 后端神器!代码写完直接调试!
  • MATLAB | 万圣节来画个简单的可爱鬼叭!
  • 贪心算法学习------优势洗牌
  • 音视频rtsp rtmp gb28181在浏览器上的按需拉流
  • Java 算法篇-深入了解二分查找法
  • Data-Centric Financial Large Language Models
  • 【HarmonyOS】服务卡片 API6 JSUI跳转不同页面并携带参数
  • SQL server数据库端口访问法