我在Android小部件中有一个位置监听器,在类MLocation中声明为
private static MyLocationListener locationListener;
小部件启动一个服务,该服务又创建MLocation类。 MLocation类在创建时创建并注册位置侦听器。
一切正常,直到手机睡觉。当手机休眠(睡眠后一段时间)时,Android会终止服务及其创建的所有类(MLocation)。在手机解锁时,Android会重新创建服务,从而创建MLocation类等。在手机休眠期间,该位置不再侦听更改(因为它被杀死)。有没有办法让位置监听器保持活动状态,即使手机正在睡觉?
答案 0 :(得分:0)
没有。当手机休眠时,基本上不会关闭CPU,因此没有应用程序在运行。如果你需要在手机睡觉时听取位置变化,你需要通过获取唤醒锁来防止它睡觉。请注意,如果您这样做,您将很快耗尽电池并且您的用户将卸载您的应用程序。
答案 1 :(得分:0)
如果您想在手机睡眠时跟踪位置,则需要partial wake lock。它会快速耗尽电池电量,因为即使用户按下电源按钮(但屏幕仍然可以关闭),您基本上不会让电话处于睡眠状态。
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
wl.acquire();
您需要通过清单请求权限,并且它会在Google Play中显示(假设您放置应用的位置),因此高级用户应该知道其含义。
现在我会说你到处读到的内容:尽量避免使用部分唤醒锁,因为它会杀死电池而人们会讨厌它。
OTOH,如果您的申请绝对需要,这就是必须的。
答案 2 :(得分:0)
您应该只依赖于LocationListener
,您需要“重新思考”应用程序的所有结构。可能注册一个LocationChangedReceiver
将是一个很好的选择,以及其他实际位置来源。
更多细节请查看@Reto Meier撰写的这篇精彩文章:A Deep Dive Into Location on Android。