怎么做淘宝 天猫京东网店的网站,如何做汽车团购网站,wordpress文章底部删除,微信公众号做留言网站作者#xff1a;NanBox保活现状我们知道#xff0c;Android 系统会存在杀后台进程的情况#xff0c;并且随着系统版本的更新#xff0c;杀进程的力度还有越来越大的趋势。系统这种做法本身出发点是好的#xff0c;因为可以节省内存#xff0c;降低功耗#xff0c;也避免…作者NanBox保活现状我们知道Android 系统会存在杀后台进程的情况并且随着系统版本的更新杀进程的力度还有越来越大的趋势。系统这种做法本身出发点是好的因为可以节省内存降低功耗也避免了一些流氓行为。但有一部分应用应用本身的使用场景就需要在后台运行用户也是愿意让它在后台运行的比如跑步类应用。一方面流氓软件用各种流氓手段进行保活另一方面系统加大杀后台的力度导致我们一些真正需要在后台运行的应用被误杀苦不堪言。优雅保活为了做到保活出现了不少「黑科技」比如 1 个像素的 Activity播放无声音频双进程互相守护等。这些做法可以说是很流氓了甚至破坏了 Android 的生态好在随着 Android 系统版本的更新这些非常规的保活手段很多都已失效了。对于那些确实需要在后台运行的应用我们如何做到优雅的保活呢后台运行白名单从 Android 6.0 开始系统为了省电增加了休眠模式系统待机一段时间后会杀死后台正在运行的进程。但系统会有一个后台运行白名单白名单里的应用将不会受到影响在原生系统下通过「设置」 - 「电池」 - 「电池优化」 - 「未优化应用」可以看到这个白名单通常会看到下面这两位下次被产品说「 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(); }}申请时应用上会出现这样一个窗口可以看到这个系统弹窗会有影响电池续航的提醒所以如果想让用户点允许必须要有相关的说明。如果要判断用户是否点击了允许可以在申请的时候调用 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 是某咚做的某咚从设计、从我写的不够好的文案甚至是我从十几台手机上一张一张截下来的图进行了全方位的致敬。感谢某咚的认可但最近在某个发布会上听到这么一句话在致敬的同时能不能说一句谢谢某咚的致敬一方面说明了目前确实存在进程容易被杀保活难度大的问题另一方面也说明了这种引导用户进行白名单设置的手段是有效的。感谢大家能耐着性子看完啰里啰嗦的文章在这里我也分享一份私货自己收录整理的Android学习PDF架构视频面试文档源码笔记还有高级架构技术进阶脑图、Android开发面试专题资料高级进阶架构资料帮助大家学习提升进阶也节省大家在网上搜索资料的时间来学习也可以分享给身边好友一起学习如果你有需要的话可以点赞评论转发关注我然后私信我【进阶】我发给你