1 Process.killProcess 和 System.exit(0) 兩個都會 kill 掉當前進程。
你可以打開 DDMS 查看進程號,或 adb shell 進入 shell 然后 ps 一下,進程確實被 kill 掉了。
2 如果是在第一個 Activity 調用 Process.killProcess 或 System.exit(0) 都會 kill 掉當前進程。
但是如果不是在第一個 Activity 中調用,如 ActivityA 啟動 ActivityB ,你在 ActivityB 中調用
Process.killProcess 或 System.exit(0) 當前進程確實也被 kill 掉了,但 app 會重新啟動,
又創建了一個新的進程。(這是我同事發現的)
這點還不是很明白,我估計 android os 認為 app 是被意外終止的(如內存不足),os 底層有監聽服務,
app 被意外終止會自動重啟。
3 在測試極光推送的時候,發現退出 app 后就收不到推送了。后來發現是調用了 System.exit(0) 的原因。
首先 service 也是在進程中的,在主線程中,所以 service 中如果有耗時操作也要開啟另外的線程來處理。
當調用 System.exit(0) 或 Process.killProcess 的時候進程被 kill 掉了,進程里的所有東西當然包括 service 肯定
也沒了。由於極光推送 pushservice 被 kill 掉了,所以退出 app 后就收不到推送了。
4 還沒完,戲劇性的事情發生了,剛退出 app 由於 kill 掉了進程,服務沒了,所以收不到推送。但是過了大約1分鍾左右居然又能推過來了。
原來是和 service 的 onStartCommand 的返回值有關
@Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("lelsie", "service onStartCommand"); return START_STICKY; //return START_NOT_STICKY; }
如果返回 START_STICKY 是說服務應該一直運行除非我們手動停止它。極光 pushservice 返回的肯定是 START_STICKY。
所以1分鍾之內系統又重啟了服務,當然會先為 app 創建一個新的進程,也就是重啟了 app, 同樣你可以在 DDMM 中查看進程的殺死與新進程的重建。
我在手機上截了 2 張圖
第一個圖是在調用了 Process.killProcess 或 System.exit(0) 之后的圖,可以看到進程已不存在了,服務當然也不在了。顯示正在重新啟動。
第二個圖是服務重啟以后的正常狀態,所以 1-2分鍾后又能接收到推送了。
第三個圖是 DDMS 截圖
5 其實 Process.killProcess 或 System.exit(0) 都不應該直接調用, 進程是由 os 底層進行管理的,android 系統會自己進行處理回收進程。
退出應用你就直接 finish 掉 activity 就行了。
正常情況下 back 鍵退出應用以后 os 就會回收 app 進程, 但當 app 中有推送服務等需要長時間運行的服務時 os 就不會 kill 掉進程,也就是說應用將一直在線。 即使你手動 kill 掉進程, 進程也會自動重啟。
本人水平有限,有問題大家再多討論。。。。
有興趣的同學可以用我寫的 demo 測試: http://pan.baidu.com/s/1c0xS5g8