如文档中所述:
"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
注意:事实证明,原始问题在其假设中是不正确的.在底部查看有关其编辑的更多详细信息.
它现在关于电池节电器,而不是电池节电和打盹模式.它也不是关于Service&BroadcastReceiver,而是仅仅是BroadcastReceiver.
从Android Lollipop开始,Google推出了新的,手动和自动的方式来帮助节省电池:
"打盹"模式和"电池节电器".
在某些情况下,由于这些技术,应用程序可能无法访问Internet.
我在一个应用程序上工作,该应用程序需要使用在特定情况下触发的后台服务来访问Internet,如果收到重要内容,则会显示一些UI.
作为用户,我注意到在某些情况下,它无法访问Internet.
检查应用程序是否可以访问Internet是这样的:
public static boolean isInternetOn(Context context) {
final NetworkInfo info = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
return !(info == null || !info.isConnectedOrConnecting());
}
Run Code Online (Sandbox Code Playgroud)
问题是我需要检查为什么这有时会返回false,所以如果它失败了,我们应该告诉用户(可能通过通知)无法访问数据,因为设备限制了应用程序,并提供给用户从电池优化中列出应用程序.
我不确定哪些影响这个:打盹,节电或两者兼而有之,如果总是这样,对于所有设备,在所有情况下.
我找到的是如何查询打盹模式和省电模式(省电模式):
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, IRRELEVANT_OLD_ANDROID_API
}
public enum DozeState {
NORMAL_INTERACTIVE, DOZE_TURNED_ON_IDLE, NORMAL_NON_INTERACTIVE, ERROR_GETTING_STATE, IRRELEVANT_OLD_ANDROID_API
}
@NonNull
public static DozeState getDozeState(@NonNull Context context) {
if (VERSION.SDK_INT < VERSION_CODES.M)
return DozeState.IRRELEVANT_OLD_ANDROID_API; …
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个允许用户记录路线(位置/ GPS)的应用程序.为了确保即使屏幕关闭也会记录位置,我已经foreground service
为位置记录创建了一个.我将位置存储在一个Room Database
注入我的服务中的位置Dagger2
.
但是,这项服务被Android杀死,当然这并不好.我可以订阅低内存警告,但这并没有解决我的服务在运行Android 8.0的现代高端手机上大约30分钟后被杀的根本问题
我创建了一个只有"Hello world"活动和服务的最小项目:https://github.com/RandomStuffAndCode/AndroidForegroundService
该服务在我的Application
课程中启动,路由记录通过以下方式启动Binder
:
// Application
@Override
public void onCreate() {
super.onCreate();
mComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.build();
Intent startBackgroundIntent = new Intent();
startBackgroundIntent.setClass(this, LocationService.class);
startService(startBackgroundIntent);
}
// Binding activity
bindService(new Intent(this, LocationService.class), mConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT);
// mConnection starts the route logging through `Binder` once connected. The binder calls startForeground()
Run Code Online (Sandbox Code Playgroud)
我可能不需要BIND_AUTO_CREATE
旗帜,我一直在测试不同的旗帜,试图不让我的服务被杀 - 到目前为止没有运气.
使用分析器看起来我没有任何内存泄漏,内存使用率稳定在~35mb:
使用adb shell dumpsys activity …
android android-service android-location android-lifecycle android-doze
我按照这里描述的步骤:
https://developer.android.com/preview/testing/guide.html#doze-standby
情况:
Android Debug Bridge版本1.0.32
Nexus 9预览M
贝壳:
$ adb shell dumpsys battery unplug
Run Code Online (Sandbox Code Playgroud)
=>工作,设备拔掉
$ adb shell dumpsys deviceidle step
Run Code Online (Sandbox Code Playgroud)
=>输出:步进到:ACTIVE
$ adb shell dumpsys deviceidle -h
Run Code Online (Sandbox Code Playgroud)
=>不起作用=>输出:
Device idle controller (deviceidle) dump options:
[-h] [CMD]
-h: print this help text.
Commands:
step
disable
enable
whitelist
Run Code Online (Sandbox Code Playgroud)
我尝试过:
adb shell dumpsys deviceidle enable
Run Code Online (Sandbox Code Playgroud)
但它没有用.
所以我的问题,如上所述,如何在打盹模式下移动设备?我犯了什么错?
编辑 - 2016年6月:
新链接:https: //developer.android.com/training/monitoring-device-state/doze-standby.html
这是一个简单的问题,看到G +(这里)有关于此的大量帖子,以及官方文档(这里)缺乏信息:
当设备进入"打盹"模式时,应用程序的服务会发生什么变化?
它对后台/前台服务(绑定/未绑定,已启动/未启动)有什么作用,有/无部分/完整唤醒锁?
例如,为了创建在设备屏幕关闭时播放音频流的服务,您会做什么?如果音频流不是来自本地文件,而是来自网络,该怎么办?
看到Google开发者声称:
已经运行前台服务的应用程序(带有相关通知)不受打盹的限制.
- 之后进行了大量的讨论,声称这并不完全正确,我认为知道特殊的后台操作应用程序应该做什么是相当令人困惑的.
android android-service android-doze-and-standby android-doze
我有一个带有WiFi锁的Android前台服务,它充当另一个本地设备的Web服务.在打盹模式之前,获取WiFi锁并根据需要提供服务非常有效.
即使关闭了我的应用程序的电池优化功能,当屏幕关闭几分钟时,手机仍然会杀死应用程序.
如何正确警告Android明确地在前台执行客户请求的服务,并且他们此时不希望他们的手机进入睡眠状态?
编辑:这个问题仍然存在于Android 8.0(奥利奥)
我试图使用Alarm Manager每隔30分钟在我的应用程序中发出警报,setExactAndAllowWhileIdle
但它无法正常工作!
每当收到报警信号时,我都会通过发出推送通知来测试功能.
问题是:当设备闲置一段时间后进入打盹模式时,我不再收到警报.但是,只要我打开屏幕,我就会收到通知.我的应用程序需要准确的警报,需要每30分钟准确按时交付!由于设备处于打盹模式,它无法接收延迟警报或丢失警报!
我在我的代码中使用了以下内容:
onReceive()
方法中,我设置下一个警报.我也是,启动一个只发出推送通知的startWakefulService,然后自行停止.笔记:
android.permission.WAKE_LOCK
setAlarmClock()
它甚至在打盹模式下一直工作,每50个警报一个丢弃/延迟警报.所以,它也不完美.而且我不希望用户一直看到警报图标.PS: 在回答之前,请确保您了解从Android 6.0 M和Doze模式开始施加的限制.
Link1:https://developer.android.com/training/monitoring-device-state/doze-standby.html
总之它说:
现在,为什么我不能每30分钟使用setExactAndAllowWhileIdle()
?获得准确的报警信号?而且,为什么不是setAlarmClock()
100%可靠?!
android android-intent android-alarms android-doze android-7.0-nougat
如果设备处于DOZE IDLE或IDLE_MAINTENANCE模式,如果我们为" android.os.action.DEVICE_IDLE_MODE_CHANGED " 注册广播接收器,则可以接收这些事件.但是当使用adb命令使App进入App Standby时,此接收器无法正常工作.对于在Marshmallow及以上版本上运行的设备,我们是否有可能以编程方式检查应用程序是否已进入或退出App Standby模式?
用于使App进入App Standby的adb命令
adb shell dumpsys battery unplug
adb shell am set-inactive {Package name} true
Run Code Online (Sandbox Code Playgroud)
并退出
adb shell am set-inactive {Package name} false
Run Code Online (Sandbox Code Playgroud) android android-6.0-marshmallow android-appstandby android-doze-and-standby android-doze
我正在通过 adb 让我的 Android 设备进入睡眠状态:
adb shell dumpsys battery unplug
adb shell dumpsys deviceidle step <-- repeat until state is IDLE
Run Code Online (Sandbox Code Playgroud)
然后我发送以下 JSON:
{
"to":"dYA7tVZrfag:APA91bFVqddVcJHnr_7ZhgNC5iu4Y6XKcLbSVD4DlZgfjMKwKvZhJHiKR4DIzpMrX8zUL15C_adfyEcrlI9q6zOFqFs_zwNPTVIDm-v20ZK0qgagKYGaQE1OPBqdH4P_JHYIXOIS3gfn",
"priority": "high",
"data":{
"test0":"test0",
"test1":"test1"
}
}
Run Code Online (Sandbox Code Playgroud)
结果:什么都没有……直到我唤醒设备,然后我才能将所有消息排队。我正在通过将日志放入方法来监视消息是否到来onMessageReceived()
。
我搜索了一下,有人说使用旧版本的 Android Studio 或升级 FCM SDK 的版本 (9.4.0) 可以解决问题。我都做了,但都没有成功。
编辑:这个问题似乎只发生在三星 Galaxy S5 上
android push-notification firebase-cloud-messaging android-doze
我需要每隔X小时设置一次重复警报,甚至会在打盹模式下触发.但是,AlarmManager for Android 23中唯一可用的Apis是setExactAndAllowWhileIdle和setAndAllowWhileIdle,它们不用于重复警报.
我想知道每次发射时我是否应该重新安排闹铃?或者有更好的解决方案吗?
android android-alarms android-6.0-marshmallow android-doze-and-standby android-doze