android應用申請加入電池優化白名單


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

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


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

1
2
3
4
5
6
7
8
9
@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;
}


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

01
02
03
04
05
06
07
08
09
10
@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();
     }
}


申請時,應用上會出現這樣一個窗口:
2020年了,Android后台保活還有戲嗎?看我如何優雅的實現!_b.jpg

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

 

加入后台運行白名單的多廠商適配方法

 

7.1基本說明


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

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
/**
  * 跳轉到指定應用的首頁
  */
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。
 

7.2華為


廠商判斷:

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


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

1
2
3
4
5
6
7
8
9
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" );
     }
}


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

7.3小米


廠商判斷:

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


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

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


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

7.4OPPO


廠商判斷:

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


跳轉 OPPO 手機管家:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
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" );
             }
         }
     }
}


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

7.5VIVO


廠商判斷:

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


跳轉 VIVO 手機管家:

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


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

7.6魅族


廠商判斷:

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


跳轉魅族手機管家:

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


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

7.7三星


廠商判斷:

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


跳轉三星智能管理器:

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


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

7.8樂視


廠商判斷:

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


跳轉樂視手機管家:

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


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

7.9錘子


廠商判斷:

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


跳轉手機管理:

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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM