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重寫這個方法處理授權邏輯了:

至此整個申請授權的主流程就分析完了,還是很多細節的。

總結:

最后用圖來總結一下整體授權的流程:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM