在安卓系统中,为了节省电量和系统资源,会对后台运行的应用进行各种限制,这就导致我们开发的 uniapp 应用在切换到后台后,很容易被系统关闭。为了保证 uniapp 安卓端 app 在后台能够持续运行,即实现 app 保活,我们需要进行一系列的设置,包括设置电池免优化、关闭应用自动管理改为手动管理并开启后台运行、打开允许通知等。本文将详细介绍这些设置的代码实现方式。
一、设置电池免优化
安卓系统的电池优化机制会限制应用在后台的活动,将应用设置为电池免优化,可以避免被系统过度管控,从而提高 app 在后台的存活几率。
1. 检查是否已设置电池免优化
在 uniapp 中,我们可以使用plus.android.importClass方法引入安卓相关类,然后通过代码检查应用是否已经被设置为电池免优化。
function isIgnoringBatteryOptimizations() {
let powerManagerClass = plus.android.importClass("android.os.PowerManager");
let context = plus.android.importClass("io.dcloud.application.DCloudPluginApplication").getInstance();
let powerManager = context.getSystemService(context.POWER_SERVICE);
let packageName = context.getPackageName();
return powerManager.isIgnoringBatteryOptimizations(packageName);
}
上述代码中,首先引入了安卓的PowerManager类用于管理电源相关操作,获取应用上下文context,然后通过getSystemService方法获取PowerManager实例,最后检查当前应用包名对应的应用是否处于电池免优化状态。
2. 引导用户设置电池免优化
如果应用尚未设置电池免优化,我们需要引导用户进行设置。可以通过以下代码打开系统的电池优化设置页面:
function requestIgnoreBatteryOptimizations() {
let intent = plus.android.importClass("android.content.Intent");
let Settings = plus.android.importClass("android.provider.Settings");
let context = plus.android.importClass("io.dcloud.application.DCloudPluginApplication").getInstance();
let intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(plus.android.importClass("android.net.Uri").parse("package:" + context.getPackageName()));
let mainActivity = plus.android.runtimeMainActivity();
mainActivity.startActivity(intent);
}
在上述代码中,创建了一个Intent,指定其动作为Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,表示请求设置电池免优化,并通过setData方法传入当前应用的包名,最后在应用的主 Activity 中启动该Intent,打开设置页面。
二、关闭应用自动管理改为手动管理并开启后台运行
安卓系统的应用自动管理功能会根据系统策略自动关闭后台应用,我们需要引导用户将应用设置为手动管理,并开启后台运行权限。
1. 打开应用管理设置页面
虽然无法直接通过代码将应用从自动管理改为手动管理,但可以引导用户进入系统的应用管理页面,让用户手动进行设置。以下是打开应用管理页面的代码:
function openAppManageSettings() {
let intent = plus.android.importClass("android.content.Intent");
let Settings = plus.android.importClass("android.provider.Settings");
let context = plus.android.importClass("io.dcloud.application.DCloudPluginApplication").getInstance();
let intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(plus.android.importClass("android.net.Uri").parse("package:" + context.getPackageName()));
let mainActivity = plus.android.runtimeMainActivity();
mainActivity.startActivity(intent);
}
这里创建的Intent动作为Settings.ACTION_APPLICATION_DETAILS_SETTINGS,传入应用包名后启动Intent,打开的页面中用户可以对应用的管理模式进行修改,将其设置为手动管理,并开启后台运行权限。
三、打开允许通知
通知权限的开启有助于提高应用在后台的活跃度,因为系统在推送通知时,会给予应用一定的资源保证其能够正常展示通知。
1. 检查通知权限状态
在 uniapp 中检查通知权限状态,可使用如下代码:
function checkNotificationPermission() {
let NotificationManagerCompat = plus.android.importClass("androidx.core.app.NotificationManagerCompat");
let context = plus.android.importClass("io.dcloud.application.DCloudPluginApplication").getInstance();
return NotificationManagerCompat.from(context).areNotificationsEnabled();
}
上述代码引入NotificationManagerCompat类,通过from方法获取通知管理器实例,然后调用areNotificationsEnabled方法检查通知权限是否开启。
2. 引导用户打开通知权限
如果通知权限未开启,同样可以引导用户进入设置页面进行开启:
function openNotificationSettings() {
let intent = plus.android.importClass("android.content.Intent");
let Settings = plus.android.importClass("android.provider.Settings");
let context = plus.android.importClass("io.dcloud.application.DCloudPluginApplication").getInstance();
let intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName());
let mainActivity = plus.android.runtimeMainActivity();
mainActivity.startActivity(intent);
}
此代码创建的Intent动作为Settings.ACTION_APP_NOTIFICATION_SETTINGS,并通过putExtra方法传入应用包名,启动后可打开应用的通知设置页面,方便用户开启通知权限。
四、使用示例
在实际应用中,可以在应用启动时进行相关检查和引导:
plus.runtime.onReady(function() {
// 检查电池免优化状态
if (!isIgnoringBatteryOptimizations()) {
plus.nativeUI.confirm('为保证应用正常运行,请设置电池免优化', function(e) {
if (e.index === 1) {
requestIgnoreBatteryOptimizations();
}
}, '提示', ['取消', '确定']);
}
// 检查通知权限状态
if (!checkNotificationPermission()) {
plus.nativeUI.confirm('为保证应用及时接收消息,请打开通知权限', function(e) {
if (e.index === 1) {
openNotificationSettings();
}
}, '提示', ['取消', '确定']);
}
// 引导用户设置应用管理
plus.nativeUI.confirm('为保证应用后台运行,请手动设置应用管理', function(e) {
if (e.index === 1) {
openAppManageSettings();
}
}, '提示', ['取消', '确定']);
});
上述代码在应用运行准备就绪后,依次检查电池免优化、通知权限状态,并引导用户进行相应设置,同时也引导用户进行应用管理设置。
五、注意事项
- 权限申请:在进行上述操作时,确保应用已经申请了必要的权限,如在AndroidManifest.xml文件中添加相关权限声明(虽然部分操作不需要额外的权限申请,但明确声明有助于应用的稳定性和兼容性)。
- 系统兼容性:不同的安卓系统版本和手机厂商定制系统,在设置页面和权限管理机制上可能存在差异,代码实现可能需要根据实际情况进行调整和适配。
- 用户体验:在引导用户进行设置时,尽量以友好、清晰的方式告知用户设置的目的和重要性,避免引起用户反感。
通过以上设置和代码实现,能够在一定程度上提高 uniapp 安卓端 app 的保活能力。如果你在实践过程中遇到问题,或有其他优化想法,欢迎在评论区交流分享。