如何在手机休眠时继续使用onSensorChanged()?

3

我正在创建一个需要检测手机检测到的最大加速度的应用程序。目前它可以工作,但是当屏幕关闭时,它无法继续任务。为了实现现在的功能,我在onCreate中编写了以下内容:

mSensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
mAccelerometer = mSensorManager!!.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION)

我已经在类中全局初始化了这些变量。然后我实现了onSensorChanged()onResume()onPause()并留空了onAccuracyChanged
据我所知,实现这样的函数与更简单地创建异步任务是不同的。我该如何改变它以使其在后台工作?谢谢!

最好的情况是,您需要实现一个前台服务(以帮助保持进程运行),并使用部分WakeLock(尝试保持手机CPU处于唤醒状态)。最有可能的是,您还需要始终将手机插入电源,否则Doze模式将中断您的WakeLock并允许CPU停止。即使这样做了,它也取决于设备制造商是否支持您所需的传感器在关闭屏幕时工作 - 这并不是保证的。 - CommonsWare
那可能有一个大概的例子是什么呢?这个应用程序也应该能够在不一直插着电源的情况下工作。谢谢。 - Enrico Cortinovis
应用程序应该能够在不必一直插着电源的情况下正常工作。但是,我怀疑您想要的功能在广泛的Android设备上并不可能实现。有些设备即使手机处于休眠状态也能够对传感器输入做出反应,但这种能力是基于型号的(甚至在某些情况下,可能只有部分传感器具备此能力),并且不一定会向应用程序开发人员公开。 - CommonsWare
很奇怪,谢谢。我会继续搜索,希望能找到一种方法,至少在可能的模型上使其工作。 - Enrico Cortinovis
通知是前台任务。让它持久化,使用WakeLock可能也有帮助,我认为。 - Darkman
谢谢您的建议,@Darkman。我会研究一下。 - Enrico Cortinovis
1个回答

1

即使使用WakeLock,当应用程序转到后台时,您将无法使用传感器API-官方文档很清楚

但是,在前台服务中即使手机屏幕关闭,您仍然可以轻松使用传感器API。为了做到这一点,请使用此文档作为起点-前台服务。这并不能保证服务的永久生存,但它肯定会比普通服务活得更长,并且您将可以访问传感器API。在这种情况下,我不确定WakeLock -您需要尝试(但我认为您不需要)。

这里有一些答案。其中一些包含示例代码甚至链接到示例项目

这里这里有一些中等难度的文章,作为很好的例子。


谢谢您的建议。我将尝试使用前台任务。我想将这50个声望点奖励给这个答案,您能否展示一下如何启动前台任务并在其中运行活动的快速示例? - Enrico Cortinovis
@EnricoCortinovis 不是前台任务,而是前台服务,你不能在那里运行一个Activity - 你可以在那里运行一些代码。我会添加一些示例代码的链接。 - Pavlo Ostasha
谢谢,我会研究一下的。 - Enrico Cortinovis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接