这个问题与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
API19上的AlarmManager具有setExact()方法来设置确切的警报.
确切意味着 - >如果我将闹钟设置为下午2:01,它将在下午2:01触发
在API 23 - Marhsmwallow(6.0)上有一个新方法setExactAndAllowWhileIdle(),但是作为参考,它不是EXACT,因为它只会每15分钟触发一次和低功耗空闲模式.
确切!=每15分钟:-)
那么如何在6.0中使用AlarmManager 实现精确报警?
如果用户添加一个提醒或日历约会,并希望在事件发生前10分钟通知应该显示报警前EXACT10分钟事件.使用setExactAndAllowWhileIdle()这似乎是不可能的.
参考链接:http: //developer.android.com/reference/android/app/AlarmManager.html#setExactAndAllowWhileIdle(int,long,android.app.PendingIntent)
如文档中所述:
"An app holding the REQUEST_IGNORE_BATTERY_OPTIMIZATIONS permission can trigger a system dialog to let the user add the app to the whitelist directly, without going to settings. The app fires a ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS Intent to trigger the dialog."
Can someone tell me the proper way to fire this intent?
optimization android android-intent android-6.0-marshmallow android-doze
有人知道当设备处于打盹或应用处于待机状态时,持有部分唤醒锁定的白名单应用是否可以接收位置更新?
Android文档(http://developer.android.com/training/monitoring-device-state/doze-standby.html)仅声明CPU和网络延迟,并且未提及对位置更新的任何影响(即来自LocationManager) ).基于此,似乎位置更新不受Doze/Standby影响,因此如果应用程序持有部分唤醒锁定(以保持CPU运行),则应用程序应该能够接收位置更新.
我已经实现了这一点并对其进行了测试,发现应用程序似乎没有在Doze中接收位置更新,即使它具有部分唤醒锁定并且已列入白名单.有趣的是,当我将设备放在我的办公桌上,一夜之间运行带有唤醒锁定的应用程序时,早上电池几乎是空的,但是当重复使用不带唤醒锁定的应用程序时,电池在早上几乎已满.所以看起来该应用程序一直在运行,但没有收到位置更新.
一些额外的背景:该应用程序用于车队跟踪,所以我们试图找出一个应用程序是否有运行后台服务,可靠地接收位置更新时,使用电池供电.
谢谢!-Tom B.
android location android-6.0-marshmallow android-doze-and-standby
检查我的应用程序的M预览版设备上的行为,似乎它的前景(有活动通知)服务播放音乐不会影响打盹模式.但是阅读文档似乎只能从AppStandby中免除前台服务.
什么是真正的规则?
一切似乎都指向这两个命令:
adb shell dumpsys battery unplug
adb shell dumpsys deviceidle step
Run Code Online (Sandbox Code Playgroud)
我按照运行Marshmallow正式版的Nexus 6上的说明进行操作.我将手机插入我的测试机器.我设置了我的应用程序来测试我想用打瞌睡测试的作品.我关掉了我的屏幕.在battery unplug上面运行后我没有输出所以我认为它有效,但每次我运行deviceidle step输出总是Stepped to: ACTIVE.
我不确定它是否重要,但我正在尝试测试的应用程序的特殊功能是我设置的警报应该将手机从Doze中唤醒.我希望我的设备能够在我的PendingIntent计划AlarmManager.setAlarmClock中断时打瞌睡.这会阻止我的设备进入Doze吗?
android adb android-6.0-marshmallow android-doze-and-standby android-doze
Android 文档表明 Oreo 对后台执行有新的限制:https://developer.android.com/about/versions/oreo/background。这看起来很合理,他们的目标显然是让自己的平台更像 iOS,并防止应用程序在后台猖獗运行。
我不清楚(事实上,根本没有记录)是当 UI 转到后台时你可以在线程上做什么。具体来说,
鉴于我创建了一个线程
new Thread(() -> {
// Naughty thread doing something forever
}).start();
Run Code Online (Sandbox Code Playgroud)
我将应用程序发送到后台
那么...该线程会发生什么?
我创建了非常简单的代码来执行此操作,并且我的线程已经愉快地在 logcat 上运行了 10 多分钟,没有出现任何问题。
有谁有关于此类线程有哪些限制的明确信息?我本以为,由于 Android 限制了后台服务可以执行的操作,因此它也会限制此类线程可以执行的操作。
请注意,我们没有计划编写一个执行此类操作的应用程序。我们只是希望能够编写安全的代码,不会在较新版本的 Android 上引起问题。在 iOS 上,如果您进入后台,那么您将获得一段宽限期来完成您正在做的任何事情(并且您可以要求更多时间),但最终您的线程将被挂起。
TL; DR
Android 7.1.2的“ 2017年6月5日”安全更新是否导致Android开始忽略电池优化白名单(即让应用程序禁用“打ze”模式的功能)?
如果是这样,如果应用程序需要持续保持CPU和wifi的使用情况,那么现在该如何通过编程方式禁用“打ze”模式?
语境
我有一个Android应用程序,它支持将本地音频文件投射到联网的Chromecast接收器(使用嵌入式HTTP服务器将文件内容流式传输到接收器)。
为了在Android M上实现此功能(就在设备投射音频时没有使Chromecast会话掉落,否则处于空闲状态),我不得不在此答案中使用该方法来禁用打ze模式。
具体来说,AndroidManifest.xml我有:
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
Run Code Online (Sandbox Code Playgroud)
...,只要建立Chromecast会话,就会执行以下代码:
if (Build.VERSION.SDK_INT >= 23) {
String packageName = context.getPackageName();
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (! pm.isIgnoringBatteryOptimizations(packageName)) {
//reguest that Doze mode be disabled
Intent intent = new Intent();
intent.setAction(
Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
context.startActivity(intent);
}
}
Run Code Online (Sandbox Code Playgroud)
...并且在Chromecast播放处于活动状态时,我还以标准方式获取唤醒/ wifi锁定:
PowerManager powerManager = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "myapp-cast-server-cpu");
wakeLock.acquire();
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "myapp-cast-server-net");
wifiLock.acquire();
Run Code Online (Sandbox Code Playgroud)
该应用程序出现在电池白名单中,而就在几周前,这一切都运行良好。但是,该应用程序现在被打ze睡模式捕获。
测试设备没有改变;这是运行Android …
我在这里读到了很多关于打瞌睡模式的问题,例如Android 打瞌睡模式、Android N Doze 模式 - 如何保持后台下载和处理?、唤醒锁和打瞌睡模式等等。但在很多回复中,意见不一。我自己无法测试(模拟器不支持我的处理器,我唯一的测试设备是android 5.1)。我想知道接下来的情况。我有一个控制媒体播放器的活动。在 Android 6.0 及更高版本的设备上,由于打瞌睡模式,它无法按预期工作。正如许多解决方案所说,为了防止打瞌睡模式,它应该在前台的单独进程中启动一个服务,并从那里控制媒体播放器。问题是:如果我在单独的进程中启动带有部分唤醒锁的前台服务,除了显示通知之外什么也不做,并将控制权留给我的活动中的媒体播放器,它是否应该阻止打瞌睡模式?或者除了通过窗口管理器保持屏幕打开之外还有其他方法吗?
android ×9
android-doze ×3
java ×2
adb ×1
alarmmanager ×1
chromecast ×1
doze ×1
location ×1
media-player ×1
optimization ×1
preview ×1
wakelock ×1