① android後台服務保持,不被殺死
作者:閉關寫代碼
鏈接:https://www.hu.com/question/29826231/answer/71207109
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
強烈建議不要這么做,不僅僅從用戶角度考慮,作為Android開發者也有責任去維護Android的生態環境。現在很多Android開發工程師,主力機居然是iPhone而不是Android設備,感到相當悲哀。
從技術角度概括一下現在普遍的防殺方法
Service設置成START_STICKY,kill 後會被重啟(等待5秒左右),重傳Intent,保持與重啟前一樣
通過 startForeground將進程設置為前台進程,做前台服務,優先順序和前台應用一個級別,除非在系統內存非常缺,否則此進程不會被 kill
雙進程Service:讓2個進程互相保護,其中一個Service被清理後,另外沒被清理的進程可以立即重啟進程
QQ黑科技:在應用退到後台後,另起一個只有 1 像素的頁面停留在桌面上,讓自己保持前台狀態,保護自己不被後台清理工具殺死
在已經root的設備下,修改相應的許可權文件,將App偽裝成系統級的應用(Android4.0系列的一個漏洞,已經確認可行)
Android系統中當前進程(Process)fork出來的子進程,被系統認為是兩個不同的進程。當父進程被殺死的時候,子進程仍然可以存活,並不受影響。鑒於目前提到的在Android-Service層做雙守護都會失敗,我們可以fork出c進程,多進程守護。死循環在那檢查是否還存在,具體的思路如下(Android5.0以下可行)
用C編寫守護進程(即子進程),守護進程做的事情就是循環檢查目標進程是否存在,不存在則啟動它。
在NDK環境中將1中編寫的C代碼編譯打包成可執行文件(BUILD_EXECUTABLE)。
主進程啟動時將守護進程放入私有目錄下,賦予可執行許可權,啟動它即可。
聯系廠商,加入白名單
------------------------------------------------------
TIP: 面對各種流氓軟體後台常駐問題,建議使用「綠色守護」來解決,可是殺掉那些第三方清理工具難以清除的後台程序
② android 怎麼保證服務不被殺死
Service運行方式
以startService()啟動服務,系統將通過傳入的Intent在底層搜索相關符合Intent裡面信息的service。如果服務沒有啟動則先運行onCreate,然後運行onStartCommand (可在裡面處理啟動時傳過來的Intent和其他參數),直到明顯調用stopService或者stopSelf才將停止Service。無論運行startService多少次,只要調用一次stopService或者stopSelf,Service都會停止。使用stopSelf(int)方法可以保證在處理好intent後再停止。onStartCommand ,在2.0後被引入用於service的啟動函數,2.0之前為public void onStart(Intent intent, int startId) 。
以bindService()方法啟用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止。onBind()只有採用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,多次調用Context.bindService()方法並不會導致該方法被多次調用。採用Context.bindService()方法啟動服務時只能調用onUnbind()方法解除調用者與服務解除,服務結束時會調用onDestroy()方法。
擁有service的進程具有較高的優先順序
官方文檔告訴我們,Android系統會盡量保持擁有service的進程運行,只要在該service已經被啟動(start)或者客戶端連接(bindService)到它。當內存不足時,需要保持,擁有service的進程具有較高的優先順序。
1. 如果service正在調用onCreate,onStartCommand或者onDestory方法,那麼用於當前service的進程則變為前台進程以避免被killed。
2. 如果當前service已經被啟動(start),擁有它的進程則比那些用戶可見的進程優先順序低一些,但是比那些不可見的進程更重要,這就意味著service一般不會被killed.
3. 如果客戶端已經連接到service (bindService),那麼擁有Service的進程則擁有最高的優先順序,可以認為service是可見的。
4. 如果service可以使用startForeground(int, Notification)方法來將service設置為前台狀態,那麼系統就認為是對用戶可見的,並不會在內存不足時killed。
5. 如果有其他的應用組件作為Service,Activity等運行在相同的進程中,那麼將會增加該進程的重要性。
③ android開發怎麼讓個推服務不被手機系統殺掉
據我所知,你的困擾是推送服務在app關閉後無法獲取到及時通知。
原本android是有自己的推送服務的,但是國內閹割了google相關的服務和框架,也是為什麼很多海外游戲安裝都會報錯說缺少谷歌框架什麼的,作為google自己的東西,系統肯定是不會殺自己的服務的,其它的那就不一定了,比如個推。
但是谷歌聽說有一個關聯的毛病,就是比如a軟體用了個推服務,b軟體也用了個推的服務,當b軟體被關閉時候,a軟體開著,那麼個推的服務也就開著並且可以收到b軟體的推送通知。
根據這個模式其實很好理解,我們用兩個方案
比如像小米手機,本身就有小米的推送服務,不用說很多小米專版啊什麼的就是接入了小米的推送啦。
可以用一些大型的多人的推送平台服務,這個推送平台的相關產品是很熱門的,比如淘寶啊,微信啊,qq啊,因為他們本身就常常被用戶啟動。
其實一個app是可以接入多個服務的,一般接入2~3個,在啟動的時候我們是可以檢測到服務相關內容的,啟動那個服務自己選。
④ 怎樣使一個Android應用不被殺死
要讓android應用不被殺死,可以開啟一個service,一直檢測是否關閉了應用,一旦關閉馬上重新啟動。
當然首先要保證service不被殺死,應當提升service的優先順序,設為前台運行。也可以開啟兩個service互相檢測,一旦其中一個被關閉,另一個 馬上重啟對方。可以保證其生命穩定。這種方法也不是都行的,有些系統仍然能殺死。