那麽,説到前臺APP和後臺APP,大家應該都有一定的瞭解,但是這裏提到的前臺和後臺其實是專指在當下環境下用來限制Service行爲的一種區分,和正常我們理解的前臺後臺還是有區別的,Google文檔上的解釋為:

大家可以把它理解爲我在需要啓動Service的時候才需要知道的一種APP的前後臺狀態,它與我們經常理解的内存管理中的前臺後臺概念是不一樣的。
那麽哪些情況下會屬於在前臺的情況呢?Google同樣給出了判斷依據,其中只要有一條滿足,則為前臺APP:

從這裏可以看出來,第一條中説明了,只要有一個可見APP,不管是started還是paused狀態,其都代表是一個前臺APP,然而我們的Service程序第一條和第二條我們都沒有滿足,所以我們想要直接調起我們的Service是行不通的,所以這邊報錯是理所應當的,那麽在這裏,你自己可以試一下,如果我們將ForegroundService先使用帶Activity的方式讓其起來后,你再調用startService,你會發現,不會報錯了,這也印證了這一限制。
那麽爲了想要測試該行為,我們還能夠繼續進行下去嗎?辦法還是有的,你可以去APP裏面先把它的後臺運行權限以及自動啓動和允許自動啓動打開。
我這邊試了二種手機的打開方式:
華爲手機需要在應用管理-》應用耗電管理裏面,點選應用設置為手動管理,打開允許自動啓動和允許關聯啓動和後臺運行。
OPPO手機需要在應用管理中點選應用,打開允許其他應用自動啓動和允許自動啓動,耗電保護-》打開允許後臺運行。
(注意:如果你使用的是Google系統的手機,比如我在模擬器Nexus5X上試驗下來的結果顯示,默認其對於background程序的限制是放開的,但是你直接調用的話,也是會報錯的,所以在Google系統上還是不能這樣來處理,大家也可以試一下看看。)
這樣,我們的程序就可以在某些手機上正常的使用startService進行調用了,這時候再次調用,你會發現正常運行了,然而這種方式還有一個巨大問題,就是在你按返回鍵或者是按Home建回到Launcher的時候,service直接就停止了,畢竟人家骨子裏還是不支持你在後臺運行的,再次試了一下bindService的方式,也是半斤八兩,雖然按Home鍵會堅挺一會,查看ADJ為900而已啦。。。