Android 6.0 Doze模式请求禁止联网

概述

Android 6.0(API level 23)开始,当手机没有连接到电源,设备进入Doze模式时,系统将通过延迟最近用户没有使用的应用程序的后台CPU运作及网络活动,让应用程序处于App Standby状态,以此来减少电池消耗。

进入Doze睡眠模式条件:

  • 用户不操作设备一段时间
  • 屏幕关闭
  • 设备未连接电源充电

因此为了提高用户的体验,我们的应用有必要增加该功能,具体的做法就是主动弹出询问请求,让用户去选择是否同意应用加入白名单,从而不会因为手机进入Doze模式而影响我们的应用连不到网络等问题;下面就是做题的做法:

在应用主页面的时候去询问,通过以下三种方式去请求:

//方法一,弹系统对话框请求(推荐)
android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
//方法二,跳到相应的设置页面用户自己去设置
android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS
//方法二,请求权限
android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
private void tryRequestBatteryOptimizations() {
    if (isIgnoringBatteryOptimizations()) { 
        Log.e("jl", "permisson true");
    } else { 
        Log.e("jl", "permisson false");
    }    
    forbidInternetRequestDialog();
    Log.e("jl", "permisson ="+isIgnoringBatteryOptimizations());
}
//6.0以上系统,为避免后台运行时禁止联网,需要将PS添加白名单
private void forbidInternetRequestDialog() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        PowerManager powerManager = (PowerManager) getContext().getSystemService(Context.POWER_SERVICE);
        if (!powerManager.isIgnoringBatteryOptimizations(getContext().getPackageName())) {
            //方法一,弹系统对话框请求
            Intent intent = new Intent(android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).setData(Uri.parse("package:" + getContext().getPackageName()));
            intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            startActivity(intent);
            //方法二,跳到相应的设置页面用户自己去设置
            // startActivity(new Intent("android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS")); 
            //方法二,请求权限
            // requestPermissions(new String[]{"android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"}, REQUEST_CODE_ASK_PERMISSIONS);
        }
    }
}
//6.0 判断应用是否在省电白名单中
public boolean isIgnoringBatteryOptimizations(){     
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        PowerManager pm = (PowerManager) getActivity().getSystemService(Context.POWER_SERVICE);
        return pm.isIgnoringBatteryOptimizations(getActivity().getPackageName());
    }
    return false;
}

如有问题,欢迎指正,谢谢

你可能感兴趣的:(Android,基础详解)