最近解決了一個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系統好亂,還是蘋果大法好,大家都按規矩辦事。