如果设备处于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
我有一个应用程序,可以收听电话通知,并通过以下方式向Android Wear手表发送消息MessageApi.一些设备运行良好,除了Android 6的一些设备,特别是华为Mate 8(看起来像所有华为Android 6的这样做).
华为有自己的冻结应用程序后台处理(受保护的应用程序)的实现.从用户报告中我已经确认我的应用程序在华为的受保护应用程序和Android 6的打盹模式中都有例外.该应用程序工作正常,但在显示关闭15分钟后,我的应用程序停止向连接的Android Wear手表发送消息.我的应用程序还可以记录收到的通知历史记录,15分钟后没有任何内容...直到手机的显示屏打开并且我的应用程序打开.之后,在手机显示屏关闭时应该收到的所有通知都会进入我的NotificationListenerService实施并立即发送到手表.记录的历史也证实了这一点.
任何想法如何为这些手机解决这个问题,尤其是带有Doze模式的Android 6的华为Mate 8?
NotificationListenerService设备处于打盹模式和/或应用程序处于待机模式时的正确行为是什么?
编辑
用户还确认他们的手机未处于省电模式,这也会影响后台应用及其服务.这个bug看起来像华为独家,因为没有Nexus用户报告这个,我的OnePlus One和M也没有这样做.N预览也适用于Nexus设备.
编辑2
我添加了一个可选的前台服务(startForeground()),因此我的应用程序在通知中心有一个永久通知,因此我的应用程序应该从每个电池优化中排除.对于前台服务通知,我使用了优先级,NotificationCompat.PRIORITY_MIN并添加了Notification.FLAG_ONGOING_EVENT标志.这对华为手机有点帮助但不多,现在NotificationListenerService在打开我的应用程序后打开屏幕后,延迟通知就会到达我的右边.我不使用startForeground()in NotificationListenerService而是使用另一个Service因为我无法控制它的生命周期.
android android-notifications android-appstandby android-doze wear-os
Marshmallow API 与之前的安卓操作系统有很大不同。屏幕关闭时,设备处于休眠模式且无法同步网络。因此,为了使用网络进行后台操作,我们必须防止打瞌睡模式。
android android-6.0-marshmallow android-appstandby android-doze
当应用程序处于后台时,我需要发出网络呼叫。顺序如下。该应用程序接收GCM调用,向BE发出API调用,以获取更多数据,然后显示通知。完美收到了GCM调用,但是API网络调用由于超时失败而失败,并显示以下内容stack-trace:
java.net.SocketTimeoutException: timeout
at okio.Okio$3.newTimeoutException(Okio.java:207)
at okio.AsyncTimeout.exit(AsyncTimeout.java:250)
at okio.AsyncTimeout$2.read(AsyncTimeout.java:217)
at okio.RealBufferedSource.indexOf(RealBufferedSource.java:306)
at okio.RealBufferedSource.indexOf(RealBufferedSource.java:300)
at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:196)
at com.squareup.okhttp.internal.http.Http1xStream.readResponse(Http1xStream.java:186)
at com.squareup.okhttp.internal.http.Http1xStream.readResponseHeaders(Http1xStream.java:127)
at com.squareup.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:737)
at com.squareup.okhttp.internal.http.HttpEngine.access$200(HttpEngine.java:87)
at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:722)
at com.nuro.newcoms.NuroCommunicationService$21.intercept(NuroCommunicationService.java:1986)
at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:695)
at com.nuro.encryption.NuroSSLContext$1.intercept(NuroSSLContext.java:94)
at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:695)
at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:576)
at com.squareup.okhttp.Call.getResponse(Call.java:287)
at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:243)
at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:205)
at com.squareup.okhttp.Call.execute(Call.java:80)
at retrofit.client.OkClient.execute(OkClient.java:53)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:326)
at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278)
at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)`
Run Code Online (Sandbox Code Playgroud)
我正在使用okhttpver 2.7.5,retrofit 1.9.0
该应用程序处于后台,但设备未处于休眠状态,屏幕处于打开状态,甚至正在充电。因此,这不可能是DOZE问题。
发生在WiFi和3/4G。
pre-nougat 设备没有这个问题。
UPD 在电池设置中将应用程序选择为“未优化”时,所有功能都像超级按钮一样。
在应用程序小部件的上下文中,Google 对用户“积极使用”应用程序的定义是什么?如果一个应用程序很长一段时间没有打开,但主屏幕上有一个小部件,有人知道Android是否会将该应用程序置于待机模式吗?从文档来看,应用程序小部件似乎适合以下描述:“应用程序当前有一个位于前台的进程(作为活动或前台服务,或者由另一个活动或前台服务使用)。” 但我不太确定。
想法?
https://developer.android.com/preview/features/power-mgmt.html