背景

一个后台通过gps采集位置,录音,并将位置上传至服务器的程序,手机息屏后导致cpu休眠,功能无法正常执行。

尝试过的方法

1、将任务放在service中进行,且为了适配Android8.0,并提高程序优先级,开启通知,作为前台服务运行,无效

2、开启weaklock锁,禁止cpu休眠,由于Doze的引入6.0后无效,在8.0测试时确实无效,未测试6.0前是否有效。

3、忽略省电白名单。有提示是否加入省电白名单,但加入后无效,并在手机设置-电源管理-省电白名单中未加入该白名单,猜测是由于不同厂家的rom导致无法加入该白名单

4、手动将应用加入手机设置-电源管理-省电白名单,测试后有效,在息屏后gps、录音、网络也能正常运行。

其它未测试的方法

1、后台循环播放一段无声音乐,个人认为可行。但是与gps、录音、网络加在一起耗电量过大,而且录音与播放音乐不知是否有冲突,有时间会去尝试该方法。

2、root手机,将应用加入省电白名单,root适配范围太小,不适于大规模使用,特殊情况下有用。

代码

1、weaklock锁

//权限
<uses-permission android:name="android.permission.WAKE_LOCK" />

//开启weaklock
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");
wakeLock.acquire();

//注意释放锁
wakeLock.release();

2、申请加入省电白名单

//权限
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>

//判断是否已经加入白名单
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
pm.isIgnoringBatteryOptimizations(getPackageName());

//申请加入白名单
Intent intent = new Intent();
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_IGNORE_BATTERY_CODE);

3、root后将程序加入系统省电白名单

将程序加入系统省电白名单