android Process.killProcess 和 System.exit(0) 區別


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM