【问题标题】:Wakelock does not always keep my app aliveWakelock 并不总是让我的应用程序保持活力
【发布时间】:2014-10-21 10:55:21
【问题描述】:

我制作了一个简单的 Android GPS 跟踪服务应用,以被动模式记录设备位置。为了让 CPU 继续运转,我使用了唤醒锁,但它并不可靠。有时应用程序会运行 3 个小时。有时它可以完成一个完整的 24 小时循环。我没有在屏幕上看到任何崩溃报告——应用程序只是停止而没有任何迹象。电池寿命很好。

我将唤醒锁声明为主活动类变量

static WakeLock wakeLock;

并在启动 GPS 服务之前设置一次唤醒锁

PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock((PowerManager.PARTIAL_WAKE_LOCK),"MyAppNameWakelock");
wakeLock.setReferenceCounted(true);
wakeLock.acquire();

出于屏幕更改的原因,我还更新了 BackButton 函数以运行 moveTaskToBack(true); 而不是其正常操作。会不会跟这有关系?

是否有任何机械交互可以杀死正在使用的唤醒锁,例如连接电源线或 USB 线?

随后,Android 中是否有任何类型的日志可供我查看以了解我的应用停止的原因?

【问题讨论】:

  • “是否有任何机械交互可以杀死正在使用的唤醒锁,例如连接电源线或 USB 线?” - 不。 “为什么我的应用程序停止了?” -- 因为 Android 很可能终止了你的进程。进程不会永远存在。

标签: java android performance power-management wakelock


【解决方案1】:

理论上,如果您的应用没有因任何其他原因而死并且具有唤醒锁权限(请参阅此处:<uses-permission android:name="android.permission.WAKE_LOCK" />),它应该保持活动状态。

唤醒锁是否被外部事件移除,它可能取决于内核和设备。某些内核可能具有非常激进的电源管理功能,可以决定终止唤醒锁。您是否在更多设备上运行了您的应用?

但是我会调查是否有另一个事件杀死了我的应用程序(例如增加内存使用量)。

另一个想法是重写“finalize”方法并在垃圾收集器无法访问唤醒锁时打印一条消息以确定它何时死亡。

【讨论】:

  • 对不起,我有点晚了,但我遇到了与 OP 相同的问题。您能否发布一些有关如何覆盖该 finalize 方法的信息?谢谢!费德里科。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 2021-06-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多