如何在Marshmallow设备上通过编程关闭特定应用程序的Doze模式

9

Marshmallow API与之前的Android操作系统非常不同。当屏幕关闭时,设备处于待机模式,无法同步网络。因此,为了进行带有网络的后台操作,我们必须防止进入待机模式。


3
除非使用定制ROM或在已获取Root权限的设备上可能实现,否则您所要求的是不可能的。用户可以直接从设置应用程序中管理电池优化白名单。 - CommonsWare
请列举任何不需要 root 权限的应用程序名称。 - CommonsWare
1
应用程序的名称为“Doze”。它似乎会维护一个白名单,列出不影响的应用程序。 - CommonsWare
1
您无法通过编程将应用程序添加到白名单中。您可以要求用户将您的应用程序添加到白名单中,但这样做可能会导致您被Play商店禁止(如果您计划在那里分发您的应用程序)。 - CommonsWare
1
我认为这个问题可能是有用的。我正在开发的应用是商业用途,不会分发到Google Play……现在客户抱怨屏幕关闭时没有网络活动…… - Yeung
显示剩余4条评论
1个回答

12

将以下权限添加到manifest.xml中

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

调用以下方法

public void turnOffDozeMode(Context context){  //you can use with or without passing context
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Intent intent = new Intent();
            String packageName = context.getPackageName();
            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            if (pm.isIgnoringBatteryOptimizations(packageName)) // if you want to desable doze mode for this package
                intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
            else { // if you want to enable doze mode
                intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                intent.setData(Uri.parse("package:" + packageName));
            }
            context.startActivity(intent);
        }
    }

或者您也可以使用以下场景...

可以通过以下方式以编程方式进行Android应用程序的白名单设置:

boolean isIgnoringBatteryOptimizations = pm.isIgnoringBatteryOptimizations(getPackageName());
if(!isIgnoringBatteryOptimizations){
    Intent intent = new Intent();
    intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
    intent.setData(Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, MY_IGNORE_OPTIMIZATION_REQUEST);
}

可以通过以下代码验证上述活动的结果:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == MY_IGNORE_OPTIMIZATION_REQUEST) {
        PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
        boolean isIgnoringBatteryOptimizations = pm.isIgnoringBatteryOptimizations(getPackageName());
        if(isIgnoringBatteryOptimizations){
            // Ignoring battery optimization
        }else{
           // Not ignoring battery optimization
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,