Android正确的保活方案,不要掉进保活需求死循环陷进 | 您所在的位置:网站首页 › 忽略电池优化权限 › Android正确的保活方案,不要掉进保活需求死循环陷进 |
Android 8.0之前-常用的保活方案 Android 8.0之前-常用的保活方案 1.开启一个前台Service。 2.Android 6.0+ 忽略电池优化开关(稍后会有代码)。 3.无障碍服务(只针对有用这个功能的app,如支付宝语音增强提醒用了它)。 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手机)。 1.开启一个前台Service(可以加上,单独启用的话无法满足保活需求)。 2.Android 6.0+ 忽略电池优化开关(稍后会有代码)。 3.无障碍服务(只针对有用这个功能的app,如支付宝语音增强提醒用了它)。 4.应用自启动权限(最简单的方案是针对不同系统提供教程图片-让用户自己去打开)。 5.多任务列表窗口加锁(提供GIF教程图片-让用户自己去打开)。 6.多任务列表窗口隐藏App(仅针对有这方面需求的App)。 7.应用后台高耗电(仅针对Vivo手机)。 3 保活方案实现步骤 (1). 前台Service //前台服务 classForegroundCoreService: Service() { overridefunonBind(intent: Intent?): IBinder? = null privatevarmForegroundNF:ForegroundNF bylazy { ForegroundNF( this) } overridefunonCreate(){ super.onCreate() mForegroundNF.startForegroundNotification() } overridefunonStartCommand(intent: Intent?, flags: Int, startId: Int): Int{ if( null== intent){ //服务被系统kill掉之后重启进来的 returnSTART_NOT_STICKY } mForegroundNF.startForegroundNotification() returnsuper.onStartCommand(intent, flags, startId) } overridefunonDestroy(){ mForegroundNF.stopForegroundNotification() super.onDestroy() } } //初始化前台通知,停止前台通知 classForegroundNF( privatevalservice: ForegroundCoreService) : ContextWrapper(service) { companionobject{ privateconst valSTART_ID = 101 privateconst valCHANNEL_ID = "app_foreground_service" privateconst valCHANNEL_NAME = "前台保活服务" } privatevarmNotificationManager: NotificationManager? = null privatevarmCompatBuilder:NotificationCompat.Builder?= null privatevalcompatBuilder: NotificationCompat.Builder? get() { if(mCompatBuilder == null) { valnotificationIntent = Intent( this, MainActivity:: class.java) notificationIntent.action = Intent.ACTION_MAIN notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER) notificationIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED //动作意图 valpendingIntent = PendingIntent.getActivity( this, (Math.random() * 10+ 10).toInt(), notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT ) valnotificationBuilder: 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 } returnmCompatBuilder } init { createNotificationChannel() } //创建通知渠道 privatefuncreateNotificationChannel(){ mNotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) asNotificationManager //针对8.0+系统 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { valchannel = NotificationChannel( CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_LOW ) channel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC channel.setShowBadge( false) mNotificationManager?.createNotificationChannel(channel) } } //开启前台通知 funstartForegroundNotification(){ service.startForeground(START_ID, compatBuilder?.build()) } //停止前台服务并清除通知 funstopForegroundNotification(){ 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打开忽略电池优化弹框: valintent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) intent. data= Uri.parse( "package:$packageName") //启动忽略电池优化,会弹出一个系统的弹框,我们在上面的 launchActivityResult(intent) 查询是否成功开启忽略电池优化开关: funContext.queryBatteryOptimizeStatus(): Boolean{ valpowerManager = getSystemService(Context.POWER_SERVICE) asPowerManager? returnif(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { powerManager?.isIgnoringBatteryOptimizations(packageName)?: false } else{ true } } (3).无障碍服务 看官方文档:创建自己的无障碍服务。 https://developer.android.com/guide/topics/ui/accessibility/service?hl=zh-cn 它也是一个Service,它的优先级比较高,提供界面增强功能,初衷是帮助视觉障碍的用户或者是可能暂时无法与设备进行全面互动的用户完成操作。 可以做很多事情,使用了此Service,在6.0+不需要申请悬浮窗权限,直接使用WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY挺方便的 (仅针对有需要此服务的app,可以开启增强后台保活)。 (4).自启动权限(即:白名单管理列表页面) 是系统给用户自己去打开“自启动权限”开关的入口,我们需要针对不同的手机厂商和系统版本,弹出提示引导用户是否前去打开“自启动权限”。 有的手机厂商叫:白名单管理,有的叫:自启动权限,两个是一个概念; 点击查看跳转到『手机自启动设置页面』完整代码。 https://gist.github.com/TheMelody/5044dd1b697707b18e94b89f97f55db6 (需要注意:如果是代码控制跳转,无法保证永远可以调整,系统升级可能就给你屏蔽了, 最简单的方法是:显示一个如何找到自启动页面的引导图,下面以华为手机为例:) 华为手机-自启动管理 (5).多任务列表窗口加锁 可以针对不同手机厂商,显示引导用户,开启App窗口加锁之后,点击清理加速不会导致应用被kill。 华为手机窗口加锁-教程图 (6).多任务列表窗口隐藏App窗口 刚刚上面多任务窗口加锁完,再提示用户去App里面把隐藏App窗口开关打开,这样用户就不会在多任务列表里面把App窗口给手抖划掉。 多任务窗口中『隐藏App窗口』,可以用如下代码控制: (这个也只是针对有这方面需求App提供的一种增强方案罢了:因为隐藏了窗口,用户就不会去想他,不会去手痒去划掉它)。 //在多任务列表页面隐藏App窗口 funhideAppWindow(context: Context,isHide:Boolean){ try{ valactivityManager: ActivityManager = context.getSystemService(Context.ACTIVITY_SERVICE) asActivityManager //控制App的窗口是否在多任务列表显示 activityManager.appTasks[ 0].setExcludeFromRecents(isHide) } catch(e:Exception){ ..... } } (7).应用后台高耗电(Vivo手机独有) 开启的入口:“设置”>“电池”>“后台高耗电”>“找到xxxApp打开开关”。 vivo允许后台高耗电 最后还是奉劝那些,仍然执着于找寻黑科技的开发者,醒醒吧,太阳晒屁股了。 如果说你的App用户群体不是普通用户,是专门给一些玩机大神们用的,都可以root手机的话,那么直接 move 到系统目录 priv/system/app 即可, 即使被用户强杀也会自动重新拉起。 最后推荐一下我做的网站,玩Android: wanandroid.com,包含详尽的知识体系、好用的工具,还有本公众号文章合集,欢迎体验和收藏! 推荐阅读: Android 开发太难了,跨进程如何传递大图? Android 冷知识,我要被 GC 了... 吹爆系列:Android内存还可以这样优化! 点击关注我的公众号 如果你想要跟大家分享你的文章,欢迎投稿~ ┏(^0^)┛明天见!返回搜狐,查看更多 |
CopyRight 2018-2019 实验室设备网 版权所有 |