11

我想创建一个具有实时监控功能的 Android 应用程序。一种监控功能是审计音频流。另一个功能是与外围传感器交互。这些监控功能可以由其他人触发。此外,为了节省功耗,音频功能会以轮询模式运行,即休眠一定时间,唤醒一定时间。

我正在考虑如何设计Android应用程序。

  • 将音频功能设计为Service还是Activity?问题是如果设计成Activity的话,如果屏幕关闭一段时间后,音频功能就会关闭。

  • 如何设计轮询功能?使用 AlarmManager 或带 Timer 的内线程?

我的目标是尽可能地节省功耗。谢谢。

4

3 回答 3

1

我会推荐以下

a) 使用服务。活动是短暂的实体(它仅在屏幕上有效)

b)使服务前台(阅读此: http: //developer.android.com/reference/android/app/Service.html#startForeground (int , android.app.Notification)。这将减少系统杀死的机会你的服务

c) 在服务中,启动一个线程并在线程中做所有你需要的事情。

d) 如果要定期执行,只需在线程中执行 Thread.sleep() 即可(当 Thread 休眠时,它不会消耗 CPU 周期)。

我相信 c) 和 d) 比 AlarmManager 更可取。这是文档中的一段(http://developer.android.com/reference/android/app/AlarmManager.html):“注意:警报管理器适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未运行。对于正常的计时操作(滴答声、超时等),使用 Handler 更容易且效率更高。

由于您的应用程序正在运行,因此最好有一些永久运行的线程并在其上执行某些操作。一般来说 Handler、HandlerThread、MessageQueue 只是用于更复杂的消息处理和调度的便利类。看起来你的情况很简单,通常的 Thread 应该足够了。

于 2012-08-28T16:13:19.817 回答
1

同意 Victor,您肯定想使用服务,并通过调用将其固定到内存中startForeground()

但是我建议您考虑使用内置系统Handler;将您的功能放在 a 中Runnable并调用mhandler.postDelayed(myRunnable, <some point in future>);这将允许 android 框架充分利用电源管理。

于 2012-09-12T00:59:07.223 回答
0

那是一种服务。

而且您可能需要一些额外的健壮性:服务可以被终止并且以后不会重新启动,即使是前台服务。这将停止您的监控。

从 UI 启动您的服务。如果您希望服务在设备重启后仍然存在,也可以从 android.intent.action.BOOT_COMPLETED 的 BroadcastReceiver 启动它。

如此处其他答案中所述,在服务中创建一个线程。

此外,使用警报管理器定期重新启动您的服务。多个 startService() 调用都可以。如果已经运行,该服务将继续运行。但是如果它被系统遗忘了,比如在一系列资源不足的情况下,它现在会重新启动。

负责任地安排这些警报:做一个好公民,设置绝对最低的频率。毕竟,Android 有一些很好的理由来终止该服务。

对于某些服务,可能需要更多步骤,但在这种情况下,这种方法似乎就足够了。

于 2012-09-13T12:41:44.640 回答