我编写了一个应用程序,它连接到蓝牙设备,用于前景中的汽车(在后台)和导航(或其他东西)。
但是在android 7+(也许还有6个)上,应用程序会在一段时间后进入睡眠状态。当我试图从相机拍照时,“睡眠模式”立即进入,我的应用程序现在正在睡觉(没有蓝牙连接,没有通知) - 只是死了应用程序。
我必须去最近的应用 - >点击我的应用程序,这使“醒来”。蓝牙现在再次连接到设备。
但我仍然无法检查应用程序是否正在睡眠。那么,如何在后台保持应用程序清醒呢?
我读了一些关于WakeLock的内容,但看起来它不起作用,导致app仍在睡觉。也许我错了。
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wk = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "MyWakeLock");
wk.acquire();
和onDestroy
wk.release();
由于
答案 0 :(得分:3)
从Android API 23开始,Google推出了Doze mode
和App Standby
以节省电池电量。当设备进入休眠模式或应用程序进入App Standby
时,应用程序完成的所有任务都将延期。我们遇到了一个因为同样没有触发警报的问题。如果您阅读文档,您会发现使用唤醒锁也无济于事。
打盹限制以下限制适用于您的应用 在打瞌睡:
暂停网络访问。
系统忽略唤醒锁定。
标准的AlarmManager警报(包括setExact()和setWindow())是 推迟到下一个维护窗口。如果需要设置警报 在Doze中发生火灾时,请使用setAndAllowWhileIdle()或 setExactAndAllowWhileIdle()。使用setAlarmClock()设置的警报继续 正常启动 - 系统在警报发生前不久退出Doze 火。
系统不执行Wi-Fi扫描。
系统不允许同步适配器运行。系统不允许JobScheduler运行
因此,如果您想绕过所有这些,您的应用必须在前台拥有一个流程。再次来自同一个文档 -
该应用程序目前处于前台(作为一个进程) 活动或前台服务,或由其他活动使用或 前台服务)。
在您的情况下运行服务并将其优先级设置为前台。
答案 1 :(得分:1)
要使wakelock工作,你应该在开头将这一行添加到你的androidmanifest文件中。但正如Ajay所说,你应该使用一项服务,以便服务在后台工作并完成工作,但如果你想保持屏幕上的其他东西,我认为这不是这里的情况。
<uses-permission android:name="android.permission.WAKE_LOCK" />
答案 2 :(得分:0)
为什么不使用服务? WakeLock基本上保持屏幕不是一种有效的机制
https://developer.android.com/training/scheduling/wakelock.html
答案 3 :(得分:0)
布局类型下的xml布局文件:
机器人:keepScreenOn = “真” &GT;