专栏名称: AndoirdBlogCN
[ Android Blog 周刊 ]每周一准时更新,主要包括本周最新的优秀国内外博客,新闻,类库,视频等 [www.androidblog.cn ] [ QQ群:149581646 ]
目录
相关文章推荐
复利大王  ·  江浙沪美女留子回国下嫁怀孕后悔 ·  12 小时前  
复利大王  ·  某航离谱瓜! ·  12 小时前  
复利大王  ·  旅行卖淫:白天陪玩晚上陪...警方:严厉打击 ·  12 小时前  
复利大王  ·  湘ya一骨科的瓜? ·  昨天  
复利大王  ·  老同学中捞一捞能不能找到免费P友 ·  昨天  
51好读  ›  专栏  ›  AndoirdBlogCN

Android应用耗电量分析与优化建议

AndoirdBlogCN  · 公众号  · android  · 2016-12-30 07:57

正文

请到「今天看啥」查看全文



优化建议


开发过程中可以尝试通过调整任务优先级等策略来达到降低损耗的目的,使用 JobScheduler 是个不错的选择:

  • 可以推迟的非面向用户的任务(如定期数据库数据更新);

  • 当充电时才希望执行的工作(如备份数据);

  • 需要访问网络或 Wi-Fi 连接的任务(如向服务器拉取配置数据);

  • 零散任务合并到一个批次去定期运行;

  • 当设备空闲时启动某些任务;

  • 只有当条件得到满足, 系统才会启动计划中的任务(充电、WIFI...);


官方建议优化的一些方法
https://developer.android.google.cn/training/monitoring-device-state/index.html


对低电耗模式和应用待机模式进行针对性优化
https://developer.android.google.cn/training/monitoring-device-state/doze-standby.html


Android 7.0新特性对电池管理进一步加强,一些新的变化可能多对我们现有的业务会造成影响需关注
https://developer.android.google.cn/about/versions/nougat/android-7.0-changes.html#perf


JobScheduler


自 Android 5.0 发布以来,JobScheduler 已成为执行后台工作的首选方式,其工作方式有利于用户。应用可以在安排作业的同时允许系统基于内存、电源和连接情况进行优化。JobSchedule的宗旨就是把一些不是特别紧急的任务放到更合适的时机批量处理。这样做有两个好处:

  • 避免频繁的唤醒硬件模块,造成不必要的电量消耗。

  • 避免在不合适的时间(例如低电量情况下、弱网络或者移动网络情况下的)执行过多的任务消耗电量;


JobScheduler的简单使用,首先自定义一个Service类,继承自JobService



    public class JobSchedulerService extends JobService{    private String TAG = JobSchedulerService.class.getSimpleName();    @Override
        public boolean onStartJob(JobParameters jobParameters) {
            Log.d(TAG, "onStartJob:" + jobParameters.getJobId());        if(true) {            // JobService在主线程运行,如果我们这里需要处理比较耗时的业务逻辑需单独开启一条子线程来处理并返回true,
                // 当给定的任务完成时通过调用jobFinished(JobParameters params, boolean needsRescheduled)告知系统。
    
                //假设开启一个线程去下载文件
                new DownloadTask().execute(jobParameters);            return true;
    
            }else {            //如果只是在本方法内执行一些简单的逻辑话返回false就可以了
                return false;
            }
        }    /**
         * 比如我们的服务设定的约束条件为在WIFI状态下运行,结果在任务运行的过程中WIFI断开了系统
         * 就会通过回掉onStopJob()来通知我们停止运行,正常的情况下不会回掉此方法
         *
         * @param jobParameters
         * @return
         */
        @Override
        public boolean onStopJob(JobParameters jobParameters) {
            Log.d(TAG, "onStopJob:" + jobParameters.getJobId());        //如果需要服务在设定的约定条件再次满足时再次执行服务请返回true,反之false
            return true;
        }    class DownloadTask extends AsyncTaskJobParameters, Object, Object> {
            JobParameters mJobParameters;        @Override
            protected Object doInBackground(JobParameters... jobParameterses) {
                mJobParameters = jobParameterses[0];            //比如说我们这里处理一个下载任务
                //或是处理一些比较复杂的运算逻辑
                //...
    
                try {
                    Thread.sleep(30*1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }            return null;
            }        @Override
            protected void onPostExecute(Object o) {            super.onPostExecute(o);            //如果在onStartJob()中返回true的话,处理完成逻辑后一定要执行jobFinished()告知系统已完成,
                //如果需要重新安排服务请true,反之false
                jobFinished(mJobParameters, false);
            }
        }
    }







请到「今天看啥」查看全文