2017-02-20 78 views
0

我正在構建其中一個SOS應用程序。每當設備被震動超過閾值(通過加速度計檢測)時,我顯示Toast(截至目前)即使在活動關閉後,仍然保持Android服務運行

1)應用程序啓動。用戶給出姓名,電子郵件等,並在最後一個屏幕上點擊finish

2)Service開始不停地收聽搖一搖。

3)如果App正在運行,它會正確檢測到搖晃。

4)如果我關閉了應用程序(activity),服務會與它一起被殺死。

即使關閉應用程序,我如何保持service運行,以便它可以從後臺收聽抖動? (這是這個應用程序的全部目的)

[1.I是回START_STICKYonStartCommand

  • 我使用BroadcasterReciever其將通過接收重新啓動服務也試圖從onTaskRemoved

  • 我對華碩Xenfone最大測試播放,棉花糖OS ]

  • +0

    經歷一次http://fabcirablog.weebly.com/blog/creating-a-never-ending-background-service-in-android –

    +0

    順便說一句,你可以嘗試使用這個解決方案基於BroadcastReceiver而不是服務:http://stackoverflow.com/a/24540699/1533933 – krossovochkin

    +0

    非常感謝@krossovochkin。這是實現我想要做的事情的好方法。我會測試它。 –

    回答

    0

    您可以在前臺放置一個服務,在這種情況下,它始終被視爲活動(因此它將擁有自己的通知,因此用戶知道活動的服務正在運行)。它不會停止,直到它回到背景。這就是你想要的,因爲你希望你的服務儘可能長時間保持活力。正如描述的Android Service documentation

    一個啓動的服務可以使用startForeground(INT,通知) API把服務前臺狀態,當系統認爲它是一些用戶正在積極瞭解因此當內存不足時不會成爲殺人的候選人。

    這個想法與活動和服務相同,實際上:當Android需要內存時,它開始查殺進程。前臺進程(例如屏幕上顯示的活動或前臺服務)比後臺進程具有更高的優先級(例如,暫停的活動),因此它們將是系統要停止的最後一個進程。

    使用START_STICKY只是告訴系統,如果它必須殺死你的服務,那麼你希望它重新啓動它。這並不是說這個服務的優先級高於其他服務。

    2

    你有兩個選擇:

    • 啓動爲前景的服務服務(與startForeground(int id, Notification notification)docs。但在這種情況下,你將作爲長時間出現在通知欄通知對作爲服務運行
    • 使用單獨的進程爲您服務將在清單給你的進程android:process=":nameofyourprocess"
    +0

    您確定在單獨的流程中使用您的服務將具有與生命週期中的前臺服務相同的效果嗎? – JonesV

    +0

    @JonesV如果通過「生命週期」,你的意思是「這兩個服務對於Android是否具有相同的優先級,所以如果Android沒有更多的內存,就不能分辨哪一個會先被銷燬」 - 然後回答「當然不是」 。前臺服務具有最高優先級,並且只有在任何其他非前臺服務將被終止時纔會被終止。但問題是關於沒有在Activity上銷燬服務。用這些術語來說 - 是的,他們會表現得一樣。前臺服務就像電池殺手 - 所以如果你可以避免身份證 - 做它 – krossovochkin

    +1

    我只是想爲一個SOS應用程序,你想確保它正在運行,不會被殺死=)。我對「電池殺手」部分感興趣!這是爲什麼?你的意思是即使前臺服務沒有做任何事情? – JonesV

    0

    嘗試不綁定它開始服務到活動(簡單的未綁定服務)。返回null您的onBind()功能。只要附件能夠存活,粘滯服務就會將自己附加到活動中並具有一定的使用壽命。當您使用前臺服務時,您可能會有一個與您的應用程序相關的常量通知。

    相關問題