這個問題具體表現(xiàn)為在移動端瀏覽器上或android的webview上打開某個網頁 調用攝像頭拍照后,無法實現(xiàn)圖片上傳,瀏覽器會自動刷新;這一問題無法100%重現(xiàn),但概率不低:
在如紅米等低端安卓機上發(fā)生的概率會比較高。
用微信打開的網頁出現(xiàn)這種情況的概率更大;
跟調取系統(tǒng)相冊相比,調用攝像頭拍照出現(xiàn)這種情況的概率更大;
這個問題的原因主要是由于android底層設計缺陷引起的,讓我們看看這一行為過程到底發(fā)生了些什么:
1.當用戶從瀏覽器調用攝像頭時,Android系統(tǒng)會把系統(tǒng)進程從瀏覽器切換到攝像頭(或者相冊),這個時候瀏覽器進程變成了后臺進程;
2.由于Android操作系統(tǒng)的設計缺陷,此時瀏覽器進程的留存優(yōu)先級(不被系統(tǒng)kill掉的優(yōu)先級)與所有其它的后臺進程是一樣的,因此如果操作系統(tǒng)認為內存不足需要進行清理,此時瀏覽器進程將不會得到任何保護 -- 很不幸,因為瀏覽器占用內存一般都比較大,所以這次kill操作很容易kill掉瀏覽器進程;
3.當用戶選擇好圖片返回瀏覽器時,瀏覽器進程已經不復存在了,按照Android的機制,瀏覽器進程將進行恢復,試圖恢復到kill之前的狀態(tài) -- 很不幸,恢復到什么狀態(tài)是由瀏覽器來決定的,而瀏覽器不可能100%恢復到選擇文件之前的那個狀態(tài)。因此最終用戶所看到的現(xiàn)象就是:選擇文件完成后,瀏覽器刷新了一下,而刷新到什么狀態(tài)由瀏覽器決定。
對于這一問題,Android技術團隊的態(tài)度是回避(將bug標記為obsolete) -- 可能是因為此bug涉及了OS底層進程切換的機制,修復起來風險太高;而隨著手機設備內存容量的增大,這一問題所發(fā)生的概率會越來越小。
理解了問題的原因,對問題的一些表征也就有了合理的解釋:低端安卓機的內存更小,因此發(fā)生問題的頻率更高;而與選擇本地圖片相比,調取系統(tǒng)攝像頭所耗的內存更大(當拍攝有大量文字的圖片時尤其如此),因此調取攝像頭時問題發(fā)生的更加頻繁;當用戶已經開了很多別的App時,問題發(fā)生的概率更大。
感謝chuan chao‘s 分享