标签: android-doze

Wifi Casting打盹模式

当通过Wifi投射到Chromecast时,我的用户抱怨在Android 6设备上失去连接.查看日志时,我看到了:

12-09 19:18:56.473 I/Router  ( 5337): Connectivity change detected...
12-09 19:18:56.473 I/Router  ( 5337): EXTRA_NO_CONNECTIVITY: true
12-09 19:18:56.473 I/Router  ( 5337): EXTRA_REASON: null
12-09 19:18:56.473 I/Router  ( 5337): EXTRA_IS_FAILOVER: false
12-09 19:18:56.473 I/Router  ( 5337): EXTRA_NETWORK_INFO: [type: WIFI[], state: DISCONNECTED/DISCONNECTED, reason: (unspecified), extra: <unknown ssid>, roaming: false, failover: false, isAvailable: true]
12-09 19:18:56.473 I/Router  ( 5337): EXTRA_OTHER_NETWORK_INFO: none
12-09 19:18:56.473 I/Router  ( 5337): EXTRA_EXTRA_INFO: <unknown ssid>
12-09 19:18:56.475 I/NetworkUtils( 5337): Could not find any connected network...
12-09 19:18:57.475 W/Router …
Run Code Online (Sandbox Code Playgroud)

android chromecast android-6.0-marshmallow android-doze

6
推荐指数
0
解决办法
673
查看次数

Nexus 5不会使用ADB进入打盹模式

我有一个Nexus 5,它不会使用Windows的ADB命令进入Doze/IDLE模式.它是使用USB线连接的adb,它适用于所有其他ADB命令.屏幕关闭.

C:\>adb shell dumpsys deviceidle force-idle
Unable to go idle; stopped at ACTIVE

C:\>adb shell dumpsys deviceidle enable

C:\>adb shell dumpsys battery unplug

C:\>adb shell dumpsys deviceidle step
Stepped to: ACTIVE

C:\>adb shell dumpsys deviceidle step
Stepped to: ACTIVE

C:\>adb shell dumpsys deviceidle step
Stepped to: ACTIVE

C:\>adb shell dumpsys deviceidle enable

C:\>adb shell dumpsys deviceidle force-idle
Unable to go idle; stopped at ACTIVE
Run Code Online (Sandbox Code Playgroud)

android android-6.0-marshmallow android-doze

6
推荐指数
2
解决办法
3041
查看次数

DOZE模式三星设备

我正在一个Android 6中测试一个应用程序,我需要通过DOZE,因为我想请求用户接受电池优化的重要性.

在项目 AntiDoze中,但是当我在虚拟设备中运行时我没有任何问题,但是当我传递给三星时,我得到:

FATAL EXCEPTION: main
         Process: com.commonsware.android.antidoze, PID: 21135
       java.lang.RuntimeException: Unable to start activity ComponentInfo{com.commonsware.android.antidoze/com.commonsware.android.antidoze.EventDemoActivity}: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS dat=package:com.commonsware.android.antidoze }
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253)
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
      at android.app.ActivityThread.access$1100(ActivityThread.java:221)
Run Code Online (Sandbox Code Playgroud)

知道如何传递这个问题吗?

链接中重要的代码是:

if (Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1) {
  String pkg=getPackageName();
  PowerManager pm=getSystemService(PowerManager.class);

  if (!pm.isIgnoringBatteryOptimizations(pkg)) {
    Intent i=
      new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
        .setData(Uri.parse("package:"+pkg));

    startActivity(i);
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的清单中

 <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
Run Code Online (Sandbox Code Playgroud)

android android-6.0-marshmallow android-doze

6
推荐指数
1
解决办法
1317
查看次数

如何在Android上测试打盹模式?

有一个旧的Android应用程序,它工作后台2服务(服务).

更新应用程序时可能会发送数据和记录,而工作不是新的DozeMode.在修改当前代码之前,我决定检查一切现在如何工作.要运行应用程序,在日志中我看到两个服务都在运行(读取设备位置的服务的基本含义,第二个服务将数据发送到服务器).使用命令关闭屏幕

adb shell dumpsys deviceidle step
Run Code Online (Sandbox Code Playgroud)

将系统转换为DozeMode:

Nikita:app NG$ adb shell dumpsys deviceidle step
Stepped to: ACTIVE
Nikita:app NG$ adb shell dumpsys deviceidle step
Stepped to: IDLE_PENDING
Nikita:app NG$ adb shell dumpsys deviceidle step
Stepped to: SENSING
Nikita:app NG$ adb shell dumpsys deviceidle step
Stepped to: LOCATING
Nikita:app NG$ adb shell dumpsys deviceidle step
Stepped to: IDLE
Run Code Online (Sandbox Code Playgroud)

如果我理解正确的一切 - IDLE只是相同的模式,根据文档,所有服务,jobsheduler,报警管理器和其他背景组件应该被关闭.但这不会发生.根据日志判断,应用程序按预期工作,DozeMode要么我做错了.

告诉我,也许有任何最佳实践用于测试DozeMode和(后期)将服务重写为更现代的,如果在后台有任何行动(即当你关闭应用程序时).

Android 6,BlackView BV6000S,应用程序在允许非最佳电池寿命的列表中丢失(白名单)

UPD:Nikita:app NG$ adb shell dumpsys deviceidle force-idle 现在被迫进入空闲模式app工作

android adb android-service android-doze

6
推荐指数
1
解决办法
5937
查看次数

调度重复事件——Handler.PostDelayed 和 Doze

语境

我正在开发适用于 Android 的屏幕过滤器应用程序(如 f.lux)。我目前正在使用该功能在太阳落山时逐渐淡入过滤器。屏幕关闭时状态无关紧要,但是当屏幕打开时,淡入淡出进度正确(或立即更新)很重要。

技术要求

  • 我想以半规则的时间间隔触发一系列意图。
  • 当屏幕关闭时,它们可以被忽略/丢弃,除了:
    • 当屏幕打开时,必须立即触发最近的意图。
  • 我不想不必要地耗尽电池。

明显的解决方案以及为什么它们不起作用

您的警报的第一次触发不会在请求的时间之前,但在该时间之后几乎整个间隔内都不会发生。

我认为这意味着第一触发器将必然在第一时间间隔内发生,这意味着该装置将被唤醒,造成不必要的电池消耗。

  • 我可以AlarmManager.set用来安排第一个闹钟。当它熄灭时,我可以更新屏幕,然后安排下一个闹钟。这会起作用,但会在每次闹钟时唤醒旧设备(没有打瞌睡),而不是等到屏幕打开。它还使用 AlarmManger 作为计时器,文档明确建议反对:

对于计时操作(滴答、超时等),使用 Handler 更容易也更高效。

可以,然后呢,

  • 我可以设置一个警报来启动一个Handler,它会定期更新 UI。但是等等:这依赖于postDelayed,它说(强调我的):

在深度睡眠中花费的时间会增加执行的额外延迟。

我认为这意味着,当设备从睡眠中唤醒时,下一次更新可能不会在整个间隔内发生。我读对了吗?强迫用户在下一次更新之前等待一两分钟是一个交易破坏者。

CountDownTimerValueAnimator在他们的实现中都使用了这个方法,所以如果我对 Handler 的解释是正确的,那么他们都出局了。

我可以使用基于处理程序的方法,并在屏幕关闭时接收事件,此时我会取消现有动画,然后开始一个新动画。这看起来是最好的解决方案,但似乎应该有一种更简单的方法来做到这一点。

结论

关于这个主题还有很多其他的 SO 问题。每个人和他们的母亲都建议使用 Handler,但是除了上面的引用之外,绝对没有关于设备进入睡眠状态时它的行为方式的信息。(显然)没有其他人遇到过这个问题真的很奇怪——我是在做一些非常不寻常的事情,还是遗漏了一些基本的东西?

任何人都可以提供有关Handler.postDelayed设备进入睡眠状态时的真实行为的见解,并建议我在这种特定情况下应该做什么吗?

android timer handler alarmmanager android-doze

5
推荐指数
0
解决办法
939
查看次数

Android VoIP 应用程序:PARTIAL_WAKE_LOCK 与忽略电池优化(打盹白名单)

我正在使用 SIP 协议开发 IP 语音 (VoIP) 应用程序,该协议要求应用程序监听来电。这意味着应用程序不得休眠或死亡。

对于旧代码,似乎这样做的方法是获取PARTIAL_WAKE_LOCK

现在从 Android 6.0 及更高版本开始,有新的Doze。建议,如果您不希望您的应用进入待机状态,您应该通过请求REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限将其“列入白名单” 。根据文档,这是专门针对 VoIP 应用程序的。

这两个不同的东西似乎是相关的。我不确定它们是如何相关的,它们是否相互干扰,我是否应该使用一个或另一个或两者,以及是否还有其他考虑。请解释。

另外,我不允许在这个项目上使用推送通知。如果您有其他节省电池的建议,请告诉我。

sip android-wake-lock wakelock android-doze portsip

5
推荐指数
1
解决办法
792
查看次数

如何区分设备进入 Doze 维护时段和退出 Doze 维护时段

我有一个定期运行以保持网络连接活动的方法。在打瞌睡模式期间,我想禁止它定期运行,并在维护窗口期间只运行一次。当设备退出打瞌睡状态时,我希望再次定期调用该方法。我怎样才能做到这一点?

我已经注册了一个接收器,用于监听PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED广播然后调用PowerManager.isDeviceIdleMode()。但是,这两种情况都会返回 false - 在维护时段期间和设备退出 Doze 模式时。我如何区分它们?

android android-6.0-marshmallow android-doze

5
推荐指数
1
解决办法
943
查看次数

即使在打瞌睡模式下,每 15 秒获取一次位置

我想每 15 秒获取一次位置,一切都很好,但在打瞌睡模式(深度睡眠)下,我的处理程序不起作用,是吗?AlarmManager 是个好方法,但时间限制为 1 分钟,在打瞌睡模式下不会重复。

@ReactMethod
public static void setAlarm()
{
  int interval = 50; // delay in secs
  AlarmManager am = (AlarmManager) reactContext.getSystemService(Context.ALARM_SERVICE);
  Intent intent = new Intent(reactContext, AlarmManagerReceiver.class);
  PendingIntent pi = PendingIntent.getBroadcast(reactContext, 0, intent, 0);
  am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval*1000 , pi);

}
Run Code Online (Sandbox Code Playgroud)

接收者 :

public class AlarmManagerReceiver extends BroadcastReceiver {

      @Override
      public void onReceive(Context context, Intent intent) {

          DoRoutine();

      }

}
Run Code Online (Sandbox Code Playgroud)

android handler alarmmanager android-doze

5
推荐指数
1
解决办法
844
查看次数

在设备设置中打开特定应用程序的电池优化活动

我正在使用 WorkManager 库来安排后台任务,并为了防止应用程序休眠,从应用程序中打开电池优化部分,以便用户手动禁用我的应用程序的优化。问题是,即使选择了“不优化”选项,应用程序仍然处于休眠状态并且工作尚未完成。此外,当通过设备设置中的应用程序信息页面打开电池设置时,它会显示“已优化”,即使它在上一个活动中已更改为“不优化”。

此外,通过代码打开的电池优化页面包含包括系统应用程序在内的所有应用程序的列表,而通过应用程序信息打开的电池优化页面仅包含已安装应用程序的列表。

有没有办法通过代码进入第二个电池优化页面。因为如果禁用优化,应用程序就可以正常工作。

Intent intent = new Intent();
intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
startActivity(intent);
finish();
Run Code Online (Sandbox Code Playgroud)

android android-doze-and-standby android-doze android-workmanager

5
推荐指数
0
解决办法
1958
查看次数

在 Deep Doze 模式测试中未收到 FCM 高优先级消息

我开始使用以下命令在深度打瞌睡模式下测试应用程序:

$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle force-idle
$ adb shell dumpsys deviceidle get deep
Run Code Online (Sandbox Code Playgroud)

检查设备是否处于 IDLE 状态的最后一个命令。

当高优先级推送发送到设备时,应用程序会显示全屏意图通知以显示呼叫屏幕。

最初收到推送并显示屏幕,但在 3-5 次推送后未收到。另外,当我看到日志时,它显示推送已以高优先级收到,但已降级为正常:

Priority: 2 
Original Priority: 1 
Run Code Online (Sandbox Code Playgroud)

onMessageReceived(remoteMessage: RemoteMessage)方法中使用:

remoteMessage.priority
remoteMessage.originalPriority
Run Code Online (Sandbox Code Playgroud)

这些是呼叫邀请高优先级推送,因此 ttl 为 0。

请帮助我了解以下信息:

  1. adb命令$ adb shell dumpsys deviceidle force-idle不利于测试导致测试结果错误吗?
  2. 像我们的例子中那样,全屏意图是否无法防止桶填充降低优先级?
  3. 有没有办法处理它,以便应用程序即使在打瞌睡模式下每次都能收到高优先级推送。

android push-notification firebase-cloud-messaging android-doze

5
推荐指数
0
解决办法
884
查看次数