2011-12-05 184 views
8

我正在編寫包含兩個元素 - 服務和活動的簡單應用程序。活動僅用於啓動和停止服務。服務使用PhoneStateListener獲取有關當前CellID,LAC和RSSI(信號強度)的信息並將其記錄到文件中。PhoneStateListener onSignalStrengthsChanged停止在服務中調用

一切正常,而手機不睡覺。我注意到,在關閉屏幕和幾分鐘不活動後,我的PhoneStateListener不再被調用。我嘗試添加PARTIAL_WAKE_LOCK(和其他類型的鎖)到我的服務中,但我猜測它會導致嚴重的電池消耗,不應該以這種方式使用。另一方面,它並沒有真正幫助我。我的另一個嘗試是使用定時器並取消註冊/註冊我的PhoneStateListener在指定的時間間隔。出乎意料的是,這種方式似乎有助於刷新CellId和LAC(所以我猜想我的聽衆的onCellLocationChanged()被稱爲),但信號強度仍未更新。

我沒有嘗試使用BroadcastReciever,但經過一些挖掘主題和閱讀線索,所以我不認爲它適用於我。

綜上所述,我的問題是:爲什麼PhoneStateListener方法在手機處於睡眠狀態時不會被調用?有沒有辦法(比如強制手機喚醒或使用不同的機制)來有效克服這種行爲?

+0

'沒想到,它看起來是這樣幫助.. 。'不確定這是否意外地作爲聽文件的註釋'在註冊時,當指定的電話狀態改變時,電話管理器i提出適當的回調方法。 – tidbeck

回答

7

當屏幕關閉時,android停止通知單元格和信號更改。它通過在RIL級別上禁用URC通知來實現。據我所知,如果不打開屏幕就無法獲得更新。廣播接收機不會以任何不同的方式工作。

所以,如果它對你來說是實用的,我會建議你打開屏幕,只要你想檢查這些值。您可以通過獲取喚醒鎖並提供標誌來實現:ACQUIRE_CAUSES_WAKEUP | SCREEN_DIM_WAKE_LOCK

編輯:重新註冊聽衆將實際上觸發要執行的位置變化,但它不通過當前小區信息,在屏幕前,僅最後一個已知小區信息都會響起。要獲取當前的單元格信息,您仍然需要打開屏幕。

1

呼叫在開始:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "call_lock"); 

,並在年底:

wakeLock.release(); 

您需要的權限:

<uses-permission android:name="android.permission.WAKE_LOCK" />