2016-01-19 63 views
0

我正在編寫一個應用程序,它可以連續監視來自麥克風的輸入,處理它(處理算法用C++編寫)並保存(記錄)或回放一些感興趣的事件。我正在Android L和Android M手機上測試我的應用程序。如何保持應用程序在後臺活動

應用正常工作按我的問題需要在以下用例:

  1. 打開
  2. 按Home鍵監控發送應用程序在後臺
  3. 確保設備不充電
  4. 等待一段時間

經過一段時間(約15分鐘)後,我在logcat中得到以下消息:

暫停所有線程...

爲了克服我試過以下問題:

  1. 保持喚醒鎖定(PARTIAL_WAKE_LOCK)
  2. 使用使用的AsyncTask產卵線程的另一個層面
  3. 在我的活動中設置FLAG_KEEP_SCREEN_ON

但他們都沒有工作。在iOS上,我可以使用信息列表中突出顯示的標誌來實現此用例的所需功能。

enter image description here

是否有可能做Android的類似的東西? (我相信音頻播放器已經做了類似的事情)

+1

「'如何保持應用程序在後臺運行」#不,你不能這樣做。你可以使用'START_STICKY'做一個服務,但是一旦系統需要資源,這個服務就會重啓。 –

+0

@SharpEdge感謝您的服務點。我去做。 Android可以在後臺重新啓動musicplayer應用程序嗎? –

+0

老實說,我不知道,因爲我沒有製作或使用任何音樂播放器應用程序,除了股票的應用程序。你可以谷歌它雖然。音樂應用程序如何作爲服務工作必須有解決方法。 –

回答

1

我希望這不會是一個完整的解決方案。但是我會嘗試給出一個解決方案來延長你的應用程序的生命週期。首先,不可能讓應用程序始終保持活躍狀態​​。這違背了Android的規則,因爲當系統需要資源(對於前臺應用程序)時,它可能會停止您的應用程序。但是,您可以通過將功能推入服務來延長應用程序的生命週期。以下是您的解決方案。

  1. 創建一個活動,其中有2個按鈕來啓動和停止記錄。

  2. 創建一個服務並將一個公共靜態變量設置爲一個設置爲true或false的標誌。

  3. 在活動中,使用上述靜態字段檢查服務是否處於活動狀態,並根據它啓用或禁用開始錄製按鈕。

  4. 使用該按鈕啓動服務,在服務中獲取部分喚醒鎖定並啓動線程並進行錄製。我希望你不想重新發送你的意圖到服務,因爲它用於啓動一個線程進行錄製。只有在有待處理的開始呼叫時,纔可以使用START_NOT_STICKY重新啓動服務。如果您真的想重新錄製您的錄音意圖並添加新錄音,我會說這是少點,因爲您不知道何時該服務將重新啓動,您可能會錯過某些錄音。

  5. 當您持有部分喚醒鎖時,它將繼續運行,直到Foreground應用程序需要資源。由於該服務的優先級高於後臺應用程序。

  6. 在onDestroy()使用中斷標誌停止線程(通過檢查中斷標誌保存記錄),將public static字段設置爲FALSE並釋放喚醒鎖。完成後,您可以從活動開始錄製。

通過在您的活動中使用FLAG_KEEP_SCREEN_ON,您只是告訴系統「當我在此活動中時保持屏幕開啓」。如果你打回家或切換到另一個活動,它將無法正常工作。我希望像視頻播放器這樣的遊戲或應用程序使用它來保持屏幕。

我還應該指出,通過保持部分喚醒鎖定時間較長,可能會使您的電池消耗很大。如果您使用FLAG_KEEP_SCREEN_ON,您也可以建議您的用戶留在連續錄製的活動中。

雖然我會建議啓動意向服務,獲取部分喚醒鎖並開始記錄。因爲它會停止創建新線程並在需要時啓動或停止它的開銷。

另外在iOS中,當您的應用程序切換到後臺時,我認爲系統GC爲應用程序提供資源。這就是我在學習iOS時記得的。

我希望我的解決方案能夠幫助您延長應用程序的使用壽命。謝謝

+0

謝謝,這很有用 –

+0

@Gyapti歡迎:) –

相關問題