当通过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) 我有一个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 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应用程序,它工作后台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 的屏幕过滤器应用程序(如 f.lux)。我目前正在使用该功能在太阳落山时逐渐淡入过滤器。屏幕关闭时状态无关紧要,但是当屏幕打开时,淡入淡出进度正确(或立即更新)很重要。
AlarmManager.setInexactRepeating,这被认为是最节能的警报,除了:您的警报的第一次触发不会在请求的时间之前,但在该时间之后几乎整个间隔内都不会发生。
我认为这意味着第一触发器将必然在第一时间间隔内发生,这意味着该装置将被唤醒,造成不必要的电池消耗。
AlarmManager.set用来安排第一个闹钟。当它熄灭时,我可以更新屏幕,然后安排下一个闹钟。这会起作用,但会在每次闹钟时唤醒旧设备(没有打瞌睡),而不是等到屏幕打开。它还使用 AlarmManger 作为计时器,文档明确建议反对:对于计时操作(滴答、超时等),使用 Handler 更容易也更高效。
可以,然后呢,
Handler,它会定期更新 UI。但是等等:这依赖于postDelayed,它说(强调我的):在深度睡眠中花费的时间会增加执行的额外延迟。
我认为这意味着,当设备从睡眠中唤醒时,下一次更新可能不会在整个间隔内发生。我读对了吗?强迫用户在下一次更新之前等待一两分钟是一个交易破坏者。
CountDownTimer和ValueAnimator在他们的实现中都使用了这个方法,所以如果我对 Handler 的解释是正确的,那么他们都出局了。
我可以使用基于处理程序的方法,并在屏幕关闭时接收事件,此时我会取消现有动画,然后开始一个新动画。这看起来是最好的解决方案,但似乎应该有一种更简单的方法来做到这一点。
关于这个主题还有很多其他的 SO 问题。每个人和他们的母亲都建议使用 Handler,但是除了上面的引用之外,绝对没有关于设备进入睡眠状态时它的行为方式的信息。(显然)没有其他人遇到过这个问题真的很奇怪——我是在做一些非常不寻常的事情,还是遗漏了一些基本的东西?
任何人都可以提供有关Handler.postDelayed设备进入睡眠状态时的真实行为的见解,并建议我在这种特定情况下应该做什么吗?
我正在使用 SIP 协议开发 IP 语音 (VoIP) 应用程序,该协议要求应用程序监听来电。这意味着应用程序不得休眠或死亡。
对于旧代码,似乎这样做的方法是获取PARTIAL_WAKE_LOCK。
现在从 Android 6.0 及更高版本开始,有新的Doze。建议,如果您不希望您的应用进入待机状态,您应该通过请求REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限将其“列入白名单” 。根据文档,这是专门针对 VoIP 应用程序的。
这两个不同的东西似乎是相关的。我不确定它们是如何相关的,它们是否相互干扰,我是否应该使用一个或另一个或两者,以及是否还有其他考虑。请解释。
另外,我不允许在这个项目上使用推送通知。如果您有其他节省电池的建议,请告诉我。
我有一个定期运行以保持网络连接活动的方法。在打瞌睡模式期间,我想禁止它定期运行,并在维护窗口期间只运行一次。当设备退出打瞌睡状态时,我希望再次定期调用该方法。我怎样才能做到这一点?
我已经注册了一个接收器,用于监听PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED广播然后调用PowerManager.isDeviceIdleMode()。但是,这两种情况都会返回 false - 在维护时段期间和设备退出 Doze 模式时。我如何区分它们?
我想每 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) 我正在使用 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
我开始使用以下命令在深度打瞌睡模式下测试应用程序:
$ 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。
请帮助我了解以下信息:
$ adb shell dumpsys deviceidle force-idle不利于测试导致测试结果错误吗?android push-notification firebase-cloud-messaging android-doze
android-doze ×10
android ×9
alarmmanager ×2
handler ×2
adb ×1
chromecast ×1
portsip ×1
sip ×1
timer ×1
wakelock ×1