zoukankan      html  css  js  c++  java
  • Android之AlarmManager

    AlarmManager 包含的主要方法:

     

     

    1. // 取消已经注册的与参数匹配的定时器     
    2. void   cancel(PendingIntent operation)    
    3. //注册一个新的延迟定时器  
    4. void   set(int type, long triggerAtTime, PendingIntent operation)    
    5. //注册一个重复类型的定时器  
    6. void   setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)    
    7. //注册一个非精密的重复类型定时器  
    8. void setInexactRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)  
    9. //设置时区    
    10. void   setTimeZone(String timeZone)   


     

     

    定时器主要类型:

     

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

     

     

     

    当你的应用不在运行,而此时你仍然需要你的应用去执行一些操作(比如,短信拦截),只有这种时候才使用AlarmManager, 其他正常情况下的,推荐使用Handler。

     

    AlarmManager 生命周期:

    repeating AlarmManager一旦启动就会一直在后台运行(除非执行cancel方法),可以在“应用管理”中看到这个应用状态是正在运行。 “强行停止”可以让Alarmmanager停掉。

    尝试了几种任务管理器, 都只能重置计数器(确实释放内存了),但都无法关闭定时器,只有系统自带的“强行停止”奏效。

     

     

    如果某个AlarmManager已经启动, 程序又再次去启动它,只要PendingIntent是一样,那么之前那个AlarmManager会被release掉。

     

    如何使用AlarmManager?

    使用AlarmManager共有三种方式, 都是通过PendingIntent。

     

    1. getActivity(Context, int, Intent, int)  
    2.   
    3. getBroadcast(Context, int, Intent, int)  
    4.   
    5. getService(Context, int, Intent, int)  


    这边就举一个使用BroadCast的例子。

     

     

    首先是创建一个BroadCast类,需要继承BroadCastReceiver, 如下:

     

    1. /* 
    2.  *  Copyright (c) 2011, Yulong Information Technologies 
    3.  *  All rights reserved. 
    4.  *   
    5.  *  @Project: AlarmTest 
    6.  *  @author: Robot   
    7.  */  
    8. package com.yfz;  
    9.   
    10. import android.content.BroadcastReceiver;  
    11. import android.content.Context;  
    12. import android.content.Intent;  
    13. import android.util.Log;  
    14.   
    15. /** 
    16.  * @author Robot 
    17.  * @weibo http://weibo.com/feng88724 
    18.  * @date Nov 18, 2011    
    19.  */  
    20. public class ActionBroadCast extends BroadcastReceiver {  
    21.       
    22.     private static int num = 0;  
    23.     /* (non-Javadoc) 
    24.      * @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent) 
    25.      */  
    26.     @Override  
    27.     public void onReceive(Context context, Intent intent) {  
    28.         // TODO Auto-generated method stub  
    29.         Log.e("ActionBroadCast""New Message !" + num++);  
    30.     }  
    31.   
    32. }  


    下面就让我们启动AlarmManager, 这边就直接在Activity中启动了, 如下:

     

     

    1. package com.yfz;  
    2.   
    3. import android.app.Activity;  
    4. import android.app.AlarmManager;  
    5. import android.app.PendingIntent;  
    6. import android.content.Intent;  
    7. import android.os.Bundle;  
    8.   
    9. public class AlarmTestActivity extends Activity {  
    10.     /** Called when the activity is first created. */  
    11.     @Override  
    12.     public void onCreate(Bundle savedInstanceState) {  
    13.         super.onCreate(savedInstanceState);  
    14.         setContentView(R.layout.main);  
    15.           
    16.         AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);  
    17.           
    18.         PendingIntent pi = PendingIntent.getBroadcast(this0new Intent(this, ActionBroadCast.class), Intent.FLAG_ACTIVITY_NEW_TASK);  
    19.         long now = System.currentTimeMillis();  
    20.         am.setInexactRepeating(AlarmManager.RTC_WAKEUP, now, 3000, pi);  
    21.     }  
    22. }  

     

    这边用Repeating的方式。 每隔3秒发一条广播消息过去。RTC_WAKEUP的方式,保证即使手机休眠了,也依然会发广播消息。

    最后看一下AndroidManifest文件,主要是注册一下Activity和BroadCast。  (实际使用中最好再加个filter,自己定义一个Action比较好)

     

    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     package="com.yfz"  
    4.     android:versionCode="1"  
    5.     android:versionName="1.0" >  
    6.   
    7.     <uses-sdk android:minSdkVersion="7" />  
    8.   
    9.     <application  
    10.         android:icon="@drawable/ic_launcher"  
    11.         android:label="@string/app_name" >  
    12.         <activity  
    13.             android:label="@string/app_name"  
    14.             android:name=".AlarmTestActivity" >  
    15.             <intent-filter >  
    16.                 <action android:name="android.intent.action.MAIN" />  
    17.   
    18.                 <category android:name="android.intent.category.LAUNCHER" />  
    19.             </intent-filter>  
    20.         </activity>  
    21.         <receiver  
    22.             android:name="ActionBroadCast">  
    23.               
    24.         </receiver>  
    25.     </application>  
    26.   
    27. </manifest>  

    Service的其实也差不多,只要在OnStart()方法中写需要执行的操作即可。

    做了一个例子,包含了使用AlarmManager的所有三种方式。已经上传至CSDN,下载地址: http://download.csdn.net/detail/feng88724/3812718 。 截图:

     

    就写这么多把。

    转载于:http://blog.csdn.net/feng88724/article/details/6989227

  • 相关阅读:
    动态生成 Excel 文件供浏览器下载的注意事项
    JavaEE 中无用技术之 JNDI
    CSDN 泄露用户密码给我们什么启示
    刚发布新的 web 单点登录系统,欢迎下载试用,欢迎提建议
    jQuery jqgrid 对含特殊字符 json 数据的 Java 处理方法
    一个 SQL 同时验证帐号是否存在、密码是否正确
    PostgreSQL 数据库在 Windows Server 2008 上安装注意事项
    快速点评 Spring Struts Hibernate
    Apache NIO 框架 Mina 使用中出现 too many open files 问题的解决办法
    解决 jQuery 版本升级过程中出现 toLowerCase 错误 更改 doctype
  • 原文地址:https://www.cnblogs.com/shortboy/p/2629194.html
Copyright © 2011-2022 走看看