AlarmManager

AlarmManager

简介:此物是系统的一个服务,独立于CPU。就是说即使手机关机了,AlarmManager依然是活动着的。

1.      如何取得实例:

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

2.      常用方法列表:

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

       设置一个指定类型时间延期意图的定时器。

2.public void cancel(PendingIntent  operation);

       取消所匹配延期意图的定时器。

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

       设置一个指定类型时间间隔延期意图重复定时器。

4.public void setInexactRepeating(int  type, long triggerAtTime, long interval,PendingIntent operation);

       设置一个指定类型时间间隔延期意图的不精准的重复定时器。效果与setRepeating方法一致。

3.      AlarmManagertype

RTC_WAKEUP

   基于绝对时间的,可以把睡眠中的系统唤醒。

RTC

   基于绝对时间的,不可以唤醒睡眠的系统,只能等到系统醒来才能执行。

ELAPSED_REALTIME_WAKEUP

   基于相对时间的,可以把睡眠中的系统唤醒。

ELAPSED_REALTIME

   基于相对时间的,不可以唤醒睡眠的系统,只能等到系统醒来才能执行。

问题:什么是相对时间和绝对时间,该怎么去用呢?

相对时间指手机待机时间,就是从手机开机到现在所经历的毫秒值。

什么叫做基于相对时间?现在我想用ELAPSED_REALTIME类型,然后1秒钟后开始定时器任务,我就得这么做:

alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime()+1000,  operation);其中SystemClock.elapsedRealtime()就是获取手机待机时间。

      绝对时间指手机的真是时间,可以从System.currentTimeMillis()获取当前时间毫秒值。

什么叫做基于绝对时间呢?现在我要用RTC_WAKEUP类型,然后1秒钟后启动定时器任务,我要这么做:

       alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+1000,  operation);

 

 

4.      范例1:指定时间(xxxxxxxxxxxx秒)执行一个RTC_WAKEUP类型的任务

广播接受者:

publicclass MyReceiver extends BroadcastReceiver {

 

   @Override

   publicvoid onReceive(Context context, Intent intent)  {

      Toast.makeText(context,  "I get  it", 0).show();

      System.out.println("I get it");

   }

 

}

任务开始:

publicclass MainActivity extends Activity {

 

   privatefinal String ACTION = "com.hwh.finish";

   private AlarmManager alarmManager;

    @Override

    publicvoid onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

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

        Intent intent = new Intent();

        intent.setAction(ACTION);

       

        Calendar can = Calendar.getInstance();

       int day=can.get(Calendar.DAY_OF_MONTH);

       can.set(Calendar.DAY_OF_MONTH, day);

       can.set(Calendar.HOUR_OF_DAY, 17);

       can.set(Calendar.MINUTE, 27);

       can.set(Calendar.SECOND, 0);

     

        PendingIntent operation =  PendingIntent.getBroadcast(this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);

        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+(can.getTimeInMillis()-System.currentTimeMillis()),  operation);

}

}

 

 

 

 

范例2:指定时间(xxxxxxxxxxxx秒)执行一个ELAPSED_REALTIME类型的任务

publicclass MainActivity extends Activity {

 

   privatefinal String ACTION = "com.hwh.finish";

   private AlarmManager alarmManager;

    @Override

    publicvoid onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

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

        Intent intent = new Intent();

        intent.setAction(ACTION);

       

        Calendar can = Calendar.getInstance();

       int day=can.get(Calendar.DAY_OF_MONTH);

       can.set(Calendar.DAY_OF_MONTH, day);

       can.set(Calendar.HOUR_OF_DAY, 17);

       can.set(Calendar.MINUTE, 27);

       can.set(Calendar.SECOND, 0);

     

        PendingIntent operation =  PendingIntent.getBroadcast(this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);

        alarmManager.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime()+(can.getTimeInMillis()-System.currentTimeMillis()),  operation);

}

}

 

5.      其他

AlarmManager定时器和Timer有相同的作用,区别在于,Timer是基于程序和系统的,程序被杀掉、系统关机Timer就无法执行了。AlarmManager是单独与系统CPU的一个东西,就算是CPU正在睡眠中(如关机)但是只要AlarmManager中设置的时间到了,它也会唤醒系统,执行任务,前提是type得是WAKEUP类型。

另外,在客户端和服务器交互中,有时候也要维持住一个长连接,在android平台实现长连接就是每隔一定时间去请求一次服务器,不要让链路中断。可以使用Timer,但是它需要用 WakeLock CPU 保持唤醒状态,这样会大量消耗手机电量。所以使用AlarmManager就是最佳方案。关于长连接可以参考

http://blog.jpush.cn/index.php/jpush_wireless_push_principle

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值