成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

實現后臺優雅保活有困難?不存在的!

移動開發 Android
我們知道,Android 系統會存在殺后臺進程的情況,并且隨著系統版本的更新,殺進程的力度還有越來越大的趨勢。系統這種做法本身出發點是好的,因為可以節省內存,降低功耗,也避免了一些流氓行為。

[[287287]]

保活現狀

我們知道,Android 系統會存在殺后臺進程的情況,并且隨著系統版本的更新,殺進程的力度還有越來越大的趨勢。系統這種做法本身出發點是好的,因為可以節省內存,降低功耗,也避免了一些流氓行為。

但有一部分應用,應用本身的使用場景就需要在后臺運行,用戶也是愿意讓它在后臺運行的,比如跑步類應用。一方面流氓軟件用各種流氓手段進行保活,另一方面系統加大殺后臺的力度,導致我們一些真正需要在后臺運行的應用被誤殺,苦不堪言。

優雅保活?

為了做到保活,出現了不少「黑科技」,比如 1 個像素的 Activity,播放無聲音頻,雙進程互相守護等。這些做法可以說是很流氓了,甚至破壞了 Android 的生態,好在隨著 Android 系統版本的更新,這些非常規的保活手段很多都已失效了。

對于那些確實需要在后臺運行的應用,我們如何做到優雅的保活呢?

后臺運行白名單

從 Android 6.0 開始,系統為了省電增加了休眠模式,系統待機一段時間后,會殺死后臺正在運行的進程。但系統會有一個后臺運行白名單,白名單里的應用將不會受到影響,在原生系統下,通過「設置」 - 「電池」 - 「電池優化」 - 「未優化應用」,可以看到這個白名單,通常會看到下面這兩位:

 

下次被產品說「 XXX 都可以保活,為什么我們不行!」的時候,你就知道怎么懟回去了。大廠通過和手機廠商的合作,將自己的應用默認加入到白名單中。如果你在一個能談成這種合作的大廠,也就不用往下看了。

好在系統還沒有拋棄我們,允許我們申請把應用加入白名單。

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

  1. <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> 

可以通過以下方法,判斷我們的應用是否在白名單中:

  1. @RequiresApi(api = Build.VERSION_CODES.M) 
  2. private boolean isIgnoringBatteryOptimizations() { 
  3.     boolean isIgnoring = false
  4.     PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
  5.     if (powerManager != null) { 
  6.         isIgnoring = powerManager.isIgnoringBatteryOptimizations(getPackageName()); 
  7.     } 
  8.     return isIgnoring; 

如果不在白名單中,可以通過以下代碼申請加入白名單:

  1. @RequiresApi(api = Build.VERSION_CODES.M) 
  2. public void requestIgnoreBatteryOptimizations() { 
  3.     try { 
  4.         Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); 
  5.         intent.setData(Uri.parse("package:" + getPackageName())); 
  6.         startActivity(intent); 
  7.     } catch (Exception e) { 
  8.         e.printStackTrace(); 
  9.     } 

申請時,應用上會出現這樣一個窗口:

 

可以看到,這個系統彈窗會有影響電池續航的提醒,所以如果想讓用戶點允許,必須要有相關的說明。如果要判斷用戶是否點擊了允許,可以在申請的時候調用 startActivityForResult,在 onActivityResult 里再判斷一次是否在白名單中。

廠商后臺管理

Android 開發的一個難點在于,各大手機廠商對原生系統進行了不同的定制,導致我們需要進行不同的適配,后臺管理就是一個很好的體現。幾乎各個廠商都有自己的后臺管理,就算應用加入了后臺運行白名單,仍然可能會被廠商自己的后臺管理干掉。

如果能把應用加入廠商系統的后臺管理白名單,可以進一步降低進程被殺的概率。不同的廠商在不同的地方進行設置,一般是在各自的「手機管家」,但更難的是,就算同一個廠商的系統,不同的版本也可能是在不同地方設置。

最理想的做法是,我們根據不同手機,甚至是不同的系統版本,給用戶呈現一個圖文操作步驟,并且提供一個按鈕,直接跳轉到指定頁面進行設置。但需要對每個廠商每個版本進行適配,工作量是比較大的。我使用真機測試了大部分主流 Android 廠商的手機后,整理出了部分手機的相關資料。

首先我們可以定義這樣兩個方法:

  1. /** 
  2.  * 跳轉到指定應用的首頁 
  3.  */ 
  4. private void showActivity(@NonNull String packageName) { 
  5.     Intent intent = getPackageManager().getLaunchIntentForPackage(packageName); 
  6.     startActivity(intent); 
  7.  
  8. /** 
  9.  * 跳轉到指定應用的指定頁面 
  10.  */ 
  11. private void showActivity(@NonNull String packageName, @NonNull String activityDir) { 
  12.     Intent intent = new Intent(); 
  13.     intent.setComponent(new ComponentName(packageName, activityDir)); 
  14.     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
  15.     startActivity(intent); 

以下是部分手機的廠商判斷,跳轉方法及對應設置步驟,跳轉方法不保證在所有版本上都能成功跳轉,都需要加 try catch。

華為

廠商判斷:

  1. public boolean isHuawei() { 
  2.     if (Build.BRAND == null) { 
  3.         return false
  4.     } else { 
  5.         return Build.BRAND.toLowerCase().equals("huawei") || Build.BRAND.toLowerCase().equals("honor"); 
  6.     } 

跳轉華為手機管家的啟動管理頁:

  1. private void goHuaweiSetting() { 
  2.     try { 
  3.         showActivity("com.huawei.systemmanager"
  4.             "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity"); 
  5.     } catch (Exception e) { 
  6.         showActivity("com.huawei.systemmanager"
  7.             "com.huawei.systemmanager.optimize.bootstart.BootStartActivity"); 
  8.     } 

操作步驟:應用啟動管理 -> 關閉應用開關 -> 打開允許自啟動

小米

廠商判斷:

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

跳轉小米安全中心的自啟動管理頁面:

  1. private void goXiaomiSetting() { 
  2.     showActivity("com.miui.securitycenter"
  3.         "com.miui.permcenter.autostart.AutoStartManagementActivity"); 

操作步驟:授權管理 -> 自啟動管理 -> 允許應用自啟動

OPPO

廠商判斷:

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

跳轉 OPPO 手機管家:

  1. private void goOPPOSetting() { 
  2.     try { 
  3.         showActivity("com.coloros.phonemanager"); 
  4.     } catch (Exception e1) { 
  5.         try { 
  6.             showActivity("com.oppo.safe"); 
  7.         } catch (Exception e2) { 
  8.             try { 
  9.                 showActivity("com.coloros.oppoguardelf"); 
  10.             } catch (Exception e3) { 
  11.                 showActivity("com.coloros.safecenter"); 
  12.             } 
  13.         } 
  14.     } 

操作步驟:權限隱私 -> 自啟動管理 -> 允許應用自啟動

VIVO

廠商判斷:

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

跳轉 VIVO 手機管家:

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

操作步驟:權限管理 -> 自啟動 -> 允許應用自啟動

魅族

廠商判斷:

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

跳轉魅族手機管家:

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

操作步驟:權限管理 -> 后臺管理 -> 點擊應用 -> 允許后臺運行

三星

廠商判斷:

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

跳轉三星智能管理器:

  1. private void goSamsungSetting() { 
  2.     try { 
  3.         showActivity("com.samsung.android.sm_cn"); 
  4.     } catch (Exception e) { 
  5.         showActivity("com.samsung.android.sm"); 
  6.     } 

操作步驟:自動運行應用程序 -> 打開應用開關 -> 電池管理 -> 未監視的應用程序 -> 添加應用

樂視

廠商判斷:

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

跳轉樂視手機管家:

  1. private void goLetvSetting() { 
  2.     showActivity("com.letv.android.letvsafe"
  3.         "com.letv.android.letvsafe.AutobootManageActivity"); 

操作步驟:自啟動管理 -> 允許應用自啟動

錘子

廠商判斷:

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

跳轉手機管理:

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

操作步驟:權限管理 -> 自啟動權限管理 -> 點擊應用 -> 允許被系統啟動

友商致敬?

在之前做的跑步應用中,我在設置里增加了一個權限設置頁面,將上面提到的設置放在這里面。最近發現友商某咚也跟進了,圖 1 是我們做的,圖 2 是某咚做的:


 

 

某咚從設計、從我寫的不夠好的文案,甚至是我從十幾臺手機上一張一張截下來的圖,進行了全方位的致敬。感謝某咚的認可,但最近在某個發布會上聽到這么一句話:在致敬的同時,能不能說一句謝謝?

某咚的致敬,一方面說明了目前確實存在進程容易被殺,保活難度大的問題,另一方面也說明了這種引導用戶進行白名單設置的手段是有效的。

責任編輯:武曉燕 來源: 碼個蛋
相關推薦

2021-09-26 05:05:09

WindowWeb JS

2024-12-13 08:25:59

DML操作SQL

2018-01-18 09:43:46

調研 計算機 薪資

2023-09-12 08:02:13

viewport斷點

2018-07-19 06:14:09

2021-01-25 07:21:24

GitHub 開源代碼下載

2018-07-03 14:20:10

數據庫恢復備份

2024-07-22 08:03:55

2020-11-03 10:23:22

云計算容器技術

2009-09-12 09:34:18

Windows 7中國售價

2015-10-20 10:30:59

創業時機

2010-01-05 13:52:02

2017-12-07 14:57:13

404互聯網錯誤代碼

2017-12-26 08:25:57

硬盤數據丟失

2012-05-16 11:35:16

SQL Server拒絕訪問

2009-05-05 17:07:56

2023-03-02 11:44:08

AI技術

2011-07-13 10:01:16

域控制器

2018-07-03 10:09:18

閃存

2022-10-24 08:03:04

MySQL數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久片 | 午夜精品久久久久久久久久久久久 | 日本欧美黄色片 | 97色免费视频 | 国产激情91久久精品导航 | 欧美黑人一级爽快片淫片高清 | 欧美人妇做爰xxxⅹ性高电影 | 碰碰视频 | 精品久久久久久久久久久 | 欧美在线日韩 | 久久久.com| 精品欧美一区二区精品久久久 | 中文字幕一区二区三区乱码在线 | 中日字幕大片在线播放 | 精品国产乱码久久久久久影片 | 欧美日韩精品免费观看 | 日韩精品一区二区三区在线播放 | 欧美激情a∨在线视频播放 成人免费共享视频 | www.天堂av.com | 羞羞色视频| 成人国产一区二区三区精品麻豆 | 久久黄视频 | 亚洲一区二区三区在线免费 | 成人高潮片免费视频欧美 | 欧美视频在线免费 | 亚洲成人精品在线观看 | 久久男女视频 | 在线一区 | 一级毛片免费 | 日韩a| 国产视频一二三区 | 美女视频一区二区三区 | 日韩欧美手机在线 | 国产精品久久久久一区二区三区 | 亚洲国产精品一区在线观看 | 久久久国产网站 | 亚洲午夜精品久久久久久app | 国产视频中文字幕 | 成年人在线观看视频 | 一区二区蜜桃 | 久久99深爱久久99精品 |