校验requestcode是否合法:

继续接着上一次​​​​的权限申请框架源码进行分析,这一次则需要分析最最核心的API了:

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

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

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

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

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

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

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

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

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

Activity.requestPermissions():

继续往下:

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

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

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

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

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

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

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

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

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

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

然后再运行一下:

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

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

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

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

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

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

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

分析GrantPermissionsActivity授权界面的逻辑:

看一下onCreate()的逻辑:

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

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

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

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

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

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

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

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

此时则回到Activity中来:

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

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

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

PackageManager.grantRuntimePermission():

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

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

找具体实现类:

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

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

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

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

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

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

继续往里跟进去:

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

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

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

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

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

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

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

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

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

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

好,回到主流程继续:

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

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

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

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

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

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

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

onRequestPermissionsResult()回调处理:

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

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

然后跟进去:

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

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

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

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

所以看一下这块的逻辑:

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

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

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

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

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

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

总结:

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

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