在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);
网友评论