【问题标题】:Keep location listener alive when phone sleeps手机休眠时保持位置监听器处于活动状态
【发布时间】:2012-10-12 22:11:51
【问题描述】:

我在一个 Android 小部件中有一个位置监听器,它在 MLocation 类中声明为,

私有静态 MyLocationListener locationListener;

小部件启动一个服务,该服务反过来创建 MLocation 类。 MLocation 类在创建时创建并注册位置侦听器。

在手机休眠之前一切正常。当手机休眠时(休眠后的某个时间),Android 会终止该服务和它创建的所有类(MLocation 也是如此)。在手机解锁时,Android 会重新创建服务,然后创建 MLocation 类等。在手机睡眠期间,位置不再监听变化(因为它被杀死了)。有没有办法让位置监听器保持活跃,即使手机处于休眠状态?

【问题讨论】:

  • 您需要通过服务运行LocationListener。查看this tutorial

标签: android location


【解决方案1】:

没有。当手机休眠时,基本上不会关闭 CPU,因此没有应用程序在运行。如果您需要在手机休眠时监听位置变化,您需要通过获取唤醒锁来防止手机休眠。请注意,如果您这样做,您将很快耗尽电池,并且您的用户将卸载您的应用程序。

【讨论】:

    【解决方案2】:

    如果您想在手机休眠时跟踪位置,您需要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,如果您的应用程序绝对需要它,那就必须这样。

    【讨论】:

      【解决方案3】:

      你应该只依赖你的LocationListener,你需要“重新思考”你的应用程序的所有结构。可能注册LocationChangedReceiver 以及其他实际位置来源是一个不错的选择。

      更多详情请查看@Reto Meier 撰写的这篇精彩文章:A Deep Dive Into Location on Android

      【讨论】:

        猜你喜欢
        • 2019-01-12
        • 2012-07-17
        • 2017-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-01
        • 2016-01-18
        • 1970-01-01
        相关资源
        最近更新 更多