1s后跳转 android_优雅保活方案,原来Android还可以这样保活

作者:NanBox

保活现状

我们知道,Android 系统会存在杀后台进程的情况,并且随着系统版本的更新,杀进程的力度还有越来越大的趋势。系统这种做法本身出发点是好的,因为可以节省内存,降低功耗,也避免了一些流氓行为。

但有一部分应用,应用本身的使用场景就需要在后台运行,用户也是愿意让它在后台运行的,比如跑步类应用。一方面流氓软件用各种流氓手段进行保活,另一方面系统加大杀后台的力度,导致我们一些真正需要在后台运行的应用被误杀,苦不堪言。

优雅保活?

为了做到保活,出现了不少「黑科技」,比如 1 个像素的 Activity,播放无声音频,双进程互相守护等。这些做法可以说是很流氓了,甚至破坏了 Android 的生态,好在随着 Android 系统版本的更新,这些非常规的保活手段很多都已失效了。

对于那些确实需要在后台运行的应用,我们如何做到优雅的保活呢?

后台运行白名单

从 Android 6.0 开始,系统为了省电增加了休眠模式,系统待机一段时间后,会杀死后台正在运行的进程。但系统会有一个后台运行白名单,白名单里的应用将不会受到影响,在原生系统下,通过「设置」 - 「电池」 - 「电池优化」 - 「未优化应用」,可以看到这个白名单,通常会看到下面这两位

11bb4d5826aba610ec3363e644e056b3.png

下次被产品说「 XXX 都可以保活,为什么我们不行!」的时候,你就知道怎么怼回去了。大厂通过和手机厂商的合作,将自己的应用默认加入到白名单中。如果你能谈成这种合作的大厂,也就不用往下看了。

好在系统还没有抛弃我们,允许我们申请把应用加入白名单。

首先,在 AndroidManifest.xml 文件中配置一下权限:

可以通过以下方法,判断我们的应用是否在白名单中:

@RequiresApi(api = Build.VERSION_CODES.M)private boolean isIgnoringBatteryOptimizations() {    boolean isIgnoring = false;    PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);    if (powerManager != null) {        isIgnoring = powerManager.isIgnoringBatteryOptimizations(getPackageName());    }    return isIgnoring;}

如果不在白名单中,可以通过以下代码申请加入白名单:

@RequiresApi(api = Build.VERSION_CODES.M)public void requestIgnoreBatteryOptimizations() {    try {        Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);        intent.setData(Uri.parse("package:" + getPackageName()));        startActivity(intent);    } catch (Exception e) {        e.printStackTrace();    }}

申请时,应用上会出现这样一个窗口:

f3abebcaac108cec4cdf779fadd234b1.png

可以看到,这个系统弹窗会有影响电池续航的提醒,所以如果想让用户点允许,必须要有相关的说明。如果要判断用户是否点击了允许,可以在申请的时候调用 startActivityForResult,在 onActivityResult 里再判断一次是否在白名单中。

厂商后台管理

Android 开发的一个难点在于,各大手机厂商对原生系统进行了不同的定制,导致我们需要进行不同的适配,后台管理就是一个很好的体现。几乎各个厂商都有自己的后台管理,就算应用加入了后台运行白名单,仍然可能会被厂商自己的后台管理干掉。

如果能把应用加入厂商系统的后台管理白名单,可以进一步降低进程被杀的概率。不同的厂商在不同的地方进行设置,一般是在各自的「手机管家」,但更难的是,就算同一个厂商的系统,不同的版本也可能是在不同地方设置。

最理想的做法是,我们根据不同手机,甚至是不同的系统版本,给用户呈现一个图文操作步骤,并且提供一个按钮,直接跳转到指定页面进行设置。但需要对每个厂商每个版本进行适配,工作量是比较大的。我使用真机测试了大部分主流 Android 厂商的手机后,整理出了部分手机的相关资料。

首先我们可以定义这样两个方法:

/** * 跳转到指定应用的首页 */private void showActivity(@NonNull String packageName) {    Intent intent = getPackageManager().getLaunchIntentForPackage(packageName);    startActivity(intent);}/** * 跳转到指定应用的指定页面 */private void showActivity(@NonNull String packageName, @NonNull String activityDir) {    Intent intent = new Intent();    intent.setComponent(new ComponentName(packageName, activityDir));    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    startActivity(intent);}

以下是部分手机的厂商判断,跳转方法及对应设置步骤,跳转方法不保证在所有版本上都能成功跳转,都需要加 try catch。

华为

厂商判断:

public boolean isHuawei() {    if (Build.BRAND == null) {        return false;    } else {        return Build.BRAND.toLowerCase().equals("huawei") || Build.BRAND.toLowerCase().equals("honor");    }}

跳转华为手机管家的启动管理页:

private void goHuaweiSetting() {    try {        showActivity("com.huawei.systemmanager",            "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity");    } catch (Exception e) {        showActivity("com.huawei.systemmanager",            "com.huawei.systemmanager.optimize.bootstart.BootStartActivity");    }}

操作步骤:应用启动管理 -> 关闭应用开关 -> 打开允许自启动

小米

厂商判断:

public static boolean isXiaomi() {    return Build.BRAND != null && Build.BRAND.toLowerCase().equals("xiaomi");}

跳转小米安全中心的自启动管理页面:

private void goXiaomiSetting() {    showActivity("com.miui.securitycenter",        "com.miui.permcenter.autostart.AutoStartManagementActivity");}

操作步骤:授权管理 -> 自启动管理 -> 允许应用自启动

OPPO

厂商判断:

public static boolean isOPPO() {    return Build.BRAND != null && Build.BRAND.toLowerCase().equals("oppo");}

跳转 OPPO 手机管家:

private void goOPPOSetting() {    try {        showActivity("com.coloros.phonemanager");    } catch (Exception e1) {        try {            showActivity("com.oppo.safe");        } catch (Exception e2) {            try {                showActivity("com.coloros.oppoguardelf");            } catch (Exception e3) {                showActivity("com.coloros.safecenter");            }        }    }}

操作步骤:权限隐私 -> 自启动管理 -> 允许应用自启动

VIVO

厂商判断:

public static boolean isVIVO() {    return Build.BRAND != null && Build.BRAND.toLowerCase().equals("vivo");}

跳转 VIVO 手机管家:

private void goVIVOSetting() {    showActivity("com.iqoo.secure");}

操作步骤:权限管理 -> 自启动 -> 允许应用自启动

魅族

厂商判断:

public static boolean isMeizu() {    return Build.BRAND != null && Build.BRAND.toLowerCase().equals("meizu");}

跳转魅族手机管家:

private void goMeizuSetting() {    showActivity("com.meizu.safe");}

操作步骤:权限管理 -> 后台管理 -> 点击应用 -> 允许后台运行

三星

厂商判断:

public static boolean isSamsung() {    return Build.BRAND != null && Build.BRAND.toLowerCase().equals("samsung");}

跳转三星智能管理器:

private void goSamsungSetting() {    try {        showActivity("com.samsung.android.sm_cn");    } catch (Exception e) {        showActivity("com.samsung.android.sm");    }}

操作步骤:自动运行应用程序 -> 打开应用开关 -> 电池管理 -> 未监视的应用程序 -> 添加应用

乐视

厂商判断:

public static boolean isLeTV() {    return Build.BRAND != null && Build.BRAND.toLowerCase().equals("letv");}

跳转乐视手机管家:

private void goLetvSetting() {    showActivity("com.letv.android.letvsafe",         "com.letv.android.letvsafe.AutobootManageActivity");}

操作步骤:自启动管理 -> 允许应用自启动

锤子

厂商判断:

    public static boolean isSmartisan() {        return Build.BRAND != null && Build.BRAND.toLowerCase().equals("smartisan");    }

跳转手机管理:

private void goSmartisanSetting() {    showActivity("com.smartisanos.security");}

操作步骤:权限管理 -> 自启动权限管理 -> 点击应用 -> 允许被系统启动

友商致敬?

在之前做的跑步应用中,我在设置里增加了一个权限设置页面,将上面提到的设置放在这里面。最近发现友商某咚也跟进了,图 1 是我们做的,图 2 是某咚做的:

a3471c81f09d05b0ee7c68f9b83a6f43.png

某咚从设计、从我写的不够好的文案,甚至是我从十几台手机上一张一张截下来的图,进行了全方位的致敬。感谢某咚的认可,但最近在某个发布会上听到这么一句话:在致敬的同时,能不能说一句谢谢?

某咚的致敬,一方面说明了目前确实存在进程容易被杀,保活难度大的问题,另一方面也说明了这种引导用户进行白名单设置的手段是有效的。


感谢大家能耐着性子看完啰里啰嗦的文章

在这里我也分享一份私货,自己收录整理的Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习

如果你有需要的话,可以点赞+评论+转发关注我,然后私信我【进阶】我发给你

8cb2e48bd97cd58df773b5d245d4a9bd.png
d43686c3b3da7fb52a87f3e4c78912ca.png
02c485a36d4eea4fee3257392e11cd9b.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wordpress致命错误怎么解决_pppoe错误是什么意思 pppoe错误怎么解决

最近有网友反应无线路由器上设置PPPoE拨号上网后,发现PPPoE连接不上,显示pppoe错误是什么意思呢?pppoe错误怎么解决呢?接下来详细为大家介绍:pppoe错误怎么解决无线路由器设置PPPoE拨号后,PPPoE拨号连接不上,不能够上…

java ssm 多租户_(十一)java B2B2C 源码 多级分销springmvc mybatis多租户电子商城系统- SSO单点登录之OAuth2.0登录流程(2)...

上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名密码实现OAuth2.0的登录认证):上面的图很清楚的描述了当前登录…

几何画板200个经典课件_项目制学科联动 | 金芬娥首席工作室:灵动“画板”,研修创新,协同进步...

西湖区成立115个“项目制首席教师工作室”,建立中小学、幼儿园学科联动机制,以专业发展为目标,以教育问题为导向,整合发挥学科教研员、学科带头人和名师工作室领衔人的智力资源,助推教师的专业成长及区域的学科建设。西…

通过这些简单的步骤从头开始学习Java

Java是用于软件开发的最流行的编程语言之一。 无论您的最终目标或技能水平如何,学习和掌握Java都将为您作为开发人员打开大门。 今天,我们将讨论一些原因,我们认为您应该开始学习Java,然后提供有关入门的深入路线图。 为什么要学…

vs 服务容器中已存在服务_敏捷基础设施和公共基础服务

敏捷基础设施和公共基础服务敏捷基础设施和公共基础服务是微服务架构的有力支撑;能够简化业务开发,提升架构能力的基线。Cloud Native的基石是微服务架构、敏捷基础设施和公共基础服务。敏捷基础设施 - 通过容器封装环境,开发人员可以直接将所…

使用php吧excel数据存到数据库,php如何存excel数据到数据库

一、使用PHPExcel Parser Pro软件,但是这个软件为收费软件;二、可将EXCEL表保存为CSV格式,然后通过phpmyadmin或者SQLyog导入,SQLyog导入的方法为:将EXCEL表另存为CSV形式;打开SQLyog,对要导入的…

sle linux lftp禁止匿名登陆_软件测试常用linux命令整理

作为一个名软件测试工程师,掌握Linux的基本操作是必须的。下面罗列下linux的常用命令,方便大家今后操作linux时查找,然后通过[帮助命令]进行具体的使用。1、帮助命令man -- man 命令 查看命令的使用帮助说明。2、显示目录和文件的命令ls --…

用php模拟斗地主发牌,php模拟实现斗地主发牌

本文实例为大家分享了php实现斗地主发牌的具体代码,供大家参考,具体内容如下闲来无聊,就写了这个方法,也算是熟悉下php的数组操作,还请各位大神多指教。$arr 数组,好像有点问题,应该 2>"…

如何在AWS EC2实例上部署Spring Boot应用程序

你好朋友, 在本教程中,我们将看到如何在AWS EC2实例上部署Spring Boot应用程序。 这是我们将要执行的步骤。 1.使用Spring Boot Initialiser创建一个Spring Boot项目。 2.创建一个休息端点,部署后我们可以访问 3.启动EC2实例 4.将我们的…

成为Java流大师–第3部分:终端操作

比尔盖茨曾经说过:“我选择一个懒惰的人去做一件困难的事情,因为一个懒惰的人会找到一个简单的方法来做。” 关于流,没有什么比这更真实了。 在本文中,您将学习Stream如何通过在调用终端操作之前不对源元素执行任何计算来避免不必…

matlab多径信道模型,基于matlab的无线多径信道建模与仿真分析

基于matlab的无线多径信道建模与仿真分析 基于MATLAB的无线多径信道建模与仿真分析 摘 要:对于无线通信, 衰落是影响系统性能的重要因素, 而不同形式的衰落对于信号产生的影响 也不相同。本文在阐述移动多径信道特性的基础上, 建立了不同信道模型下多径时延效应的计算 机仿真模…

您的JVM是否泄漏文件描述符-像我的一样?

前言:此处描述的两个问题是在一年前发现并修复的。 本文仅用作历史证明,也是有关解决Java中文件描述符泄漏的初学者指南。 在Ultra ESB中,我们使用内存RAM磁盘文件缓存来进行快速且无垃圾的有效负载处理。 一段时间以前,我们在共…

螺旋桨设计软件_欧洲斥巨资研发的A400M螺旋桨运输机,为啥就没人买啊?| 图说...

A400M是欧洲自行设计、研制和生产的新一代军用运输机,也是欧盟国家进行合作的最大的武器联合研制项目。A400M最大的特点,就是其标志性的8叶弯刀螺旋桨。A400M也是20世纪后服役的为数不多的几个使用涡轮旋桨发动机的军用运输机之一。A400M曾在系列电影《碟…

JAR文件句柄:烦恼后清理!

在Ultra ESB中,我们使用特殊的热交换类加载器 ,该加载器使我们可以按需重新加载Java类。 这使我们能够从字面上热交换我们的部署单元 -加载,卸载,使用更新的类重新加载,以及正常地逐步退出-无需重启JVM。 Windows&…

大气校正后的ndvi_Sentinel2 L1C下载、大气校正、重采样

点击蓝字关注我哦1.基本信息(成像仪/重访周期/波段数/分辨率)哨兵2号是高分辨率多光谱成像卫星,携带一枚多光谱成像仪(MSI),用于陆地监测,可提供植被、土壤和水覆盖、内陆水路及海岸区域等图像,分为2A和2B两颗卫星,哨兵&#xff0…

php strtotime month bug,处理PHP strtotime的BUG

PHP strtotime的BUG处理最近使用了strtotime结合-1 month, 1 month, next month获取上个月或者下个月的日期,不过刚看到一篇文章,才知道原来使用strtotime直接获取日期还是有点小BUGBUG如日期:$today 2020-12-31;echo date("Y-m-d"…

JMetro版本11.5.11和8.5.11发布

你好 具有新JMetro样式的另一个版本(深色和浅色版本): 分割菜单按钮 分割窗格 药丸按钮/分段按钮 调整现有样式和错误修复。 继续阅读以获取详细信息。 分割菜单按钮 以下是一个动画,显示了新的“拆分菜单按钮” JMetro浅色…

python xlutils函数,python3:xlrd、xlwt、xlutils处理excel文件

1.xlrd读取excel请参考上篇博客https://www.cnblogs.com/shapeL/p/9075843.html2.xlwt生成excel安装下载:pip install xlwt导入:import xlwt参考:生成excel文件test1.xlsfile_name ../dataconfig/test1.xlswbk xlwt.Workbook() #初始化work…

通过Apache Kafka集成流式传输大数据

从实时实时过滤和处理大量数据,到将日志数据和度量数据记录到不同来源的集中处理程序中,Apache Kafka日益集成到各种系统和解决方案中。 使用CData Sync ,可以轻松地将此类解决方案应用于任何CRM,ERP或Analytics软件。 配置Apach…

安卓php推送消息机制,深入剖析Android消息机制原理

在Android中,线程内部或者线程之间进行信息交互时经常会使用消息,这些基础的东西如果我们熟悉其内部的原理,将会使我们容易、更好地架构系统,避免一些低级的错误。在学习Android中消息机制之前,我们先了解与消息有关的…