2018-04-22 12:28:36 baidu_20596139 阅读数 1190
  • Android 5.x视频课程

    采用Android5.x进行讲解。本课程包含了几乎所有的Android开发技术,例如,Eclipse和Android Studio开发环境的搭建、各种控件的详细使用方法、布局、四大应用程序组件、数据存储、网络、对话框、Toast、通知、Intent、Android5.x新特性、Fragment、ActionBar、拖放技术、组件开发、硬件访问、定时器、Android NDK等技术。

    79732 人正在学习 去看看 李宁

AlarmManager

时隔将近1年多,博客都没有更新。实在是鸽了太久,都差点忘了CSDN的博客。最近这一年的积累更多实在项目里的点,相对于大块的知识点来说,项目里的点非常零碎,所以大篇幅的总结就比较少了。那么现在把云笔记的内容都搬上来和大家分享一下。

AlarmManager的用处

AlarmManger从名字就可以看出,这是一个闹钟管理器,就像是闹钟一样可以设置。
在4.4系统之前,通过AlarmManager进行定时任务,时间进行的非常准确。而在4.4之后,为了降低功耗,系统检测闹钟任务的频率降低,使得AlarmManager执行时间并不准确,会出现5分钟甚至更长的延时。

AlarmManager的设置

AlarmManager的关键点在于时间,任务以及执行方式。
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

设置时间

  • AlarmManager.RTC:硬件闹钟,不唤醒手机(也可能是其它设备)休眠;当手机休眠时不发射闹钟。
  • AlarmManager.RTC_WAKEUP:硬件闹钟,当闹钟发生时唤醒手机休眠;
  • AlarmManager.ELAPSED_REALTIME:真实时间流逝闹钟,不唤醒手机休眠;当手机休眠时不发射闹钟。
  • AlarmManager.ELAPSED_REALTIME_WAKEUP:真实时间流逝闹钟,当闹钟发躰时唤醒手机休眠;

实际上大体上可以分为RCT类时间和REALTIME类时间
- RCT:设备时间,也就是直接在手机标题栏中显示的时间。手机内常用的闹钟使用的就是这一类时间
- REALTIME:cpu运行时间,这个时间由设备开启开始计算。举个例子,REALTIME的10000L指的就是开机后10s的时间
这两类时间分别有唤醒和非唤醒两类。区别就在于在cpu休眠时是否唤醒cpu执行任务

设置任务

AlarmManager根据PendingIntent设置任务,可以说PendingIntent是AlarmManager的行动指挥,在AlarmManager中可以包含多个PendingIntent
广播标志,AlarmManager在到达指定的时间点时,可以通过PendingIntent执行响应。也就是说在指定时间点可以通过AlarmManager
启动一个Activity,BroadCast或是一个Service,在PendingIntent中放置需要的数据,达到定时任务的目的
需要注意的是,PendingIntent有一个requestCode需要唯一值进行设定

Intent intent_broadcast = new Intent("android.intent.action.FluxRecord");
intent_broadcast.putExtra("time", time);

PendingIntent pi = PendingIntent.getBroadcast(this, i, intent_broadcast, PendingIntent.FLAG_UPDATE_CURRENT);
list.add(pi);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
} else {
    alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
}

执行方式

执行AlarmManager主要可分为两类,一次性任务和重复任务。
- 重复任务:非精确重复类型(不需要精确的间隔时间,系统将整合所有应用中的非精确重复闹钟,尽量平衡任务时间,降低cpu占用频率)

alarmManager.setInexactRepeating();
alarmManager.setRepeating();
  • 一次性任务:不同的系统版本,对于AlarmManager的唤醒机制存在不同的处理,版本越高越力求于降低cpu唤醒的频率。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
} else {
    alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
}

JobService

Android 5.0提供的新的定时任务。不过和AlarmManager不同的是,并没有提供定时间点的任务,并且它的执行时间也并不算精确。
在5.0之后,google更提倡使用JobService,使用它更方便系统对这一类任务统一管理,尽量集中在cpu休眠状态下唤醒的时机。

启动/取消JobService

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    JobScheduler jobSchedule = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);

    PersistableBundle bundle = new PersistableBundle();
    bundle.putInt("id", 1);

    JobInfo jobInfo = new JobInfo.Builder(1, new ComponentName(getPackageName(), CustomJobService.class.getName()))
                        .setExtras(bundle)            //传递数据
                        .setMinimumLatency(1000)      //延迟执行时间
                        .setOverrideDeadline(1000)    //最长延迟执行时间
                        .setPeriodic(1000)            //重复执行周期间隔
                        .setPersisted(true)           //需要android.permission.RECEIVE_BOOT_COMPLETED权限,并且不可与setMinimumLatency,setOverrideDeadline混用
                        .setBackoffCriteria(1000, JobInfo.BACKOFF_POLICY_EXPONENTIAL)   //任务失败重试机制(间隔时间,重试机制)
                        .build();

    int schedule = jobSchedule.schedule(jobInfo);
    if (schedule >= 0) {
        //任务正确执行
    }


//取消任务
//jobSchedule.cancel(jobId);
//jobSchedule.cancelAll();
}

JobService任务处理

onStartJob()的返回值。

  • 返回false时,任务处理完成后完全交给系统处理。在onStartJob中逻辑完成后,将会自动结束任务,而此时系统将不会调用onStopJob()。

  • 返回true时,任务处理完成后需要我们自行结束任务,否则应用的其他任务都不会执行,直到这一任务结束。在调用finishJob()后,任务将会结束并且调用onStopJob()方法。

JobService将会在主线程中运行,因此存在多线程处理时,我们会需要将onStartJob()返回值设为true,自己决定任务结束的时间,防止在onStartJob()中逻辑完成后Service直接结束。(例如需要Handle来处理逻辑时,返回true可以保证Handle部分代码完整的运行)

public class CustomJobService extends JobService {

    @Override
    //任务执行时调用
    public boolean onStartJob(JobParameters jobParameters) {
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters jobParameters) {
        return false;
    }
}

AndroidMainfest中注册

<service
    android:name=".CustomJobService"
    android:permission="android.permission.BIND_JOB_SERVICE" />

总结

关于AlarmManager的研究还是不够深入,事实上在使用过程中AlarmManager在不同厂商不同机型下的表现不太相同,在部分机型下甚至有失效的情况出现(例如OPPOR9就出现过多次失效和延时过长),猜想是系统定制的时候有部分修改,但没有做分析所以我无法下定论。在试图用AlarmManager执行精确时间点任务时,4.4之前的版本运行可以没有太大问题,可以保证部分机型成功,当然部分机型还是存在问题。而在4.4之后的版本,普遍存在任务延迟甚至失效的情况,在之后有时间会研究5.0之后的闹钟源码寻求解决方式。

2017-08-09 16:57:07 github_39611196 阅读数 529
  • Android 5.x视频课程

    采用Android5.x进行讲解。本课程包含了几乎所有的Android开发技术,例如,Eclipse和Android Studio开发环境的搭建、各种控件的详细使用方法、布局、四大应用程序组件、数据存储、网络、对话框、Toast、通知、Intent、Android5.x新特性、Fragment、ActionBar、拖放技术、组件开发、硬件访问、定时器、Android NDK等技术。

    79732 人正在学习 去看看 李宁

Android中实现控件每隔一段时间,去获取相应的数值,根据值的改变情况显示相应的值。
一、编写刷新函数:

 private void refresh() {
       /**
       *这里面写控件的相应代码
       *eg:TextView.setText(xxx);
       */
    }

二、在Handler中调用定时刷新函数:

//调用定时刷新函数
    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            refresh();//编写的定时刷新函数
        }
    };

三、在Runnable中设置刷新的间隔时间,并调用Handler的sendMessage()方法:

//实现定时刷新
    private Runnable mRunnable = new Runnable() {
        @Override
        public void run() {
            while(true){
                try {
                  //sleep2秒,可根据需求更换为响应的时间
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                mHandler.sendMessage(mHandler.obtainMessage());
            }
        }
    };

四、在需要定时刷新的界面xxActivity.xml的onCreate()函数中调用
new Thread(mRunnable).start();

2018-06-04 10:27:12 anwanfei 阅读数 291
  • Android 5.x视频课程

    采用Android5.x进行讲解。本课程包含了几乎所有的Android开发技术,例如,Eclipse和Android Studio开发环境的搭建、各种控件的详细使用方法、布局、四大应用程序组件、数据存储、网络、对话框、Toast、通知、Intent、Android5.x新特性、Fragment、ActionBar、拖放技术、组件开发、硬件访问、定时器、Android NDK等技术。

    79732 人正在学习 去看看 李宁

Android定时

1、常用定时器和延时方法:https://www.cnblogs.com/dame/p/8085983.html

2020-01-04 12:32:27 qq_36707431 阅读数 2
  • Android 5.x视频课程

    采用Android5.x进行讲解。本课程包含了几乎所有的Android开发技术,例如,Eclipse和Android Studio开发环境的搭建、各种控件的详细使用方法、布局、四大应用程序组件、数据存储、网络、对话框、Toast、通知、Intent、Android5.x新特性、Fragment、ActionBar、拖放技术、组件开发、硬件访问、定时器、Android NDK等技术。

    79732 人正在学习 去看看 李宁

android 定时关机,定时重启

2018-09-24 10:45:06 sinat_33381791 阅读数 422
  • Android 5.x视频课程

    采用Android5.x进行讲解。本课程包含了几乎所有的Android开发技术,例如,Eclipse和Android Studio开发环境的搭建、各种控件的详细使用方法、布局、四大应用程序组件、数据存储、网络、对话框、Toast、通知、Intent、Android5.x新特性、Fragment、ActionBar、拖放技术、组件开发、硬件访问、定时器、Android NDK等技术。

    79732 人正在学习 去看看 李宁

简介

由于在Android开发中,需要到定时器,进行时间控制,进行请求刷新,更新数据等等。
接下来记录一下如何在Android中使用定时器。

代码分析

timer的使用

1、timer常用的函数

 //delay 为long类型:从现在起过delay毫秒执行一次。 
public void schedule(TimerTask task, long delay) {
    throw new RuntimeException("Stub!");
}
//time为Date类型:在指定时间执行一次。 
public void schedule(TimerTask task, Date time) {
    throw new RuntimeException("Stub!");
}

2、TimerTask常用的函数

//执行时间间隔的代码
public abstract void run();
//关闭timer
public boolean cancel() {
    throw new RuntimeException("Stub!");
}

public long scheduledExecutionTime() {
    throw new RuntimeException("Stub!");
}

3、举例

public class MainActivity extends AppCompatActivity {

    Timer timer;
    TextView text;
    Button button;

    Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0) {
                String str = (String) msg.obj;
                //设置UI
                //text.setText(str);
            } else {
                //text.setText("ccccc");
            }
        super.handleMessage(msg);
    }
    };


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    text = (TextView) findViewById(R.id.text);
    button = (Button) findViewById(R.id.button);

    timer = new Timer();//创建timer对象
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            Message message = new Message();
            message.what = 0;
            message.obj = "aaaa";
            mHandler.sendMessage(message);
        }
    }, 4000, 10 * 1000);//4000表示开始时4秒后发送一次,10*10000表示美10秒后发送一次

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            text.setText("");
        }
    });
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (timer != null) {
        timer.cancel();//关闭timer
    }
}
}

总结

Timer在Android使用非常简单,代码全部贴出了,大家参考一下。记录之前的笔记,轻松一刻。

Android定时服务

阅读数 380

android 定时开启飞行模式 防打扰

博文 来自: xj626852095
没有更多推荐了,返回首页