zoukankan      html  css  js  c++  java
  • alarm

    AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟。通过对它的使用,它的作用和Timer有点相似。
    都有两种相似的用法:
    (1)在指定时长后执行某项操作

    (2)周期性的执行某项操作

    在android系统中,底层系统提供了两种类型的时钟,软时钟与硬时钟,软时钟就是我们常说的 Timer,硬时钟就是RTC。系统在正常运行的情况下,Timer工作提供时间服务和闹铃提醒,而在系统进入睡眠状态后,时间服务和闹铃提醒由RTC来 负责。对于上层应用来说,我们并不需要关心是 timer还是RTC为我们提供服务,因为android系统的Framework层把底层细节做了封装并统一提供API。这个API他的名字就叫 AlarmManager。在android系统中有意思的是对应AlarmManage有一个AlarmManagerServie服务程序,该服务程序 才是正真提供闹铃服务的,它主要维护应用程序注册下来的各类闹铃并适时的设置即将触发的闹铃给闹铃设备(在android系统中,linux实现的设备名为 "/dev/alarm"),并且一直监听闹铃设备,一旦有闹铃触发或者是闹铃事件发生,AlarmManagerServie服务程序就会遍历闹铃列表 找到相应的注册闹铃并发出广播。该服务程序在系统启动时被系统服务程序system_service启动并初始化闹铃设备(/dev/alarm)。当 然,在Java层的AlarmManagerService与Linux Alarm驱动 程序接口之间还有一层封装,那就是JNI。
           AlarmManager将应用与服务分割开来后,使得应用程序开发者不用关心具体的服务,而是直接通过AlarmManager来使用这种服务。这也 许就是客户/服务模式的好处吧。AlarmManager与AlarmManagerServie之间是通过Binder来通信 的,他们之间是多对一的关系。在android系统中,AlarmManage 提供了3个接口5种类型的闹铃服务:

           3个API调用接口: 

    Java代码:

    1. void cancel(PendingIntent operation)
    2. // 取消已经注册的与参数匹配的闹铃
    3. void set ( int type, long triggerAtTime, PendingIntent operation)
    4. // 注册一个新的闹铃
    5. void setRepeating( int type, long triggerAtTime, long interval, PendingIntent operation)
    6. // 注册一个重复类型的闹铃
    7. void setTimeZone( String timeZone)
    8. // 设置时区
    复制代码


           5种闹铃类型:

    Java代码:

    1. public static final int ELAPSED_REALTIME
    2. /当 系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时间, 可以通过调用SystemClock.elapsedRealtime()获得。系统值是3 (0x00000003)。*/
    3. public static final int ELAPSED_REALTIME_WAKEUP
    4. // 能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。
    5. public static final int RTC
    6. /*当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得。系统值是1 (0x00000001) 。*/
    7. public static final int RTC_WAKEUP
    8. // 能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。
    9. Public static final int POWER_OFF_WAKEUP
    10. /能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为4(0x00000004)。*/ 
    复制代码

    下面写一个闹钟的例子

    主窗体,按钮弹出一个日历控件,以便设置闹钟的时间

    1. public class AlarmTest extends Activity  
    2. {  
    3.     Button setTime;  
    4.     AlarmManager aManager;  
    5.     Calendar currentTime = Calendar.getInstance();  
    6.     @Override  
    7.     public void onCreate(Bundle savedInstanceState)  
    8.     {  
    9.         super.onCreate(savedInstanceState);  
    10.         setContentView(R.layout.main);  
    11.         // 获取程序界面的按钮  
    12.         setTime = (Button) findViewById(R.id.setTime);  
    13.         // 获取AlarmManager对象  
    14.         aManager = (AlarmManager) getSystemService(Service.ALARM_SERVICE);  
    15.         //为“设置闹铃”按钮绑定监听器。  
    16.         setTime.setOnClickListener(new OnClickListener()  
    17.         {  
    18.             @Override  
    19.             public void onClick(View source)  
    20.             {  
    21.                 Calendar currentTime = Calendar.getInstance();  
    22.                 // 创建一个TimePickerDialog实例,并把它显示出来。  
    23.                 new TimePickerDialog(AlarmTest.this,  
    24.                     0, // 绑定监听器  
    25.                     new TimePickerDialog.OnTimeSetListener()  
    26.                     {  
    27.                         @Override  
    28.                         public void onTimeSet(TimePicker tp, int hourOfDay,  
    29.                             int minute)  
    30.                         {  
    31.                             // 指定启动AlarmActivity组件  
    32.                             Intent intent = new Intent(AlarmTest.this  
    33.                                 , AlarmActivity.class);  
    34.                             // 创建PendingIntent对象  
    35.                             PendingIntent pi = PendingIntent.getActivity(  
    36.                                 AlarmTest.this, 0, intent, 0);  
    37.                             Calendar c = Calendar.getInstance();  
    38.                             c.setTimeInMillis(System.currentTimeMillis());  
    39.                             // 根据用户选择时间来设置Calendar对象  
    40.                             c.set(Calendar.HOUR , hourOfDay);  
    41.                             c.set(Calendar.MINUTE , minute);  
    42.                             // 设置AlarmManager将在Calendar对应的时间启动指定组件  
    43.                             aManager.set(AlarmManager.RTC_WAKEUP  
    44.                                 , c.getTimeInMillis(), pi);   
    45.                             // 显示闹铃设置成功的提示信息  
    46.                             Toast.makeText(AlarmTest.this ,   
    47.                                 "闹铃设置成功啦" , 5000).show();  
    48.                         }  
    49.                     }, currentTime.get(Calendar.HOUR_OF_DAY)  
    50.                     , currentTime.get(Calendar.MINUTE), false)  
    51.                     .show();                  
    52.             }  
    53.         });  
    54.     }  
    55. }  


    设置时间到以后,弹出的小窗体,以播放音乐

    1. public class AlarmActivity extends Activity  
    2. {  
    3.     MediaPlayer alarmMusic;  
    4.   
    5.     @Override  
    6.     public void onCreate(Bundle savedInstanceState)  
    7.     {  
    8.         super.onCreate(savedInstanceState);  
    9.         // 加载指定音乐,并为之创建MediaPlayer对象  
    10.         alarmMusic = MediaPlayer.create(this, R.raw.alarm);  
    11.         alarmMusic.setLooping(true);  
    12.         // 播放音乐  
    13.         alarmMusic.start();  
    14.         // 创建一个对话框  
    15.         new AlertDialog.Builder(AlarmActivity.this)  
    16.             .setTitle("闹钟")  
    17.             .setMessage("闹钟响了,Go!Go!Go!")  
    18.             .setPositiveButton(  
    19.                 "确定" ,  
    20.                 new OnClickListener()  
    21.                 {  
    22.                     @Override  
    23.                     public void onClick(DialogInterface dialog , int which)  
    24.                     {  
    25.                         // 停止音乐  
    26.                         alarmMusic.stop();  
    27.                         // 结束该Activity  
    28.                         AlarmActivity.this.finish();  
    29.                     }  
    30.                 }  
    31.             )  
    32.             .show();  
    33.     }  
    34. }  


    最后不要忘了把两个Activity加入到AndroidManifest.xml中

  • 相关阅读:
    『计算机视觉』Mask-RCNN_推断网络其五:目标检测结果精炼
    『TensorFlow』高级高维切片gather_nd
    『计算机视觉』Mask-RCNN_推断网络其四:FPN和ROIAlign的耦合
    『计算机视觉』Mask-RCNN_推断网络其三:RPN锚框处理和Proposal生成
    『计算机视觉』Mask-RCNN_推断网络其二:基于ReNet101的FPN共享网络暨TensorFlow和Keras交互简介
    『计算机视觉』Mask-RCNN_推断网络其一:总览
    在ASP.NET MVC项目中使用React
    详解ABP框架的多租户
    .NET开发者如何愉快的进行微信公众号开发
    微软的R语言发行版本MRO及开发工具RTVS
  • 原文地址:https://www.cnblogs.com/mafeng/p/4390986.html
Copyright © 2011-2022 走看看