最近解決了一個Android APP的bug,發現APP在被後臺清理後,會自動重啟。現象很奇怪,有的手機(HTC)後臺清理後,程式會再次重啟,而有的手機(小米)則不會。猜想可能是小米手機內部做了處理,當執行後臺清理後,對應的APP不會再重啟了。 Debug後發現,APP內部有一個Service,在S ...
最近解決了一個Android APP的bug,發現APP在被後臺清理後,會自動重啟。現象很奇怪,有的手機(HTC)後臺清理後,程式會再次重啟,而有的手機(小米)則不會。猜想可能是小米手機內部做了處理,當執行後臺清理後,就不允許對應的APP重啟了。
Debug後發現,APP內部有一個Service,在Service的onStartCommand函數中,返回值是一個int。主要的兩個值是START_STICKY和START_NOT_STICKY。START_STICKY的含義是如果service進程被kill掉,保留service的狀態為開始狀態,但不保留遞送的intent對象。隨後系統會嘗試重新創建service,由於服務狀態為開始狀態,所以創建服務後一定會調用onStartCommand(Intent,int,int)方法。如果在此期間沒有任何啟動命令被傳遞到service,那麼參數Intent將為null。而START_NOT_STICKY是“非粘性的”。使用這個返回值時,如果在執行完onStartCommand後,服務被異常kill掉,系統不會自動重啟該服務。
我們的程式設置的是START_STICKY,程式擇機重啟時,一些變數沒有初始化,導致crash。改為START_NOT_STICKY後,問題解決了。但是還剩下一個問題,老大發現微信的APP不管在HTC還是小米的機器上,執行後臺清理後,其Service都還在,這就很奇怪了,同事猜,可能是手機ROM中對特定的程式設置了白名單。個人覺得不大可能,但問題在於,如果所有的APP coder都可以將程式設置為不會被kill掉,為什麼僅僅是微信不被kill?還是我們技術不過硬,沒有找到不被系統kill的方法?
總之,Android系統好亂,還是蘋果大法好,大家都按規矩辦事。