最近在适配android权限的时候,遇到一个问题:
1:在Activity中的onCreate中申请了Phone、Storage权限
2:在Activity 的onResume中刷新数据时,使用到了Phone权限
3:用户进入到该activity,同意赋予了所有权限,然后点击HOME 退出到后台 ,去手动关闭Phone权限
4:点击Recent 进入到之前的Activity
由于执行了onResume,需要使用Phone权限,但是没有改权限,所以直接crash
当时的做法是,在onResume中判断权限是否存在,如果不存在,则去申请权限,调用的额方法和和onCreate相同
发现这种方法不行,在每次手动关闭权限,在从Recent中进入时,申请了两次权限,而且有次申请权限的结果直接返回了 ,还没申请权限弹框就直接返回了结果。
最终通过log发现,如果手动关闭权限,再从recent进入后,会重新走生命周期onCreate--->onResume,不是直接执行onResume,所以在onResume中再次申请权限就会存在问题。
而且不能同时在onCreate和onResume中申请权限,因为申请权限时异步的,在onCreate中申请后还没有返回结果时,就会执行onResume,如果onResume中有存在需要获取权限才能执行的操作时,就会发生crash。
解决方案:
1:申请权限最好在onResume中申请
2:如果因为重新执行了onCreate 界面显示问题 可以从savedInstanceState中获取数据,并恢复
3:如果onCreate中申请权限,在onResume中就要进行权限是否获取判断,但是不能在onResume中再次申请,可以将onResume中相关操作,放入onCreate申请权限的结果中进行执行