我正在考虑如何设计Android应用程序。
是否将音频功能设计为服务或活动?问题在于,如果将其设计为活动,则在一段时间后屏幕关闭时,音频功能将关闭。
如何设计轮询功能?使用AlarmManager还是带有计时器的内部线程?
是否将音频功能设计为服务或活动?问题在于,如果将其设计为活动,则在一段时间后屏幕关闭时,音频功能将关闭。
如何设计轮询功能?使用AlarmManager还是带有计时器的内部线程?
与维克多的观点一致,您肯定想使用服务,并通过调用startForeground()
将其固定在内存中。
但是我建议您研究利用内置系统Handler
;将功能放入Runnable
中,并调用mhandler.postDelayed(myRunnable,<some point in future>)
;这将使Android框架充分利用电源管理。
我建议以下操作:
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只是更复杂的消息处理和调度的便利类。看起来您的情况相当简单,通常的线程应该就足够了。
这是一个服务。
你可能需要一些额外的鲁棒性:即使是前台服务,该服务也可以被杀死并且不会在以后重启。这将停止您的监控。
从UI中启动您的服务。如果您希望服务在设备重新启动后继续运行,请在android.intent.action.BOOT_COMPLETED的BroadcastReceiver中启动它。
按照其他答案中描述的方式在服务中创建一个线程。
此外,使用Alarm Manager定期重新启动您的服务。多个startService()调用是可以的。如果已经在运行,则服务将继续运行。但是,如果系统忘记了它,例如在一系列低资源条件之后,现在将重新启动。
负责任地安排这些警报:为了成为一个好公民,请设置绝对最小的频率。毕竟,Android有一些很好的理由来杀死服务。
对于某些服务,可能需要更多步骤,但在这种情况下,这种方法似乎已经足够了。