以下所講,濃縮在 https://github.com/wytings/CrashDemo
首先就這個(gè)名字來說,kill了process 或者 system.exit確實(shí)已經(jīng)把APP殺掉了,特別是當(dāng)你棧里只有一個(gè)Activity的時(shí)候,這個(gè)措施是行之有效的。但是因?yàn)锳ndroid framework的原因,在一些情況下APP會(huì)被重啟,其實(shí)更準(zhǔn)確地來說是App被恢復(fù)了。什么情況呢?就是如果你還有未被主動(dòng)關(guān)閉的Activity的時(shí)候。比如ActivityA -打開-> ActivityB —打開—ActivityC,然后再ActivityC進(jìn)行system.exit或者Process.killProcess(Process.myPid());此時(shí)因?yàn)樵贑導(dǎo)致整個(gè)APP被關(guān)閉了,而A和B卻什么也沒操作就被關(guān)了,framework 層認(rèn)為這是被冤殺的,所以即便是我們自己選擇去kill的,就當(dāng)前的Framework 的機(jī)制來說,它認(rèn)為這種主動(dòng)的退出方式是一種異常退出……,所以它會(huì)竭盡全力去恢復(fù)這個(gè)APP。
在“異常退出”的情況下,F(xiàn)ramework會(huì)保存APP的一些狀態(tài)信息比如Activity運(yùn)行棧,然后恢復(fù)一個(gè)Android應(yīng)用程序時(shí),會(huì)先從棧里面移除異常的Activity,相當(dāng)于Back鍵操作。如果移除后沒有Activity則不恢復(fù)也就是“關(guān)閉成功的假象”,如果還有Activity則會(huì)恢復(fù)移除后的第一個(gè)Activity。
來我們繼續(xù)以上面的A->B->C 打開的順序來進(jìn)行說明:
1、如果在ActivityC kill則,APP恢復(fù)時(shí)會(huì)顯示ActivityB;
2、如果在ActivityB kill Process則會(huì)恢復(fù)ActivityA;
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26