2013-04-29 49 views
2

我有一個Service應該與服務器保持永久連接以接收通知。我的應用程序準時從服務器獲取消息至關重要。使用AlarmManager定期檢查我的永久服務正在運行

我無法使用GCM Push,因爲連接將位於本地網絡中,並且手機可能沒有任何互聯網連接。我也知道在服務中保持永久連接的電池問題,但是我會讓用戶選擇此選項並通知他/她有關潛在的電池耗盡情況(實際上,該功能在設備始終處於相同狀態連接電源的地方)。我也知道Android系統可以隨時殺死我的服務,甚至用戶可以使用任務殺手來擺脫當時運行的所有服務。

說,我想定期使用AlarmManager來檢查我的Service是否正在運行,如果不是,請重新啓動它。我不相信這個選項,因爲服務器可以在服務被終止但尚未由AlarmManager重新啓動後發送消息。

我的問題基本上是否有更好的策略來確保我能夠按時收到消息?

到目前爲止,我所能找到的所有相關信息都支持避免永久服務和使用其他服務,但由於我的用例的性質,我沒有其他選擇。

回答

1

將您的服務設置爲前臺服務(請參閱this)。 Android只會在極端情況下殺死這項服務。如果意外崩潰,您仍然可以使用警報管理器作爲「安全網」來重新啓動服務。這是你能做的最好的。沒有什麼是100%。

+0

這實際上是一個好主意:)我認爲它是完美的,因爲通過這個通知,用戶知道服務正在後臺運行,並且他/她可以點擊它來禁用它。如果Android殺死服務,用戶也會知道。 爲了完整起見,我可以說我在'onStartCommand()'回調中調用'startForeground()'。這裏有一個例子:https://github.com/commonsguy/cw-android/blob/master/Notifications/FakePlayer/src/com/commonsware/android/fakeplayerfg/PlayerService.java – Esparver 2013-04-29 12:31:57

1

你可以看看在任何設備廣播如WiFi連接狀態和啓動設置broadcastreceiver;

<receiver android:name=".receivers.BootReceiver" > 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 

    <receiver android:name=".receivers.WifiReceiver"> 
     <intent-filter> 
      <action android:name="android.net.wifi.STATE_CHANGE" /> 
     </intent-filter> 
    </receiver> 
+1

其實這可能沒有太大的幫助。如果OP已經建立了自己的服務來永久運行,那麼只有當他的服務明確地關閉時(使用'stopService()'或'stopSelf()'),'onDestroy()'纔會被調用。如果Android想要關閉服務,因爲它需要資源,Android將簡單地終止託管該服務的進程,在這種情況下,將不會調用「onDestroy()」。 – 2013-04-29 10:01:50

+0

的確,我已經考慮過了,但是當Android系統或任務管理器終止進程時onDestroy()方法不會被調用......此外,常量START_STICKY也沒有太多幫助:服務一段時間後不會開始被殺...... – Esparver 2013-04-29 10:06:25

+0

我同意onDestroy的東西,它不保證,甚至是普通的,從我的答案中刪除後代。謝謝大衛。 – 2013-04-29 10:11:34