Android中AlarmManager使用示例(持续更新,已经更改) - 潘侯爷

panhouye 2021-08-15 原文


Android中AlarmManager使用示例(持续更新,已经更改)

现在普遍的手机都会有一个闹钟的功能,如果使用Android来实现一个闹钟可以使用AtarmManager来实现。AtarmManager提供了一种系统级的提示服务,允许你安排在将来的某个时间执行一个服务。AlarmManager对象一般不直接实例化,而是通过Context.getsystemservice(Context.ALARM_SERVICE)方法获得。

下面是我们运用之前用到的TimePickerDialog结合AlarmManager,实现一个可以设定任意时间而且可以重复的闹钟,演示效果如下(大概每晚23:48会有闹钟通知):

layout中activity_main.xml布局文件代码:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout
 3     xmlns:android="http://schemas.android.com/apk/res/android"
 4     xmlns:tools="http://schemas.android.com/tools"
 5     android:id="@+id/activity_main"
 6     android:layout_width="match_parent"
 7     android:layout_height="match_parent"
 8     android:orientation="vertical"
 9     tools:context="com.example.administrator.alarmdemo.MainActivity">
10     <TextView
11         android:id="@+id/time_tv"
12         android:layout_width="match_parent"
13         android:layout_height="wrap_content"
14         android:hint="请设置闹铃时间"
15         android:clickable="true"
16         android:onClick="setTime"
17         android:gravity="center"/>
18     <TextView
19         android:id="@+id/time_tv2"
20         android:layout_width="match_parent"
21         android:layout_height="wrap_content"
22         android:hint="请设置响铃间隔时间"
23         android:clickable="true"
24         android:onClick="setIntervalTime"
25         android:gravity="center"/>
26     <Button
27         android:layout_width="match_parent"
28         android:layout_height="wrap_content"
29         android:onClick="open"
30         android:text="开启闹钟"/>
31     <Button
32         android:layout_width="match_parent"
33         android:layout_height="wrap_content"
34         android:onClick="stop"
35         android:text="结束闹钟"/>
36 </LinearLayout>

AndroidMainfest.xml配置文件(添加自定义重复闹铃receiver):

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.example.administrator.alarmdemo">
 4     <application
 5         android:allowBackup="true"
 6         android:icon="@mipmap/ic_launcher"
 7         android:label="@string/app_name"
 8         android:supportsRtl="true"
 9         android:theme="@style/AppTheme">
10         <activity android:name=".MainActivity">
11             <intent-filter>
12                 <action android:name="android.intent.action.MAIN" />
13 
14                 <category android:name="android.intent.category.LAUNCHER" />
15             </intent-filter>
16         </activity>
17         <receiver
18             android:name=".RepeatAlarmReceiver"
19             android:enabled="true"
20             android:exported="true">
21             <intent-filter>
22                 <action android:name="repeatAlarm" />
23             </intent-filter>
24         </receiver>
25         <activity android:name=".Main2Activity"></activity>
26     </application>
27 
28 </manifest>

RepeatAlarmReceiver.java广播接收文件:

 1 import android.content.BroadcastReceiver;
 2 import android.content.Context;
 3 import android.content.Intent;
 4 import android.widget.Toast;
 5 
 6 public class RepeatAlarmReceiver extends BroadcastReceiver {
 7     public RepeatAlarmReceiver() {
 8     }
 9     @Override
10     public void onReceive(Context context, Intent intent) {
11         Toast.makeText(context, "重复闹钟", Toast.LENGTH_SHORT).show();
12     }
13 }

MainActivity.java代码实现:

 1 import android.app.AlarmManager;
 2 import android.app.PendingIntent;
 3 import android.app.TimePickerDialog;
 4 import android.content.Intent;
 5 import android.provider.Settings;
 6 import android.support.v7.app.AppCompatActivity;
 7 import android.os.Bundle;
 8 import android.view.View;
 9 import android.widget.TextView;
10 import android.widget.TimePicker;
11 import java.util.Calendar;
12 public class MainActivity extends AppCompatActivity {
13     AlarmManager alarmManagerSet;
14     PendingIntent pendingIntentSet;
15     int myHour,myMinute;//声明响铃时间
16     int intervalHour,intervalMinute,intervalSecond;//声明间隔时间(响铃周期)
17     Calendar calendar;//声明日历
18     TextView time_tv,time_tv2;
19 
20     @Override
21     protected void onCreate(Bundle savedInstanceState) {
22         super.onCreate(savedInstanceState);
23         setContentView(R.layout.activity_main);
24         alarmManagerSet= (AlarmManager) getSystemService(ALARM_SERVICE);
25         //设置声明时间格式
26         calendar = Calendar.getInstance();
27         myHour=calendar.get(Calendar.HOUR_OF_DAY);
28         myMinute=calendar.get(Calendar.MINUTE);
29         intervalHour=calendar.get(Calendar.HOUR_OF_DAY);
30         intervalMinute=calendar.get(Calendar.MINUTE);
31         //获取时间设置的TextView
32         time_tv= (TextView) findViewById(R.id.time_tv);
33         time_tv2= (TextView) findViewById(R.id.time_tv2);
34     }
35     //使用timePickerDialog设置闹铃响铃时间
36     public void setTime(View view){
37         TimePickerDialog timePickerDialog =new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
38             @Override
39             public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
40                 myHour=hourOfDay;
41                 myMinute=minute;
42                 time_tv.setText(myHour+":"+myMinute);
43             }
44         },myHour,myMinute,true);
45         timePickerDialog.show();
46     }
47     //使用timePickerDialog设置闹铃响铃周期(间隔)
48     public void setIntervalTime(View view){
49         TimePickerDialog timePickerDialog =new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
50             @Override
51             public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
52                 intervalHour=hourOfDay;
53                 intervalMinute=minute;
54                 time_tv2.setText(intervalHour+":"+intervalMinute);
55             }
56         },intervalHour,intervalMinute,true);
57         timePickerDialog.show();
58     }
59     public void open(View view){
60         //分别获取闹铃响铃时间以及闹铃间隔时间(用冒号分割存储于数组中)
61         String[] triggerTime=time_tv.getText().toString().split(":"); 
62         String[] intervalTime=time_tv2.getText().toString().split(":");
63         //通过Calendar分别获取对应的小时和分钟(需要将String转换为int)
64         Calendar calendar1 = Calendar.getInstance();
65         calendar1.set(Calendar.HOUR_OF_DAY,Integer.parseInt(triggerTime[0]));
66         calendar1.set(Calendar.MINUTE,Integer.parseInt(triggerTime[1]));
67         //得到点击触发的毫秒值(即闹钟提醒时间)
68         long triggerAtMillis= calendar1.getTimeInMillis();
69         //设定pendinngIntent接受自定义闹铃广播
70         pendingIntentSet = PendingIntent.getBroadcast(this,0,new Intent("repeatAlarm"),0);
71         //判断如果当前系统时间大于设置的闹铃时间,则在第二天开始启用该闹铃
72         if(System.currentTimeMillis()>triggerAtMillis){
73             triggerAtMillis=triggerAtMillis+24*60*60*1000;
74         }
75         //使用.setRepeating设置重复闹铃
76         alarmManagerSet.setRepeating(AlarmManager.RTC_WAKEUP,triggerAtMillis,intervalMillis,pendingIntentSet);
77     }
78     public void stop(View v){
79         alarmManagerSet.cancel(pendingIntentSet);
80     }
81 }

 

发表于
2016-12-14 00:03 
潘侯爷 
阅读(1631
评论(1
编辑 
收藏 
举报

 

版权声明:本文为panhouye原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/panhouye/p/6175633.html

Android中AlarmManager使用示例(持续更新,已经更改) - 潘侯爷的更多相关文章

  1. 静态代码分析工具 – Ivan Sun

    静态代码分析工具 目前项目中使用 Klocwork Insight 进行源代码分析。 每天晚上用分析工具检查代 […]...

  2. Word 通过尾注插入参考文献 – 任重道远-HSY

    Word 通过尾注插入参考文献 一步:把鼠标移到论文要插入的位置,然后点击引用; 第二步:点击插入尾注; 第三 […]...

  3. 非常适合新手的一个Python爬虫项目: 打造一个英文词汇量测试脚本! – python小玩家

    非常适合新手的一个Python爬虫项目: 打造一个英文词汇量测试脚本! 最近朋友在苦学英文,但是又不知道自己学 […]...

  4. 01-支付SDK(系统繁忙)-坑爹 – 袁晓俊

    01-支付SDK(系统繁忙)-坑爹 支付宝iOS SDK的那些坑(系统繁忙,请稍后再试) 前言 支付宝的iOS […]...

  5. 如何做好性能测试_流程篇 – 锅边糊

    如何做好性能测试_流程篇     性能测试阶段划分为需求阶段、测试准备、测试过程和测试结束四个阶段。根据个人性 […]...

  6. html打造动画【系列2】- 可爱的蛙蛙表情 – 狙击手+

    html打造动画【系列2】- 可爱的蛙蛙表情 可爱的小青蛙,一定想不到 先感受一下全部表情包: 在开始之前先安 […]...

  7. 50个带给你灵感的基于文字的创新Logo设计 – 第一部分

    日期:2011/11/21  GBin1.com 基于文字的logo是设计者根据文字形状发挥想象创意的设计。L […]...

  8. Dynamic CRM 2013学习笔记(四十一)流程4 – 异步工作流(Workflow)用法图解

    在CRM 2013 里,工作流被分成二类:异步工作流和实时工作流。异步工作流依赖一个windows 服务: M […]...

随机推荐

  1. 大脑

    神经学专家保罗.麦克里恩提出假设,设想人类颅腔内的脑并非只有一个,而是三个。 这三个脑作为人类进化不同阶段的产 […]...

  2. 数据结构 集合_集合接口的定义

    set_init void set_init(Set *set,int(*match)(vonst void […]...

  3. Json的动态解析

     最近在项目中需要动态解析json,但解析json的方式有很多,如何合理的解析就是我们需要考虑的问题?比如Ne […]...

  4. Kubernetes笔记(三):Gitlab+Jenkins Pipeline+Docker+k8s+Helm自动化部署实践(干货分享!)

    通过前面两篇文章,我们已经有了一个“嗷嗷待哺”的K8s集群环境,也对相关的概念与组件有了一个基本了解(前期对概 […]...

  5. 内存泄露检测工具Valgrind

    本文简单介绍内存泄露和一款linux下的检测工具Valgrind。 内存泄露简介 什么是内存泄漏   内存泄漏 […]...

  6. JS获取当前时间并格式化

    JS的日期操作: var myDate = new Date(); myDate.getYear(); //获 […]...

  7. python的注释方法\\行连接符

    1、单行注释: # 注释…. 2、块注释: \’\’\’ 这是 […]...

  8. one 策略模式 strategy

    –读书笔记 定义 策略模式--定义算法簇,分别封装起来,让他们之间可以互相替换,此模式让算法的变化 […]...

展开目录

目录导航