// 在android8.0以后的电量提醒问题。(文章分成JobScheduler和WorkManager两个大部分,互不影响,可以自行查阅)
问题描述
在Android8.0以后的安卓手机上,为了实现App在后台的时候也能接收到服务器端的实时消息,使用了Service,然而在关闭App或进入后台时,系统则会经常弹出一个无法清除掉的消息:“有耗电高的应用在后台”。
为了解决这个问题,我们查阅了Android开发者的官方文档,有关后台任务(Background Task)的部分。由于这部分文档只有英文的版本,所以简单说明一下:
它首先解释了不同的情况要如何选择最合适的解决方案。下面有一个表格简单说明了这个问题:
策略的选择
不知道上面这个表格看完,你有没有完全理解呢?
因为这篇文档中很多晦涩的专业英语,所以我在理解上也有很多的不解。总体来说它介绍了几种解决方案。其中似乎比较新的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 =