2012-08-15 95 views
11

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

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

  • 是否将音频功能设计为服务或活动? 问题是,如果它被设计为一个活动,如果屏幕在一段时间后关闭,音频功能将关闭。

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

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

+0

什么是“审计音频流”? – CommonsWare 2012-08-15 21:23:52

+0

使用AudioRecord读取音频缓冲区流并审核分贝级别并制作日志。谢谢。 – babysnow 2012-08-15 21:25:17

回答

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)的一段文字:“注意:Alarm Manager用于希望让应用程序代码在特定即使您的应用程序目前没有运行,对于正常的计时操作(滴答,超时等),使用Handler更容易,效率也更高。“

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

1

与同期发生维克多,你一定要通过调用startForeground()

不过我建议你考虑使用内置的系统Handler使用服务,并且将其固定到内存中;请将您的功能置于Runnable中,然后致电mhandler.postDelayed(myRunnable, <some point in future>);这将允许android框架充分利用电源管理。

0

这是一项服务。

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

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

在服务创建一个线程这里在其他的答案中描述。

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

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

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