zoukankan      html  css  js  c++  java
  • AlarmManager的使用

    AlarmManager的作用文档中的解释是:在特定的时刻为我们广播一个指定的Intent。简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent。
    对应AlarmManager更深层的了解可以参考: http://www.programbbs.com/doc/5888.htm http://jinguo.iteye.com/blog/799778
    android提供了四种类型的闹钟: ❑ ELAPSED_REALTIME 在指定的延时过后,发送广播,但不唤醒设备。
    ❑ ELAPSED_REALTIME_WAKEUP 在指定的演示后,发送广播,并唤醒设备 延时是要把系统启动的时间SystemClock.elapsedRealtime()算进去的,具体用法看代码。
    ❑ RTC 在指定的时刻,发送广播,但不唤醒设备
    ❑ RTC_WAKEUP 在指定的时刻,发送广播,并唤醒设备
    AlarmManager提供的方法: ❑ void set(int type, long triggerAtTime, PendingIntent operation) 设置一个闹钟
    ❑ void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation) 设置一个会重复的闹钟
    ❑ void setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent operation) 设置一个重复闹钟的不精确版本,它相对而言更节能(power-efficient)一些,因为系统可能会将几个差不多的闹钟合并为一个来执行,减少设备的唤醒次数。 内置的几个interval为: INTERVAL_FIFTEEN_MINUTES INTERVAL_HALF_HOUR INTERVAL_HOUR INTERVAL_HALF_DAY INTERVAL_DAY 如果你将其设为DAY,那么可能这一天中的所有闹钟都会被合并掉。
    ❑ void cancel(PendingIntent operation) 取消一个设置的闹钟
    ❑ void setTimeZone(String timeZone) 设置系统的默认时区。需要android.permission.SET_TIME_ZONE权限

    Java代码
    1. // 首先创建Receiver 
    2. publicclass AlarmReceiver extends BroadcastReceiver { 
    3.     @Override 
    4.     publicvoid onReceive(Context context, Intent intent) { 
    5.         Toast.makeText(context, "alarm", Toast.LENGTH_SHORT).show(); 
    6.     } 
    // 首先创建Receiver
    public class AlarmReceiver extends BroadcastReceiver {
    	@Override
    	public void onReceive(Context context, Intent intent) {
    		Toast.makeText(context, "alarm", Toast.LENGTH_SHORT).show();
    	}
    }
    
    Xml代码
    1. // manifest中申明,并不需要intent-filter,我们是明确指定发到哪个receiver的 
    2. <receiverandroid:name="yuan.receivers.AlarmReceiver"/> 
    // manifest中申明,并不需要intent-filter,我们是明确指定发到哪个receiver的
    <receiver android:name="yuan.receivers.AlarmReceiver" />
    
    PendingIntent:简单的说就是在Intent上在加个指定的动作。Intent的话,我们还需要在执行startActivity、startService或sendBroadcast才能使Intent有用。而PendingIntent的话就是将这个动作包含在内了,如PendingIntent.getBroadcast就包含了sendBroadcast的动作。
    5s后发送指定广播
    Java代码
    1. AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    2. Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class); 
    3. int requestCode = 0
    4. PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(), 
    5.         requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    6. // 5秒后发送广播,只发送一次 
    7. int triggerAtTime = SystemClock.elapsedRealtime() + 5 * 1000
    8. alarmMgr.set(AlarmManager.ELAPSED_REALTIME, triggerAtTime, pendIntent); 
    AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
    int requestCode = 0;
    PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(),
    		requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    // 5秒后发送广播,只发送一次
    int triggerAtTime = SystemClock.elapsedRealtime() + 5 * 1000;
    alarmMgr.set(AlarmManager.ELAPSED_REALTIME, triggerAtTime, pendIntent);
    
    5s后发送指定广播,然后每个10秒重复发送广播
    Java代码
    1. AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    2. Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class); 
    3. int requestCode = 0
    4. PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(), 
    5.         requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    6. // 5秒后发送广播,然后每个10秒重复发广播。广播都是直接发到AlarmReceiver的 
    7. int triggerAtTime = SystemClock.elapsedRealtime() + 5 * 1000
    8. int interval = 10 * 1000
    9. alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, interval, pendIntent); 
    AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
    int requestCode = 0;
    PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(),
    		requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    // 5秒后发送广播,然后每个10秒重复发广播。广播都是直接发到AlarmReceiver的
    int triggerAtTime = SystemClock.elapsedRealtime() + 5 * 1000;
    int interval = 10 * 1000;
    alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, interval, pendIntent);
    
    取消一个闹钟
    Java代码
    1. AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    2. Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class); 
    3. PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(), 
    4.         0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    5. // 与上面的intent匹配(filterEquals(intent))的闹钟会被取消 
    6. alarmMgr.cancel(pendIntent); 
  • 相关阅读:
    Python shutil模块(目录和文件操作)
    CentOS8的web终端-cockpit
    OpenStack与ZStack深度对比:架构、部署、计算、运维监控等
    Zstack的安装部署
    Git介绍与简易搭建
    Docker 底层技术与端口映射
    Docker 网络
    Dockerfile编写
    Docker监控
    Docker 中卷组管理
  • 原文地址:https://www.cnblogs.com/lyz459/p/3460100.html
Copyright © 2011-2022 走看看