1. 概述
使用Qt开发android应用往往会存在这样一个问题:我们的android应用和后台需要时刻保持通信,但是往往我们在切换任务或者息屏,将我们开发的应用变更为后台应用的时候,由于android的电池策略,会将后台的应用关闭掉从而释放资源供其他应用使用.会给应用带来不好的使用体验
2. 解决措施
针对这个问题,网上有很多解决策略,主要是像前台服务、1像素保活、白名单保活、双线程相互监控等等,很多. 我大概试了一下,高版本的安卓目前比较推荐的方法的是采用白名单的方式,其他方式多是流氓软件的做法,咱守法公民,不干那事~
3. Android实现白名单保活
其实并不复杂,实际上不通过代码的方式在android上设置即可,不同的厂商可能略有不同,这里以小米平板SE为例,实际只需要打开两个开关即可
1> 省点策略改为无限制
设置->应用设置->应用管理菜单下,将省电策略从智能限制改为无限制即可
2> 开启任务后台锁定
桌面上找到平板管家图标,点击右上角设置按钮,选择优化加速,任务锁定
4. Qt如何通过代码实现上述设置
1> 省电策略的设置主要是通过调用jni接口弹出设置窗口让用户手动去设置
public boolean isIgnoringBatteryOptimizations()
{
boolean isIgnoring = false;
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
if (powerManager != null) {
System.out.println("[isIgnoringBatteryOptimizations]");
isIgnoring = powerManager.isIgnoringBatteryOptimizations(getPackageName());
}
return isIgnoring;
}
public void requestIgnoreBatteryOptimizations()
{
try {
System.out.println("[requestIgnoreBatteryOptimizations]start activity.");
Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
}catch (Exception e){
e.printStackTrace();
}
}
#if defined(__ANDROID__)
#include <QJniObject>
#endif
QJniEnvironment env;
QJniObject activity = QNativeInterface::QAndroidApplication::context();
jboolean retObj = activity.callMethod<jboolean>("isIgnoringBatteryOptimizations");
if (!static_cast<bool>(retObj)) {
if(MessageBox::question(tr("Allow App Run Background ?")) == QMessageBox::Yes) {
activity.callMethod<void>("requestIgnoreBatteryOptimizations");
}
}
if (env->ExceptionCheck()) {
env->ExceptionDescribe();
env->ExceptionClear();
}
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
2> 任务锁定直接通过代码调用jni接口设置,不需要用户确认
<uses-permission android:name="android.permission.LOCK_TASK_AUTH" />