AlarmManager闹钟管理者

news/2024/7/23 21:30:32 标签: android, java

AlarmManager是Android提供的一个全局定时器,利用系统闹钟定时发送广播。这样做的好处是:如果App提前注册闹钟的广播接收器,即使App退出了,只要定时到达,App就会被唤醒响应广播事件。

AlarmManager设置的PendingIntent待定意图,只要未cancel,就会按时启动,无论程序是否关闭。

广播接收者在注册后只要未注销,就依然生效,无论程序是否关闭。

一、使用方法

(1) 创建用于广播的Intent(意图)

java">Intent intent=new Intent();
intent.setAction( "MyTestBroadcast" );

(2) 创建发送广播的PendingIntent(待定意图)

java">PendingIntent pendingIntent=PendingIntent.getBroadcast(MainActivity.this,2333,intent,PendingIntent.FLAG_IMMUTABLE);

第一个参数为环境;第二个参数为请求码;第三个参数为要执行的Intent(意图);第四个参数为请求时PendingIntent已存在的解决方案。 

(3) 创建执行PendingIntent的时间

java">//创建Calendar
Calendar calendar=Calendar.getInstance();
//将时间设置为当前时间
calendar.setTimeInMillis(System.currentTimeMillis());
//增加时间
calendar.add(Calendar.MILLISECOND,7);
//获取最终时间
long time=calendar.getTimeInMillis();

(4) 创建AlarmManager并设置PendingIntent

java">//创建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

java">//创建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.MILLISECOND,7);
//获取最终时间
long time=calendar.getTimeInMillis();

//创建AlarmManager闹钟管理者
AlarmManager alarmManager= (AlarmManager) getSystemService(ALARM_SERVICE);
//设置闹钟
alarmManager.set(AlarmManager.RTC_WAKEUP,time,pendingIntent);

四、例子

1.创建广播接收者

AndroidManifest.xml清单文件

<application
    ......>

    <receiver
        android:name=".MyBroadcastReceiver"
        android:enabled="true"
        android:exported="true"></receiver>


    <activity
        ......>
        ......
    </activity>
</application>

MyBroadcastReceiver.java文件

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文件

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

                //获取执行时间
                //创建Calendar
                Calendar calendar=Calendar.getInstance();
                //将时间设置为当前时间
                calendar.setTimeInMillis(System.currentTimeMillis());
                //增加时间
                calendar.add(Calendar.MILLISECOND,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.niftyadmin.cn/n/5139325.html

相关文章

Nginx域名重定向(如何访问的域名和实际的数据请求路径不同,可解决前端跨域)

感情需要被抑制&#xff0c;不能泛滥… 当需要将一个域名重定向到另一个域名并且用户仍然看到原始域名时&#xff0c;Nginx是一个强大的工具。这种场景通常涉及到反向代理或重写URL的技巧。在本篇博客中&#xff0c;我们将详细介绍如何使用Nginx来实现这个目标&#xff0c;以及…

KanTts最小安装-ubuntu

为什么选它&#xff1f; 克隆有很多&#xff0c;为什么选它&#xff0c;它是中国人做的&#xff0c;阿里达摩院&#xff0c;5分钟音频数据集就够了。 国内做的有什么好处&#xff0c;因为大家都是中国人&#xff0c;说的是中国话&#xff0c;技术最大的难题不是基础&#xff…

达梦数据库快速配置主备

主备机服务器初始化数据库实例并启动数据库 主机操作&#xff1a; 创建数据库实例&#xff1a; cd /opt/dmdbms/bin/bin ./dminit path/opt/dmdbms/data page_size32 extent_size32 log_size2048 case_sensitiven charset1 length_in_char1 db_nameDAMENG instance_nameDMSERV…

Web - Servlet详解

目录 前言 一 . Servlet简介 1.1 动态资源和静态资源 1.2 Servlet简介 二 . Servlet开发流程 2.1 目标 2.2 开发过程 三 . Servlet注解方式配置 ​编辑 四 . servlet生命周期 4.1 生命周期简介 4.2 生命周期测试 4.3 生命周期总结 五 . servlet继承结构 5.1 ser…

Simulink的To Workspace

To Workspace模块将Simulink产生的数据存储到matlab的工作区。 用To Workspace模块中的数据进行绘图。 参见Matlab/simulink/simscape multibody-to wotkspace模块使用_to workspace模块_五VV的博客-CSDN博客

【资源分享】wukong-release数据集分享

【资源分享】wukong-release数据集分享 链接: https://pan.baidu.com/s/1ZShifhp-sUmxYoWPIgS_wA?pwdkdww 提取码: kdww --来自百度网盘超级会员v6的分享

2022最新版-李宏毅机器学习深度学习课程-P32 Transformer

一、 seq2seq 1. 含义 输入一个序列&#xff0c;机器输出另一个序列&#xff0c;输出序列长度由机器决定。 文本翻译&#xff1a;文本至文本&#xff1b;  语音识别&#xff1a;语音至文本&#xff1b;  语音合成&#xff1a;文本至语音&#xff1b;  聊天机器人&#…

input和原生js文件上传

1.input上传 input 标签主要有以下几个属性 accept 设置上传文件的类型&#xff0c;默认为空&#xff0c;表示可以上传所有类型文件。常见的 MIME typescapture 摄像头&#xff0c;user 前置摄像头 environment 后置摄像头multiple 是否可以选多个文件 默认falsewebkitdirecto…