Android9.0动态运行时权限源码分析及封装改造<二>-----权限检测requestPermissions源码分析

校验requestcode是否合法:

继续接着上一次https://www.cnblogs.com/webor2006/p/12757460.html的权限申请框架源码进行分析,这一次则需要分析最最核心的API了:

这块稍复杂一些,慢慢来,不着急:

所以此条件是满足的,看一下它里面做了啥?

Activity.requestPermissions():

继续往下:

 

这个目前咱们还木有重写过,所以先放一放,先继续往下分析着,回头再来分析它:

那咱们来看一下构建这个Intent的细节:

 

那怎么来验证这一点呢?其实我们可以运行用adb dump一下Activity的信息就能验证出来,下面来试一下,先在manifest中添加访问SDcard的权限:

然后再运行一下:

 

此时来看一下这个权限弹窗是不是一个Activity,如下:

此时会输出一大堆东西,在最后可以看到相关Activity的信息,如下:

确实是的,那咱们瞅一下这个Activity源码,上AndroidXRef上看一下:

分析GrantPermissionsActivity授权界面的逻辑:

看一下onCreate()的逻辑:

记得这里设置了一个监听回调,在下面的分析中会要用到的:

而最终UI的显示也是封装在GrantPermissionsViewHandlerImpl中的,如下:

咱们重点来分析一下授权的逻辑,当然我们得点击界面的“始终允许”按钮,所以看一下点击事件的逻辑:

此时则回到Activity中来:

PackageManager.grantRuntimePermission():

接下来就可以回到Android Studio中来查看进一步的授权细节了:

找具体实现类:

此时又有IBinder通讯了,到PackageManagerService中来查找一下:

而它又往里调用了,注意这里有一个回调,最终结果的处理都会回到这个回调里面来分析的:

 

继续往里跟进去:

然后分析关键代码,此时就会到这:

 

 

好,回到主流程继续:

此时则回到上面提到的回调中来看一下回调处理:

其实也就是写到配置文件当中了,这里就不细分析了,再回到授权的主界面来,此时就会执行到这了:

 

onRequestPermissionsResult()回调处理:

此时授权界面就消失了,接下来则会回到执行我们界面的Activity.onResume()方法,而底层最终会执行到这:

然后跟进去:

其中REQUEST_PERMISSIONS_WHO_PREFIX还记得是在哪传递的么?就是在我们申请权限时传递的,回忆一下:

所以看一下这块的逻辑:

 

此时咱们就可以在咱们自己的Activity重写这个方法处理授权逻辑了:

至此整个申请授权的主流程就分析完了,还是很多细节的。

总结:

最后用图来总结一下整体授权的流程:

原文地址:https://www.cnblogs.com/webor2006/p/13269742.html