全局定时器AlarmManager

来源:互联网 发布:软件产业基地4栋 编辑:程序博客网 时间:2024/06/05 16:44

前面介绍的时间服务的作用域都是应用程序,也就是说,将当前的应用程序关闭后,时间服务就会停止。但在很多时候,需要时间服务不依赖应用程序而存在。也就是说,虽然是应用程序启动的服务,但即使将应用程序关闭,服务仍然可以正常运行。

为了达到服务与应用程序独立的目的,需要获得AlarmManager对象。该对象需要通过如下代码获得:

  1. AlarmManager alarmManager = (AlarmManager)
    getSystemService(Context.ALARM_SERVICE); 

AlarmManager类的一个非常重要的方法是setRepeating,通过该方法,可以设置执行时间间隔和相应的动作。setRepeating方法的定义如下:

  1. public void setRepeating(int type, long triggerAtTime,
    long interval, PendingIntent operation); 

setRepeating方法有4个参数,这些参数的含义如下:

type:表示警报类型,一般可以取的值是AlarmManager.RTC和AlarmManager.RTC_WAKEUP。如果将type参数值设为AlarmManager.RTC,表示是一个正常的定时器,如果将type参数值设为AlarmManager.RTC_WAKEUP,除了有定时器的功能外,还会发出警报声(例如,响铃、震动)。

triggerAtTime:第1次运行时要等待的时间,也就是执行延迟时间,单位是毫秒。

interval:表示执行的时间间隔,单位是毫秒。

operation:一个PendingIntent对象,表示到时间后要执行的操作。PendingIntent与Intent类似,可以封装Activity、BroadcastReceiver和Service。但与Intent不同的是,PendingIntent可以脱离应用程序而存在。

从setRepeating方法的4个参数可以看出,使用setRepeating方法最重要的就是创建PendingIntent对象。例如,在下面的代码中用PendingIntent指定了一个Activity。

  1. Intent intent = new Intent(this, MyActivity.class);  
  2. PendingIntent pendingActivityIntent = PendingIntent.
    getActivity(this, 0,intent, 0); 

在创建完PendingIntent对象后,就可以使用setRepeating方法设置定时器了,代码如下:

  1. AlarmManager alarmManager = (AlarmManager) 
    getSystemService(Context.ALARM_SERVICE);  
  2. alarmManager.setRepeating(AlarmManager.RTC, 
    0, 5000, pendingActivityIntent); 

执行上面的代码,即使应用程序关闭后,每隔5秒,系统仍然会显示MyActivity。如果要取消定时器,可以使用如下代码:

  1. alarmManager.cancel(pendingActivityIntent); 

运行本节的例子,界面如图8.20所示。单击【GetActivity】按钮,然后关闭当前应用程序,会发现系统5秒后会显示MyActivity。关闭MyActivity后,在5秒后仍然会再次显示MyActivity。

本节只介绍了如何用PendingIntent来指定Activity,读者在实例50和实例51中将会看到利用BroadcastReceiver和Service执行定时任务。

实例50:定时更换壁纸

工程目录:src\ch08\ch08_changewallpaper

使用AlarmManager可以实现很多有趣的功能。本例中将实现一个可以定时更换手机壁纸的程序。在编写代码之前,先来看一下如图8.21所示的效果。单击【定时更换壁纸】按钮后,手机的壁纸会每隔5秒变换一次。

 图8.20  全局定时器(显示Activity) 图8.21  定时更换壁纸本例使用Service来完成更换壁纸的工作,下面先编写一个Service类,代码如下:
  1. package net.blogjava.mobile;  
  2.  
  3. import java.io.InputStream;  
  4. import android.app.Service;  
  5. import android.content.Intent;  
  6. import android.os.IBinder;  
  7.  
  8. public class ChangeWallpaperService extends Service  
  9. {  
  10.     private static int index = 0;  
  11.     //  保存res\raw目录中图像资源的ID  
  12.     private int[] resIds = new int[]{ R.raw.wp1,
    R.raw.wp2, R.raw.wp3, R.raw.wp4, R.raw.wp5};  
  13.     @Override  
  14.     public void onStart(Intent intent, int startId)  
  15.     {  
  16.         if(index == 5)  
  17.             index = 0;  
  18.         //  获得res\raw目录中图像资源的InputStream对象  
  19.         InputStream inputStream = getResources().
    openRawResource(resIds[index++]);  
  20.         try  
  21.         {  
  22.             //  更换壁纸  
  23.             setWallpaper(inputStream);  
  24.         }  
  25.         catch (Exception e)  
  26.         {  
  27.         }  
  28.         super.onStart(intent, startId);  
  29.     }  
  30.     @Override  
  31.     public void onCreate()  
  32.     {  
  33.         super.onCreate();  
  34.     }  
  35.     @Override  
  36.     public IBinder onBind(Intent intent)  
  37.     {  
  38.         return null;  
  39.     }  
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 把人打伤没钱赔怎么办 小孩不小心打伤了老师怎么办 高考进了三段怎么办 工作中和领导产生冲突怎么办 酒店不给员工发工资怎么办 裙子没有解开超市的锁怎么办 接待老外听不懂他说的怎么办 脚脱皮又痒又臭怎么办 成都应聘平面模特被骗了怎么办 文明6开场一堆蛮族怎么办 幼儿园里出了水痘怎么办 穿高跟鞋脚容易出汗怎么办 粗跟鞋走路太响怎么办 粗跟鞋鞋跟很响怎么办 皮鞋跟走路太响怎么办 穿高跟鞋脚崴了怎么办 高跟鞋小了一码怎么办 高跟皮鞋磨脚怎么办 大同同煤集团三供一业人员怎么办 小孩被猫咪抓了怎么办 长得特别丑的人怎么办 锅巴放的不脆了怎么办 淘宝买到假货了怎么办 单位不给解约函怎么办 安卓个人热点打不开怎么办 密码忘记无法进入主机怎么办 流放之路w10闪退怎么办 电脑网站被劫持了怎么办 苹果手机浏览器被劫持怎么办 苹果手机网站被劫持怎么办 a37手机网站被劫持怎么办 耳朵被震的耳鸣怎么办 液晶电视怎么办断屏坏还是逻辑板 门保险拧坏了怎么办 锁的保险坏了怎么办 鞋子里面长霉了怎么办 塑料瓶盖滑丝了怎么办? 塑料杯盖滑丝了怎么办 洗衣机上的订子很难扭出来怎么办 滚筒洗衣机坏了打不开门怎么办 海尔滚筒洗衣机打不开门怎么办