在Nexus 7.0.1發現一個動態權限的坑,與大家共同探討以下:
應用正常運行的過程中,切后臺進入設置頁關閉應用部分權限(注:關閉包含先打開再關閉,也就是說有關閉操作),再從多窗口返回應用,頁面還是原頁面,但是單例緩存的數據丟失了。
通過追蹤日志發現,application重新oncreate(pid發生變化)了,其實系統發現一旦有了權限關閉,會記錄了當前activity棧順序并自動關閉原先app進程,并啟動一個新的進程,同時恢復了棧頂頁面,只有棧頂activity會執行oncreate,給用戶造成app并沒有重新啟動的錯覺,但是內存數據都已經清除了。
參考IOS處理權限修改的方式——權限修改會自動重啟應用。在Application注冊ActivityLifecycleCallbacks,對activity棧進行計數。由于我們app的Mainactivity是以singletask方式存在棧底的,正常情況下其他activity執行oncreate時,activity棧計數必然會大于0,只有在異常啟動activity時activity棧計數為0(監控點可以在baseActivity的oncreate里或者ActivityLifecycleCallbacks的onActivityCreated里,baseActivity會好一些),這個時候重啟App即可。
重啟方式如下:
Intent intent = mContext.getPackageManager()
.getLaunchIntentForPackage(mContext.getPackageName());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
mContext.startActivity(intent);