Fra*_*s Q 51 java android preview android-6.0-marshmallow
这个问题与Android 6.0 Preview 3有关,它将在本月底发布.
我在Nexus 5'hackhead'的谷歌预览版3中测试Android 6.0中的一些东西.
新功能是"打盹模式" - 类似于深度睡眠模式,当网络被禁用和手机休眠时,只有SMS,呼叫或高优先级GCM消息才能将其唤醒.但是像WhatsApp一样 - 在打盹模式下,它在2小时或更长时间后接收消息取决于计时器.但是有一个名为"白名单"的"未优化"应用列表,您可以手动添加应用.
好的,我想找到一种方法来以编程方式添加我的应用程序而无需用户交互到电池设置中设备中存在的"白名单应用列表".
试着用反射进入它我发现:
在android.os.IDeviceIdleController中有一个方法:
public abstract void addPowerSaveWhitelistApp(String packageNameOfApp)
但这是一个接口......所以我们不能创建一个接口实例.
目前还没有关于此接口或方法或任何继承树的文档.
也许你有一些想法我应该在哪里寻找以编程方式添加我的应用程序的可能性?
还有一种方法
public abstract boolean isPowerSaveWhitelistApp(String packageName)
我认为应该可以以某种方式访问?!检查应用程序是否存在于白名单中,也许最后希望ASK用户将其添加到白名单.
所以我的问题是,有没有人试图用更好的结果做出一些事情?因为我被困住了,我认为这是一个死胡同.
欲了解更多信息:https://newcircle.com/s/post/1739/2015/06/12/diving-into-android-m-doze
jef*_*cky 40
添加权限
<uses-permission
android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
Run Code Online (Sandbox Code Playgroud)
请求将您的应用列入白名单
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Intent intent = new Intent();
String packageName = getPackageName();
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
if (!pm.isIgnoringBatteryOptimizations(packageName)) {
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
startActivity(intent);
}
}
Run Code Online (Sandbox Code Playgroud)
M66*_*66B 36
如果没有Android M预览3上的用户交互,则无法禁用电池优化(=打盹模式的白名单应用程序).
它可以通过这种方式与用户交互完成:
Intent intent = new Intent();
String packageName = context.getPackageName();
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (pm.isIgnoringBatteryOptimizations(packageName))
intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
else {
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
}
context.startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
and*_*per 19
我认为这个助手班应该涵盖你所有的需求.
要使用它来请求操作系统将您的应用程序列入白名单,您可以使用prepareIntentForWhiteListingOfBatteryOptimization.如果你得到null,这意味着你不需要它,或者你不能使用它.您可以使用其他功能查询更好的状态.
public class PowerSaverHelper {
public enum PowerSaveState {
ON, OFF, ERROR_GETTING_STATE, IRRELEVANT_OLD_ANDROID_API
}
public enum WhiteListedInBatteryOptimizations {
WHITE_LISTED, NOT_WHITE_LISTED, ERROR_GETTING_STATE, UNKNOWN_TOO_OLD_ANDROID_API_FOR_CHECKING, IRRELEVANT_OLD_ANDROID_API
}
public enum DozeState {
NORMAL_INTERACTIVE, DOZE_TURNED_ON_IDLE, NORMAL_NON_INTERACTIVE, ERROR_GETTING_STATE, IRRELEVANT_OLD_ANDROID_API, UNKNOWN_TOO_OLD_ANDROID_API_FOR_CHECKING
}
@NonNull
public static DozeState getDozeState(@NonNull Context context) {
if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP)
return DozeState.IRRELEVANT_OLD_ANDROID_API;
if (VERSION.SDK_INT < VERSION_CODES.M) {
return DozeState.UNKNOWN_TOO_OLD_ANDROID_API_FOR_CHECKING;
}
final PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (pm == null)
return DozeState.ERROR_GETTING_STATE;
return pm.isDeviceIdleMode() ? DozeState.DOZE_TURNED_ON_IDLE : pm.isInteractive() ? DozeState.NORMAL_INTERACTIVE : DozeState.NORMAL_NON_INTERACTIVE;
}
@NonNull
public static PowerSaveState getPowerSaveState(@NonNull Context context) {
if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP)
return PowerSaveState.IRRELEVANT_OLD_ANDROID_API;
final PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (pm == null)
return PowerSaveState.ERROR_GETTING_STATE;
return pm.isPowerSaveMode() ? PowerSaveState.ON : PowerSaveState.OFF;
}
@NonNull
public static WhiteListedInBatteryOptimizations getIfAppIsWhiteListedFromBatteryOptimizations(@NonNull Context context, @NonNull String packageName) {
if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP)
return WhiteListedInBatteryOptimizations.IRRELEVANT_OLD_ANDROID_API;
if (VERSION.SDK_INT < VERSION_CODES.M)
return WhiteListedInBatteryOptimizations.UNKNOWN_TOO_OLD_ANDROID_API_FOR_CHECKING;
final PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (pm == null)
return WhiteListedInBatteryOptimizations.ERROR_GETTING_STATE;
return pm.isIgnoringBatteryOptimizations(packageName) ? WhiteListedInBatteryOptimizations.WHITE_LISTED : WhiteListedInBatteryOptimizations.NOT_WHITE_LISTED;
}
@TargetApi(VERSION_CODES.M)
@RequiresPermission(permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
@Nullable
public static Intent prepareIntentForWhiteListingOfBatteryOptimization(@NonNull Context context, @NonNull String packageName, boolean alsoWhenWhiteListed) {
if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP)
return null;
if (ContextCompat.checkSelfPermission(context, permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) == PackageManager.PERMISSION_DENIED)
return null;
final WhiteListedInBatteryOptimizations appIsWhiteListedFromPowerSave = getIfAppIsWhiteListedFromBatteryOptimizations(context, packageName);
Intent intent = null;
switch (appIsWhiteListedFromPowerSave) {
case WHITE_LISTED:
if (alsoWhenWhiteListed)
intent = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
break;
case NOT_WHITE_LISTED:
intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).setData(Uri.parse("package:" + packageName));
break;
case ERROR_GETTING_STATE:
case UNKNOWN_TOO_OLD_ANDROID_API_FOR_CHECKING:
case IRRELEVANT_OLD_ANDROID_API:
default:
break;
}
return intent;
}
/**
* registers a receiver to listen to power-save events. returns true iff succeeded to register the broadcastReceiver.
*/
@TargetApi(VERSION_CODES.M)
public static boolean registerPowerSaveReceiver(@NonNull Context context, @NonNull BroadcastReceiver receiver) {
if (VERSION.SDK_INT < VERSION_CODES.M)
return false;
IntentFilter filter = new IntentFilter();
filter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED);
context.registerReceiver(receiver, filter);
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
白名单可以通过编程方式完成。要在列入白名单的应用程序中添加设备,请从应用程序中运行以下命令:
adb shell dumpsys deviceidle whitelist +<package_name>
Run Code Online (Sandbox Code Playgroud)
要从列入白名单的应用程序中删除设备,请从应用程序中运行以下命令:
adb shell dumpsys deviceidle whitelist -<package_name>
Run Code Online (Sandbox Code Playgroud)
据我所知,你不能将自己列入Doze白名单.忽略电池优化不会禁用打盹.请参阅此处:https://code.google.com/p/android-developer-preview/issues/detail? id = 2225更新:在M的发布版本中,您可以请求忽略电池优化,这至少会让您正常在打盹模式下访问互联网.
当设备再次静止,屏幕关闭并使用电池运行一段时间时,Doze 会对PowerManager.WakeLock、AlarmManager 警报和 GPS/Wi-Fi 扫描应用完整的 CPU 和网络限制。
有关更多详细信息,请访问白名单用例。
下表重点介绍了请求电池优化例外白名单或列入电池优化例外白名单的可接受用例。一般来说,您的应用程序不应列入白名单,除非打瞌睡或应用程序待机破坏了应用程序的核心功能,或者存在技术原因导致您的应用程序无法使用 GCM 高优先级消息。
Doze 特别有可能影响 AlarmManager警报和计时器管理的活动,因为当系统处于 Doze 状态时,Android 5.1(API 级别 22)或更低版本中的警报不会触发。
Android 6.0(API 级别 23)引入了两个新的 AlarmManager 方法:setAndAllowWhileIdle()和setExactAndAllowWhileIdle()。通过这些方法,您可以设置即使设备处于打瞌睡状态也会触发的警报。
注意:每个应用程序每 15 分钟触发一次警报的次数setAndAllowWhileIdle()不得setExactAndAllowWhileIdle()超过一次。