我想创建一个具有实时监控功能的Android应用程序。一种监控功能是对音频流进行审计。另一种功能是与外围传感器交互。这些监测功能可以由其他人触发。此外,为了节省功耗,音频功能将以轮询方式运行,即睡眠一定时间,唤醒一定时间。
我正在考虑如何设计Android应用程序。
我的目标是尽可能地节省电力消耗。谢谢。
发布于 2012-08-28 16:13:19
我建议如下
( a)使用服务。活动是短暂的实体(它只在屏幕上工作)
b)创建服务前景(请阅读以下内容:http://developer.android.com/reference/android/app/Service.html#startForeground(int。这将减少系统杀死您的服务的可能性。
( c)在服务中,启动一个线程并在线程中执行所需的一切。
( d)如果希望定期执行,只需在线程中执行Thread.sleep() (当线程休眠时,它不会消耗CPU周期)。
我相信c)和d)比AlarmManager更可取。这里是文档(http://developer.android.com/reference/android/app/AlarmManager.html)中的一篇文章:“注意:警报管理器是针对您希望在特定时间运行应用程序代码的情况,即使您的应用程序目前没有运行。对于正常的定时操作(滴答、超时等),使用Handler更容易,效率更高。”
由于您的应用程序正在运行,所以最好有一些永久运行的线程,并在上面执行一些内容。一般来说,Handler、HandlerThread、MessageQueue只是比较复杂的消息处理和调度的方便类。看起来你的情况很简单,通常的线程应该就足够了。
发布于 2012-09-12 00:59:07
与Victor一致,您肯定希望使用服务,并通过调用startForeground()将其固定在内存中
不过,我建议您研究如何利用内置的系统Handler;将您的功能放在一个Runnable中并调用mhandler.postDelayed(myRunnable, <some point in future>);这将使android框架能够充分利用电源管理。
发布于 2012-09-13 12:41:44
这是一项服务。
您可能需要一些额外的健壮性:服务可以被杀死,以后不会重新启动,甚至是前台服务。这会阻止你的监控。
从UI开始您的服务。如果您希望该服务能够在设备重新引导的情况下生存下来,也可以从BroadcastReceiver for android.intent.action.BOOT_COMPLETED启动它。
如这里所述,在服务中创建一个线程。
此外,使用警报管理器定期再次启动您的服务。多个startService()调用是可以的。如果已经在运行,则服务将继续运行。但是如果它被系统遗忘了,比如说,在经历了一系列低资源状况之后,它现在就会重新启动。
负责任地安排好那些警报:做一个好公民,设定绝对最小的频率。毕竟,Android有一些很好的理由来终止这项服务。
对于某些服务,可能需要更多的步骤,但在这种情况下,这种方法似乎就足够了。
https://stackoverflow.com/questions/11977497
复制相似问题