耗电优化(三):JobScheduler,WorkManager

// 在android8.0以后的电量提醒问题。(文章分成JobScheduler和WorkManager两个大部分,互不影响,可以自行查阅)
问题描述

在Android8.0以后的安卓手机上,为了实现App在后台的时候也能接收到服务器端的实时消息,使用了Service,然而在关闭App或进入后台时,系统则会经常弹出一个无法清除掉的消息:“有耗电高的应用在后台”

为了解决这个问题,我们查阅了Android开发者的官方文档,有关后台任务(Background Task)的部分。由于这部分文档只有英文的版本,所以简单说明一下:

它首先解释了不同的情况要如何选择最合适的解决方案。下面有一个表格简单说明了这个问题:

img

策略的选择

不知道上面这个表格看完,你有没有完全理解呢?
因为这篇文档中很多晦涩的专业英语,所以我在理解上也有很多的不解。总体来说它介绍了几种解决方案。其中似乎比较新的WorkManager还在测试阶段,所以我打算后面再去尝试,这里首先试试JobScheduler

在使用JobSchdeuler进行尝试的时候我首先找到了一个博客作为参考——JobScheduler API的使用详细:
首先我先创建了一个MyJobService类,执行的工作内容是向文件写入内容。
(在JobService中我还创建了一个AsyncTask用来异步写入文件)

/**
* 编译环境:

Android Studio 3.1.4
Build #AI-173.4907809, built on July 24, 2018
JRE: 1.8.0_152-release-1024-b02 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0
*/
package com.hongfei.intsig.backgrounddemo;


import android.annotation.SuppressLint;
import android.app.job.JobParameters;
import android.app.job.JobService;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.util.Log;

import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

@SuppressLint("NewApi")
public class MyJobService extends JobService {
   
    private static final String TAG = "MyJobService";

    @Override
    public boolean onStartJob(JobParameters jobParameters) {
   
        if (isNetworkConnected()) {
   
            new SimpleDownloadTask().execute(jobParameters);
            return true;
        } else {
   
        }
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters jobParameters) {
   
//        Log.i(TAG, "stop job,名字是: " + jobParameters.getJobId());
        return true;
    }

    private boolean isNetworkConnected() {
   
        ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = manager.getActiveNetworkInfo();
        return (info != null && info.isConnected());
    }


    private class SimpleDownloadTask extends AsyncTask<JobParameters, Void, String> {
   
        private JobParameters mJobParam;

        @Override
        protected String doInBackground(JobParameters... params) {
   
            mJobParam = params[0];
            // 具体的后台操作
            try{
   

                File file = new File("/storage/emulated/0/1/testBackground.txt");

                FileOutputStream fos = 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值