AlarmManager的使用_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > AlarmManager的使用

AlarmManager的使用

 2014/4/3 21:29:53  Kross  博客园  我要评论(0)
  • 摘要:原文地址:http://www.cnblogs.com/kross/p/3643708.htmlAlarmManager可以设定一个规定的时间,或者重复从某一个时间开始,等间隔的做一个操作。可以用来做一个闹钟程序,或者在特定的时间访问互联网。获取AlarmManager和获取系统的其他服务是一样的,使用如下代码:AlarmManageram=(AlarmManager)getSystemService(ALARM_SERVICE)
  • 标签:使用 ARM

原文地址:http://www.cnblogs.com/kross/p/3643708.html

 

AlarmManager可以设定一个规定的时间,或者重复从某一个时间开始,等间隔的做一个操作。可以用来做一个闹钟程序,或者在特定的时间访问互联网。

获取AlarmManager和获取系统的其他服务是一样的,使用如下代码:

AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);

我们通过AlarmManager来发送一条请求到BroadcastReceiver,先简单的实现一个BroadcastReceiver。

public class MyReceiver extends BroadcastReceiver {
    
    private static final String TAG = "MyReceiver";
    
    @Override
    public void onReceive(Context arg0, Intent arg1) {
        Log.i(TAG, "onReceive");
        Log.i(TAG, arg1.getAction());
    }
}

做完这步之后,记得要在Manifest文件里面注册这个类,要不然是没有任何反应的……

然后我们就在MainActivity里面弄一个按钮,按钮的方法里面就创建Intent,让AlarmManager来发送请求。

public void foo(View v) {
    Log.i(TAG, "foo");
    Intent intent = new Intent(this, MyReceiver.class);
    intent.setAction("hahah");
    
    PendingIntent pi = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);

    //开机的时间到当前的时间
    long time = SystemClock.elapsedRealtime();
    
    //am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 5000, pi);
    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 5000, pi);
    Log.i(TAG, "foo over");
}

这里很重要的一点就是这个elapsedRealtime这个东西,经过我的测试,终于发现这个时间是什么东西了。

它是你开机之后到当前的时间,怎么说呢,打个比方吧,假如你关掉手机,然后开机,开机完成后的第一件事就是调用这个SystemClock.elapsedRealtime()方法,你把它转成字符串,得到的时间是1970.01.01 08:00:00

然后你后续的调用都是基于这个时间之上的,比如开机后过了30s,你去调用这个方法,得到的时间就是1970.01.01 08:00:30

如果你又重新启动了手机,时间又会被重置1970.01.01 08:00:00

我看很多博客都没有讲清楚这一点,都是模糊的,照本宣科似得翻译了下文档,看得似懂非懂的。

AlarmManager的set方法就是发一次请求,setRepeating就是重复的发请求,这两个方法的第一个参数都十分的诡异,我并没有真正的搞明白。

其实可以分两组,一组是RLAPSED_REALTIME, RLAPSED_REALTIME_WAKEUP,另一组是RTC, RTC_WAKEUP,这两组的区别在于用的是哪一个时间,RLAPSED_REALTIME这一组用的是SystemClock.elapsedRealtime()取到的时间,让RTC用的就是正常的时间,这两者有什么区别呢,后者RTC,用户可以通过修改手机的时间(就是设置时间嘛,谁都可以做到)来改变,可能会重复调用到AlarmManager。而elapsed realtime是没有办法的。

然后就是这个WAKEUP的问题,文档上说是什么设备睡眠的时候会被唤醒,但是我不知道所谓的设备sleep是个什么状态……我做了一个5s发送一次请求的例子,启动后,把屏幕给关掉了(就是黑了屏,再进去要点亮屏幕,然后解锁),它还是会发送请求,并且也没有所谓的唤醒,所以这个没有搞明白……

 

原文地址:http://www.cnblogs.com/kross/p/3643708.html

新浪微博:http://weibo.com/KrossFord

上一篇: C#彩色图片灰度化算法 下一篇: 没有下一篇了!
发表评论
用户名: 匿名