日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
實現(xiàn)后臺優(yōu)雅保活有困難?不存在的!

?;瞵F(xiàn)狀

創(chuàng)新互聯(lián)建站長期為1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為許昌企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計許昌網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

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

但有一部分應(yīng)用,應(yīng)用本身的使用場景就需要在后臺運行,用戶也是愿意讓它在后臺運行的,比如跑步類應(yīng)用。一方面流氓軟件用各種流氓手段進(jìn)行?;?,另一方面系統(tǒng)加大殺后臺的力度,導(dǎo)致我們一些真正需要在后臺運行的應(yīng)用被誤殺,苦不堪言。

優(yōu)雅?;?

為了做到?;?,出現(xiàn)了不少「黑科技」,比如 1 個像素的 Activity,播放無聲音頻,雙進(jìn)程互相守護(hù)等。這些做法可以說是很流氓了,甚至破壞了 Android 的生態(tài),好在隨著 Android 系統(tǒng)版本的更新,這些非常規(guī)的?;钍侄魏芏喽家咽Я?。

對于那些確實需要在后臺運行的應(yīng)用,我們?nèi)绾巫龅絻?yōu)雅的?;钅?

后臺運行白名單

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

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

好在系統(tǒng)還沒有拋棄我們,允許我們申請把應(yīng)用加入白名單。

首先,在 AndroidManifest.xml 文件中配置一下權(quán)限:

 
 
 
 

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

 
 
 
 
  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;
  9. }

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

 
 
 
 
  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.     }
  10. }

申請時,應(yīng)用上會出現(xiàn)這樣一個窗口:

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

廠商后臺管理

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

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

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

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

 
 
 
 
  1. /**
  2.  * 跳轉(zhuǎn)到指定應(yīng)用的首頁
  3.  */
  4. private void showActivity(@NonNull String packageName) {
  5.     Intent intent = getPackageManager().getLaunchIntentForPackage(packageName);
  6.     startActivity(intent);
  7. }
  8. /**
  9.  * 跳轉(zhuǎn)到指定應(yīng)用的指定頁面
  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);
  16. }

以下是部分手機(jī)的廠商判斷,跳轉(zhuǎn)方法及對應(yīng)設(shè)置步驟,跳轉(zhuǎn)方法不保證在所有版本上都能成功跳轉(zhuǎn),都需要加 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.     }
  7. }

跳轉(zhuǎn)華為手機(jī)管家的啟動管理頁:

 
 
 
 
  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.     }
  9. }

操作步驟:應(yīng)用啟動管理 -> 關(guān)閉應(yīng)用開關(guān) -> 打開允許自啟動

小米

廠商判斷:

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

跳轉(zhuǎn)小米安全中心的自啟動管理頁面:

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

操作步驟:授權(quán)管理 -> 自啟動管理 -> 允許應(yīng)用自啟動

OPPO

廠商判斷:

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

跳轉(zhuǎn) OPPO 手機(jī)管家:

 
 
 
 
  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.     }
  15. }

操作步驟:權(quán)限隱私 -> 自啟動管理 -> 允許應(yīng)用自啟動

VIVO

廠商判斷:

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

跳轉(zhuǎn) VIVO 手機(jī)管家:

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

操作步驟:權(quán)限管理 -> 自啟動 -> 允許應(yīng)用自啟動

魅族

廠商判斷:

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

跳轉(zhuǎn)魅族手機(jī)管家:

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

操作步驟:權(quán)限管理 -> 后臺管理 -> 點擊應(yīng)用 -> 允許后臺運行

三星

廠商判斷:

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

跳轉(zhuǎn)三星智能管理器:

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

操作步驟:自動運行應(yīng)用程序 -> 打開應(yīng)用開關(guān) -> 電池管理 -> 未監(jiān)視的應(yīng)用程序 -> 添加應(yīng)用

樂視

廠商判斷:

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

跳轉(zhuǎn)樂視手機(jī)管家:

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

操作步驟:自啟動管理 -> 允許應(yīng)用自啟動

錘子

廠商判斷:

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

跳轉(zhuǎn)手機(jī)管理:

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

操作步驟:權(quán)限管理 -> 自啟動權(quán)限管理 -> 點擊應(yīng)用 -> 允許被系統(tǒng)啟動

友商致敬?

在之前做的跑步應(yīng)用中,我在設(shè)置里增加了一個權(quán)限設(shè)置頁面,將上面提到的設(shè)置放在這里面。最近發(fā)現(xiàn)友商某咚也跟進(jìn)了,圖 1 是我們做的,圖 2 是某咚做的:

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

某咚的致敬,一方面說明了目前確實存在進(jìn)程容易被殺,?;铍y度大的問題,另一方面也說明了這種引導(dǎo)用戶進(jìn)行白名單設(shè)置的手段是有效的。


分享名稱:實現(xiàn)后臺優(yōu)雅?;钣欣щy?不存在的!
分享地址:http://www.5511xx.com/article/cdiecie.html