• AlarmManager 用法


    AlarmManager 可以按照”预先设定的时间“或”时间间隔"激活Intent的一种方式,他与timer不同的是,他是程序之外的,生命周期不受程序控制,即使程序关闭也会触发。它比Service和定时器更加节省资源。如果在应用程序内触发定时操作,推荐Handler,Timer以及Thread等方式。因为这样Android能更好的控制系统资源。

    一.代码

    public class MainActivity extends Activity {
    
        Button btn1,btn2;
    
        AlarmManager am;
        PendingIntent pi;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            //创建AlarmManager
            am=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
            
            
            btn1=(Button)findViewById(R.id.btn1);    
            btn2=(Button)findViewById(R.id.btn2);
            
            btn1.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    
                    //启动照相机
                    Intent intent = new Intent("android.media.action.STILL_IMAGE_CAMERA");
                    pi= PendingIntent.getActivity(MainActivity.this,0,intent,0);
                                    
                    //十秒后激活Intent
                    Calendar calendar=Calendar.getInstance();
                    calendar.setTimeInMillis(System.currentTimeMillis());
                    calendar.add(Calendar.SECOND, 10);
                    
                    //设置Alarm,第一个参数:Alarm类型,第二个参数触发时间,第三个参数PendingIntent
                    am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi);
        
                }
            });
            
            btn2=(Button)findViewById(R.id.btn2);
            btn2.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    //取消AlarmManager任务
                    am.cancel(pi);
                }
            });
        }
    }
    View Code

    二.相关说明

    1.Alarm有四个可用的类型(代码中的set方法中第一个参数)

    (1)RTC_WAKEUP 在指定的时间唤醒设备,并激活PendingIntent

    (2)RTC 在指定的时间激活PendingIntent,但是不会唤醒设备

    (3) ELAPSED_REALTIME 根据设备启动之后经过的时间激活PendingIntent,但是不会唤醒设备,经过的时间包含设备休眠的所有时间

    (4)ELAPSED_REALTIME_WAKEUP 在设备启动并经过指定的时间之后激活PendingIntent和唤醒设备。

    2.设置重复的Alarm。

    如果需要Alarm间隔一段时间激活Intent,可以是用setRepeating或setIndexactRepeating两个方法,这两个方法都支持Alarm类型。

    (1)setRepeating方法可以对时间进行精确的控制,最多可以精确到毫秒。但是这样设备比较耗电

    例:

    // 创建AlarmManager
                    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    
                    // 启动照相机
                    Intent intent = new Intent(
                            "android.media.action.STILL_IMAGE_CAMERA");
                    PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
    
                    //每个十秒触发
                    Calendar calendar = Calendar.getInstance();
                    calendar.setTimeInMillis(System.currentTimeMillis());
                    calendar.add(Calendar.SECOND, 10);
                    
                    am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 10000, pi);
                    // 取消AlarmManager任务
                    //am.cancel(pi);
    View Code

    (2)setIndexactRepeating 相比setRepeating,setIndexactRepeating 可以减少电量的消耗。在使用setIndexactRepeating 时,Android会同步多个没有精确指定时间间隔的Alarm,然后同时触发她们。(一次触发多个,例如设置Alarm时间间隔为:INTERVAL_HOUR,Android会同步所有时间间隔为为INTERVAL_HOUR的Alarm,并且同时触发)

    setIndexactRepeating 常用的时间间隔

    INTERVAL_FIFTEEN_MINUTES(每十五分钟)

    INTERVAL_HALF_HOUR(每隔半个小时)

    INTERVAL_HOUR(每隔一个小时)

    INTEVAL_HALF_DAY(每个半天)

    INTEVAL_DAY(每隔一天)

    例:

    // 创建AlarmManager
                    am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    
                    // 启动照相机
                    Intent intent = new Intent(
                            "android.media.action.STILL_IMAGE_CAMERA");
                    pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
    
                    //每个十五分钟触发
                    am.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                            AlarmManager.INTERVAL_FIFTEEN_MINUTES,
                            AlarmManager.INTERVAL_FIFTEEN_MINUTES, pi);
    View Code
  • 相关阅读:
    十,文献研读
    第十周博客作业
    【西北师大-2108Java】第八次作业成绩汇总
    【西北师大-2108Java】期中成绩汇总
    人脸识别性别的卷积神经网络
    主成分分析(PCA)原理详解
    使用KNN算法对鸢尾花数据集进行分类处理
    5.文献研读---基于教育数据挖掘的在线学习者 学业成绩预测建模研究--陈子健 朱晓亮
    4.文献研读---基于数据挖掘的学习者在线学习行为分析模型构建--卓荣庆 柏忠贤
    3.文献研读---基于Canvas Network开放数据集的MOOC学习分析--胡红梅 宗 阳
  • 原文地址:https://www.cnblogs.com/ywtk/p/3820999.html
Copyright © 2020-2023  润新知