app 耗电优化之三 使用JobSchedule对任务进行合理排期

JobSchedule 是Android5.0之后添加进去的,之前的版本没有。
JobSchedule 原理是一种将任务安排在恰当的实际进行操作一种方案机制。具体提供了那些可选的时机,如下:
1 在可用网络下执行。在7.0 之前,应用可以通过监听网络变化来执行任务,当然了前提是应用必须存活。到7.0之后这类API已经失效,但是JobSchedule机制提供了网络变化的监听。进一步可以在网络变化的情况下执行某些操作。例如在wifi环境下执行下载任务等。
2 设备在充电或者空闲时执行一些任务。
3 设定执行的时间,这个和其他的条件(1,2)一起使用。
具体的实现如下:
1 任务排期

    final JobScheduler scheduler = context.getSystemService(JobScheduler.class);
    //或者
    final JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE );
    //如果当前的jobId已经被安排了则下取消该安排
    final int jobId = (int) info.mId;
    scheduler.cancel(jobId);
    //构建JobInfo  jobId 为jobID。DownloadJobService 为Job接受的Service,该Service必须继承JobService
    final JobInfo.Builder builder = new JobInfo.Builder(jobId,new ComponentName(context, DownloadJobService.class));
    //设置设备重启是执行此任务。前提是需要拥有RECEIVE_BOOT_COMPLETED  权限
    builder.setPriority(JobInfo.PRIORITY_FOREGROUND_APP);
    //这个设置并不能设置成为前台进程。通知还需要应用自己发。此外该设置会忽略该任务的网络限制。
    builder.setFlags(JobInfo.FLAG_WILL_BE_FOREGROUND);
    //设置任务延迟执行时间,不可与setPeriodic(long time)同时使用
    builder.setMinimumLatency(time);
    //设置设备执行的网络条件JobInfo.NETWORK_TYPE_UNMETERED 不计量网络(wifi),JobInfo.NETWORK_TYPE_NOT_ROAMING 非漫游网络, NETWORK_TYPE_ANY任何网络
    //JobInfo.NETWORK_TYPE_NONE 无论是否有网络都执行
    builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);
    //设置在设备充电时执行
    builder.setRequiresCharging(true);
    //设置在设备空闲时间执行
    builder.setRequiresDeviceIdle(true);
    //循环没5秒执行一次
    builder.setPeriodic(5000);
    //约定的时间内的条件都没有被触发是5秒以后开始触发
    builder.setOverrideDeadline(5000);
    //生成Job
    JobInfo job = builder.build();
    //安排Job,该方法有返回值JobScheduler.RESULT_SUCCESS 表示安排成功,JobScheduler.RESULT_FAILURE 安排失败
    scheduler.schedule(job)
    //安排Job, packageName 表示那个应用安排的Job(耗电记这个应用的)。 userId表示谁安排的Job
    scheduler.scheduleAsPackage(builder.build(), packageName, UserHandle.myUserId(), TAG);

2 处理任务。
 当任务安排下去,应该会被记录在JobScheduler服务里面。当条件满足时,处理job对应的JobService会被启动,否则。。。
 首先定义JobService

<service
        android:name=".DownloadJobService"
        android:exported="true"  //这个地方必须是True,否则外界的应用无法启动该JobService
        android:permission="android.permission.BIND_JOB_SERVICE" //必须定义这个权限,你懂得
    />
public class DownloadJobService extends JobService {
        //开始执行Job接口。(必须实现)如果返回false则表示这个Job已经被执行完毕。如果true则表示这个Job正在被执行。
        public boolean onStartJob(JobParameters params) {
            final int id = params.getJobId();
            ....开始执行Job

            1 对于一个瞬间能够完成的任务,此处可以return false.
            2 如果是耗时任务,则需要在异步线程中执行,并且返回true。此外
            myHandler.removeMessages(id);
            myHandler.sendEmptyMessage(id);
            执行完后不要忘记执行jobFinished
        }

        //Job执行停止,必须实现 ,当接收到任务取消时,如果该任务没有被结束,则执行该方法,否则不执行。
        public boolean onStopJob(JobParameters params) {
            //当然此处可以重新安排被取消的任务。
            scheduler.schedule(job)
        }
        //还有一个方法。jobFinished(JobParameters params, boolean needsRescheduled) 该方法是在任务执行完成时通知系统(不代表任务被执行成功)。needsRecheduled表示该任务是否被重复执行。
        //例如onStartJob执行结果是True。则实际上任务还在执行。这时候如果任务执行完了。就必须调用这个方法否则后面的任务。

    }

总结,Scheduler是一套提供给开发者的一套优化耗电的任务安排方式,还是相当不错的。

时间: 2024-11-04 19:24:10

app 耗电优化之三 使用JobSchedule对任务进行合理排期的相关文章

app耗电优化

应用消耗电量的源头是使用耗电的器件(感觉就是一句废话).例如屏幕,CPU,GPU,GPS,IO等.可是用户无法停止CPU运转,也无法停止IO等等.除非关机. 当然了应用如果不使用CPU,IO等基本上不可能.因此优化耗电的命题实际上是如何合理的耗电. 首先区分哪些是不合理耗电: 1 长时间占用器件.例如长时间亮屏,长时间读写数据,长时间的网络访问. 2 频繁的开关器件. 例如来回切换网络,来回开关GPS,不停的亮屏灭屏等. 其次,如何检测耗电异常. 这里需要工具(待续) 减少耗电总体想法 1  在

app耗电优化之二 使用电源管理来安排任务

PowerManager 电源管理(电源使用管理).主要管理设备启动,保持活动,休眠,唤醒.其中为了保持任务,提供了PowerManager.WakeLock(唤醒锁).执行任务时持有这个唤醒锁,就可以防止休眠,从而正常的完成任务.当然,代价就是增加了耗电. 另一种情况,如果任务执行后,没有释放该锁,则设备不会进入休眠,进而更多的增加了耗电.实际上WakeLock是站立在耗电优化的对立面的,但是又有很多场景不的不使用,例如在听音乐,看视频的过程中希望设备休眠么? 因此在很多场景必须考虑使用Wak

app耗电优化之一 根据电池情况做任务安排

这里要讲根据电池的当前特征对任务排期.对一个比较耗电的任务,需要在电量比较丰盈的情况下完成,如果电量已经枯萎了,做这样的任务,则会耗尽所有电量.基于此,在做这样的任务前,获取当前电池特征,并利用电池特征做出是否要执行任务的判断.详细讲解如下:1 获取当前的电池特征 /* 获取当前电池状态.将BroadcastReceiver 设为null 则会直接返回当前电池的状态.*/ IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_

Android APP 性能优化的一些思考

说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才感觉运行速度稍微提高了点,就算手机在各种性能跑分软件面前分数遥遥领先,还是感觉无论有多大的内存空间都远远不够用.相信每个使用 Android 系统的用户都有过以上类似经历,确实,Android 系统在流畅性方面不如 IOS 系统,为何呢,明明在看手机硬件配置上时,Android 设备都不会输于 IO

Android APP性能优化(最新总结)

导语 安卓大军浩浩荡荡,发展已近十个年头,技术优化日异月新,如今Android 8.0 Oreo 都发布了,Android系统性能已经非常流畅了.但是,到了各大厂商手里,改源码自定系统,使得Android原生系统变得鱼龙混杂,然后到了不同层次的开发工程师手里,因为技术水平的参差不齐,即使很多手机在跑分软件性能非常高,打开应用依然存在卡顿现象.另外,随着产品内容迭代,功能越来越复杂,UI页面也越来越丰富,也成为流畅运行的一种阻碍.综上所述,对APP进行性能优化已成为开发者该有的一种综合素质,也是开

Android App 性能优化系列结语篇

关于Android App的优化, 从第一篇的计划开始, 到内存优化的系列文结束, 不知不觉近三个月的时间, 写了十五六篇相关的博文, 算是对自己的知识的一个系统化, 也希望能给大家一些帮助.在此有对此做一个总结. 路线Android App优化1, App性能优化要怎么做在系列的开篇文中, 我们聊到了本系列的一个缘由, 和当时的一个计划, 系列也基本是朝着这个这个方向走的.2, 性能分析工具在此介绍了一些惯用的性能分析工具, 包括官方, 第三方的, 内存分析的, UI分析的, 执行时间性能分析

Android app 性能优化的思考--性能卡顿不好的原因在哪?

说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才感觉运行速度稍微提高了点,就算手机在各种性能跑分软件面前分数遥遥领先,还是感觉无论有多大的内存空间都远远不够用.相信每个使用 Android 系统的用户都有过以上类似经历,确实,Android 系统在流畅性方面不如 IOS 系统,为何呢,明明在看手机硬件配置上时,Android 设备都不会输于 IO

Android App性能优化(一)之布局优化

当创建复杂布局的时候,我们会在xml 文件中添加大量的ViewGroup和View.伴随着每次迭代,View树的层次越来越深,界面加载速度越来越慢,消耗的内存也越来越多.当您的程序出现加载时短暂黑屏或横竖切换时短暂黑屏,抑或如内存溢出(OOM)之类的问题时,没准您的程序需要优化了. 那么如何让程序运行速度更快?响应更敏捷?优化布局是一个最基本的方法,本文将介绍最基本的优化布局方法. 1.使用ViewStub实现View的延迟加载. 很多情况下,xml布局文件中的部分View初始状态是设置为不显示

android App性能优化技巧浅谈

Android App性能优化,安卓App性能优化技巧,无论锤子还是茄子手机的不断冒出,Android系统的手机市场占有率目前来说还是最大的,因此基于Android开发的App数量也是很庞大的.那么,如何能开发出更高性能的Android App?相信是软件开发公司以及广大程序员们头疼的一大难题.今天,就给大家提供几个提高Android App性能的技巧. 高效地利用线程1.在后台取消一些线程中的动作 我们知道App运行过程中所有的操作都默认在主线程(UI线程)中进行的,这样App的响应速度就会受