91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android后臺運行白名單實現保活的方法

發布時間:2021-05-28 14:33:08 來源:億速云 閱讀:2267 作者:小新 欄目:移動開發

小編給大家分享一下Android后臺運行白名單實現保活的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

保活現狀

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

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

優雅保活?

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

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

后臺運行白名單

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

Android后臺運行白名單實現保活的方法

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

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

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

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

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

@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;
}

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

Android后臺運行白名單實現保活的方法

可以看到,這個系統彈窗會有影響電池續航的提醒,所以如果想讓用戶點允許,必須要有相關的說明。如果要判斷用戶是否點擊了允許,可以在申請的時候調用 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后臺運行白名單實現保活的方法

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

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

以上是“Android后臺運行白名單實現保活的方法”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

双鸭山市| 博客| 西昌市| 梁平县| 临夏市| 大同市| 阿荣旗| 临沂市| 来宾市| 白河县| 巴塘县| 蕲春县| 长兴县| 靖州| 汉川市| 吉安市| 报价| 北碚区| 锦州市| 临泽县| 静安区| 宝坻区| 龙山县| 桓仁| 姜堰市| 蕉岭县| 洛扎县| 军事| 海城市| 哈尔滨市| 崇义县| 南平市| 蓬莱市| 宣城市| 颍上县| 晋中市| 河间市| 景泰县| 大同县| 英德市| 徐州市|