2012-08-15 97 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有一些很好的理由來終止該服務。

對於某些服務,可能需要更多的步驟,但在這種情況下,這種做法似乎是足夠的。