安卓监控应用程序

11
我想创建一个带有实时监控功能的Android应用程序。其中一个监控功能是审核音频流,另一个功能是与外围传感器交互。这些监控功能可以由其他人触发。此外,为了节省电源消耗,音频功能将以轮询模式运行,即睡眠一段时间并唤醒一段时间。
我正在考虑如何设计Android应用程序。
  • 是否将音频功能设计为服务或活动?问题在于,如果将其设计为活动,则在一段时间后屏幕关闭时,音频功能将关闭。

  • 如何设计轮询功能?使用AlarmManager还是带有计时器的内部线程?

我的目标是尽可能地节省电源消耗。谢谢。

什么是“审核音频流”? - CommonsWare
使用AudioRecord读取音频缓冲流,审核分贝级别并记录日志。谢谢。 - babysnow
3个回答

1

与维克多的观点一致,您肯定想使用服务,并通过调用startForeground()将其固定在内存中。

但是我建议您研究利用内置系统Handler;将功能放入Runnable中,并调用mhandler.postDelayed(myRunnable,<some point in future>);这将使Android框架充分利用电源管理。


1

我建议以下操作:

a) 使用服务。Activity是短暂的实体(只在屏幕上显示时才有效)。

b) 将服务设置为前台(请参阅:http://developer.android.com/reference/android/app/Service.html#startForeground(int, android.app.Notification)。这将减少系统杀死您的服务的机会。

c) 在服务中启动一个线程,并在线程中完成所有需要的操作。

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

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

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


0

这是一个服务。

你可能需要一些额外的鲁棒性:即使是前台服务,该服务也可以被杀死并且不会在以后重启。这将停止您的监控。

从UI中启动您的服务。如果您希望服务在设备重新启动后继续运行,请在android.intent.action.BOOT_COMPLETED的BroadcastReceiver中启动它。

按照其他答案中描述的方式在服务中创建一个线程。

此外,使用Alarm Manager定期重新启动您的服务。多个startService()调用是可以的。如果已经在运行,则服务将继续运行。但是,如果系统忘记了它,例如在一系列低资源条件之后,现在将重新启动。

负责任地安排这些警报:为了成为一个好公民,请设置绝对最小的频率。毕竟,Android有一些很好的理由来杀死服务。

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


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