Android正确的保活方案,不要掉进保活需求死循环陷进
创始人
2024-05-09 03:29:36
0

在开始前,还是给大家简单介绍一下,以前出现过的一些黑科技:

大概在6年前Github中出现过一个叫MarsDaemon,这个库通过双进程守护的方式实现保活,一时间风头无两。好景不长,进入 Android 8.0时代之后,这个库就废掉了。

最近2年Github上面出来一个Leoric 感兴趣的可以去看一下源码,谁敢用在生产环境呢,也就自己玩玩的才会用吧(不能因为保活而导致手机卡巴斯基),我没有试过这个,我想说的是:黑科技能黑的了一时,能黑的了一世吗?

没有规矩,不成方圆,要提升产品的存活率,最终还是要落到产品本身上面来,尊重用户,提升用户体验才是正道。

以前我也是深受保活需求的压迫,最近发现QQ群里有人又提到了如何保活,那么我们就来说一说,如何来正确保活App?


Android 8.0之后: 加强了应用后台限制,当时测试过一组数据:

应用处于前台,启动一个前台Service,里面使用JobScheduler启动定时任务(30秒触发一次),此时手机锁屏,前10分钟内,定时任务都是正常执行;

大概在12分钟左右,发现应用进程就被kill掉了,解锁屏幕,app也不在前台了;

各大国产手机厂商底层都经过自己魔改,自家都有自己的一套自启动管理,小米手机更乱(当时有个神隐模式的概念,那也是杀后台高手),只能说当时Android手机各种性能方面都不足,各家都会有自己的一套省电模式,以此来达到省电和提高手机性能,Android 系统变得越来越完善,但是厂商定制的自启动、省电模式还在,所以我们要做保活。

1.Android 8.0之前-常用的保活方案

1.开启一个前台Service

2.Android 6.0+ 忽略电池优化开关(稍后会有代码)

3.无障碍服务(只针对有用这个功能的app,如支付宝语音增强提醒用了它)

2.Android 8.0之后-常用的保活方案

1.开启一个前台Service(可以加上,单独启用的话无法满足保活需求)

2.Android 6.0+ 忽略电池优化开关(稍后会有代码)

3.无障碍服务(只针对有用这个功能的app,如支付宝语音增强提醒用了它)

4.应用自启动权限(最简单的方案是针对不同系统提供教程图片-让用户自己去打开)

5.多任务列表窗口加锁(提供GIF教程图片-让用户自己去打开)

6.多任务列表窗口隐藏App(仅针对有这方面需求的App)

7.应用后台高耗电(仅针对Vivo手机)

3.保活方案实现步骤

(1). 前台Service

//前台服务
class ForegroundCoreService : Service() {override fun onBind(intent: Intent?): IBinder? = nullprivate var mForegroundNF:ForegroundNF by lazy {ForegroundNF(this)}override fun onCreate() {super.onCreate()mForegroundNF.startForegroundNotification()}override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {if(null == intent){//服务被系统kill掉之后重启进来的return START_NOT_STICKY}mForegroundNF.startForegroundNotification()return super.onStartCommand(intent, flags, startId)}override fun onDestroy() {mForegroundNF.stopForegroundNotification()super.onDestroy()}
}

启动前台服务的时候,需要发送一个前台的通知:

//初始化前台通知,停止前台通知
class ForegroundNF(private val service: ForegroundCoreService) : ContextWrapper(service) {companion object {private const val START_ID = 101private const val CHANNEL_ID = "app_foreground_service"private const val CHANNEL_NAME = "前台保活服务"}private var mNotificationManager: NotificationManager? = nullprivate var mCompatBuilder:NotificationCompat.Builder?=nullprivate val compatBuilder: NotificationCompat.Builder?get() {if (mCompatBuilder == null) {val notificationIntent = Intent(this, MainActivity::class.java)notificationIntent.action = Intent.ACTION_MAINnotificationIntent.addCategory(Intent.CATEGORY_LAUNCHER)notificationIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED//动作意图val pendingIntent = PendingIntent.getActivity(this, (Math.random() * 10 + 10).toInt(),notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT)val notificationBuilder: NotificationCompat.Builder = NotificationCompat.Builder(this,CHANNEL_ID)//标题notificationBuilder.setContentTitle(getString(R.string.notification_content))//通知内容notificationBuilder.setContentText(getString(R.string.notification_sub_content))//状态栏显示的小图标notificationBuilder.setSmallIcon(R.mipmap.ic_coolback_launcher)//通知内容打开的意图notificationBuilder.setContentIntent(pendingIntent)mCompatBuilder = notificationBuilder}return mCompatBuilder}init {createNotificationChannel()}//创建通知渠道private fun createNotificationChannel() {mNotificationManager =getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager//针对8.0+系统if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {val channel = NotificationChannel(CHANNEL_ID,CHANNEL_NAME,NotificationManager.IMPORTANCE_LOW)channel.lockscreenVisibility = Notification.VISIBILITY_PUBLICchannel.setShowBadge(false)mNotificationManager?.createNotificationChannel(channel)}}//开启前台通知fun startForegroundNotification() {service.startForeground(START_ID, compatBuilder?.build())}//停止前台服务并清除通知fun stopForegroundNotification() {mNotificationManager?.cancelAll()service.stopForeground(true)}
}

(2).忽略电池优化(Android 6.0+)

1.我们需要在AndroidManifest.xml中声明一下权限


2.通过Intent来请求忽略电池优化的权限(需要引导用户点击)

//在Activity的onCreate中注册ActivityResult,一定要在onCreate中注册
//监听onActivityForResult回调
mIgnoreBatteryResultContract = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { activityResult ->//查询是否开启成功if(queryBatteryOptimizeStatus()){//忽略电池优化开启成功}else{//开启失败}}

通过Intent打开忽略电池优化弹框

val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
intent.data = Uri.parse("package:$packageName")
//启动忽略电池优化,会弹出一个系统的弹框,我们在上面的
launchActivityResult(intent)

查询是否成功开启忽略电池优化开关:

fun Context.queryBatteryOptimizeStatus():Boolean{val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager?return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {powerManager?.isIgnoringBatteryOptimizations(packageName)?:false} else {true}
}

(3).无障碍服务

看官方文档:创建自己的无障碍服务

它也是一个Service,它的优先级比较高,提供界面增强功能,初衷是帮助视觉障碍的用户或者是可能暂时无法与设备进行全面互动的用户完成操作。

可以做很多事情,使用了此Service,在6.0+不需要申请悬浮窗权限,直接使用WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY 挺方便的

(仅针对有需要此服务的app,可以开启增强后台保活)

(4).自启动权限(即:白名单管理列表页面)

是系统给用户自己去打开“自启动权限”开关的入口,我们需要针对不同的手机厂商和系统版本,弹出提示引导用户是否前去打开“自启动权限”

有的手机厂商叫:白名单管理,有的叫:自启动权限,两个是一个概念;

点击查看跳转到『手机自启动设置页面』完整代码

(需要注意:如果是代码控制跳转,无法保证永远可以调整,系统升级可能就给你屏蔽了,最简单的方法是:显示一个如何找到自启动页面的引导图,下面以华为手机为例)

华为手机-自启动管理

(5).多任务列表窗口加锁

可以针对不同手机厂商,显示引导用户,开启App窗口加锁之后,点击清理加速不会导致应用被kill

华为手机-窗口加锁教程图

(6).多任务列表窗口隐藏App窗口

刚刚上面多任务窗口加锁完,再提示用户去App里面把隐藏App窗口开关打开,这样用户就不会多任务列表里面把App窗口给手抖划掉

多任务窗口中『隐藏App窗口』,可以用如下代码控制:

(这个也只是针对有这方面需求App提供的一种增强方案罢了:因为隐藏了窗口,用户就不会去想他,不会去手痒去划掉它)

//在多任务列表页面隐藏App窗口
fun hideAppWindow(context: Context,isHide:Boolean){try {val activityManager: ActivityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager//控制App的窗口是否在多任务列表显示activityManager.appTasks[0].setExcludeFromRecents(isHide)}catch (e:Exception){.....}}

(7).应用后台高耗电(Vivo手机独有)

开启的入口:“设置”>“电池”>“后台高耗电”>“找到xxxApp打开开关”
在这里插入图片描述

最后还是奉劝那些,仍然执着于找寻黑科技的开发者,醒醒吧,太阳晒屁股了。

如果说你的App用户群体不是普通用户,是专门给一些玩机大神们用的,都可以root手机的话,那么直接 move 到系统目录 priv/system/app 即可, 即使被用户强杀也会自动重新拉起。

相关内容

热门资讯

安卓系统计划软件推荐,精选计划... 你有没有发现,手机里的安卓系统越来越智能了?这不,最近我可是挖到了一些超棒的安卓计划软件,它们不仅能...
收钱吧安卓系统插件,便捷支付新... 你有没有发现,现在的生活越来越离不开手机了?手机里装满了各种应用,而今天我要跟你聊聊一个特别实用的工...
鸿蒙系统是否还属于安卓,独立于... 你有没有想过,那个在我们手机上默默无闻的鸿蒙系统,它到底是不是安卓的“亲戚”呢?这个问题,估计不少手...
安卓系统手机用什么钱包,轻松管... 你有没有想过,你的安卓系统手机里装了那么多应用,但最离不开的,可能就是那个小小的钱包了。没错,就是那...
安卓系统能玩部落冲突吗,部落冲... 你有没有想过,安卓系统上的手机,是不是也能玩那款风靡全球的《部落冲突》呢?这款游戏自从推出以来,就吸...
智能机器人安卓系统,引领未来智... 你知道吗?在科技飞速发展的今天,智能机器人已经不再是科幻电影里的专属了。它们正悄悄地走进我们的生活,...
华为win10系统改装安卓系统... 你有没有想过,你的华为笔记本电脑里的Windows 10系统,能不能来个华丽变身,变成安卓系统呢?这...
旧电脑上安什么安卓系统,适配不... 你那台旧电脑是不是已经闲置好久了?别让它默默无闻地躺在角落里,给它来个华丽变身吧!今天,就让我来告诉...
安卓app语言跟随系统,随系统... 你知道吗?在手机世界里,有一个神奇的小功能,它就像你的贴身翻译官,无论你走到哪里,都能帮你轻松应对各...
惠城安卓系统降级在哪,揭秘降级... 你有没有遇到过手机系统升级后,发现新系统让你头疼不已,想回到那个熟悉的安卓系统呢?别急,今天就来告诉...
阿里云系统转安卓,揭秘安卓平台... 你知道吗?最近有个大动作在互联网圈里引起了不小的波澜,那就是阿里云系统竟然要转战安卓阵营了!这可不是...
安卓系统有最美壁纸么,探寻最美... 哦,亲爱的安卓用户,你是否曾在某个午后,百无聊赖地翻看着手机,突然被那一张张壁纸惊艳了眼眸?是的,我...
安卓系统采用Linux操作系统... 你知道吗?安卓系统,这个在我们手机上无处不在的小家伙,它的心脏竟然是Linux操作系统内核!是不是觉...
安卓原生平板通用系统,探索安卓... 你有没有发现,现在市面上平板电脑的品牌和型号真是五花八门,让人挑花了眼?不过,你知道吗?在众多安卓平...
小米1系统是安卓几,搭载安卓几... 你有没有想过,你的小米手机里那个熟悉的系统,其实是基于安卓的哦!没错,就是那个全球最流行的手机操作系...
可以安装安卓系统的相机,智能摄... 你有没有想过,一台相机不仅能拍出美美的照片,还能像智能手机一样,玩转各种应用?没错,现在市面上就有这...
安卓系统gps定位不准,安卓G... 你是不是也遇到过这种情况?手机里的安卓系统GPS定位总是不准,让人头疼不已。有时候,你明明就在家附近...
电信机顶盒装安卓系统,开启智能... 你有没有想过,家里的电信机顶盒其实也可以装上安卓系统呢?听起来是不是有点不可思议?别急,让我带你一步...
安卓系统可以做苹果桌面,打造个... 你知道吗?现在科技的发展真是让人眼花缭乱,竟然有人想出了安卓系统可以做苹果桌面的神奇想法!是不是觉得...
安卓系统自带的网页,功能与特色... 你有没有发现,每次打开安卓手机,那熟悉的系统界面里总有一个默默无闻的小家伙——安卓系统自带的网页浏览...