天天看點

AOP程式設計_Android優雅權限架構(1)概念基礎,2021金三銀四前言正文大綱正文

轉載請聲明出處!

前言

上一個大的系列文章叫 “手把手講解”, 曆時10個月,出産博文二十餘篇,講解細緻,幾乎每一篇都提供了詳實的原理講解,提供了可運作

github Demo

,并且針對Demo中的關鍵地地方進行了重點拆解。相信每一位詳細閱讀文章的同行都會有所收獲。但是,講解雖詳細,但是缺乏對于技術的深度的挖掘。

從今天開始開辟新的專題:

移動架構師專業技能深入淺出

,以一步步成為架構師為目标,詳述一項架構師技能的最直接使用價值,橫向周邊知識以及縱深專業技術.

最直接使用價值: 網上最怕看到一種文章,全文開篇高大上,讓人覺得遙不可及,通篇看下來卻沒有展示技術如何落地,落地之後是何種效果。文章寫出來,就要以最容易讓人接受的方式帶讀者進入作者的世界,而不是裝作一副高高在上的樣子俯視衆生。是以,文章開篇,一定是最直接的展示技術的落地效果。提供可運作Demo可以讓讀者親自嘗試。

橫向周邊知識: 一項核心技術,必然不是獨立存在,技術是一個體系,但是一篇文章能夠詳述的技術有限,必然是以一項技術為中心,其他技術作為輔助。核心技術需要詳述,但是周邊技術,也需要交代,參天大樹拔地而起也少不得土壤作為依附。用簡明的語言交代周邊知識,并提供這些知識正确的研究方向。也是一個負責任的博文作者不可忽視的一步。

縱深專業技術: 做技術,最忌諱的就是淺嘗辄止。稍微深入一點就退出去,一來不利于了解底層實作,長此以往永遠隻是一個技術小白,成不了大師;二來不利于長久記憶, 記憶力再強的人時間長了,技術細節必然會記憶模糊。但是如果深入核心,了解了原理,在技術的大方向上絕對不會偏差。作為要成為架構師的男人,即使記不了那麼多細節,但是對于大方向的把握絕對不能錯。是以,技術縱深很有必要。

正文大綱

  1. Demo位址
  2. 本文所涉技術盤點
  3. 關于Android權限的梗
  4. 初級/中級/進階android開發的權限請求寫法
  5. AOP優雅權限架構詳解

    gradle配置

    Java代碼

  6. AOP思想以及常用AOP架構
  7. AspectJ

    AOP架構的深入原理研究

正文

1.Demo位址

Demo位址:https://github.com/18598925736/GracefulPermissionFramework/tree/dev_aspectJ

2. 本文所涉技術盤點

以下适合有一定Android開發年限的開發閱讀。并且對以下技術點至少有個基本了解,才能了解本文demo代碼

  • java

    注解基礎
java代碼中大量使用@符号作為注解标志,注解用途多種多樣,但是基本都是做标記,用于源碼期,編譯期,或者運作期的特别處理。注解有自己的特定文法以及API。
  • Gradle

    插件基礎
Gradle是androidStudio中的項目建構架構,用于将android源碼工程整合編譯打包成apk。其中可以自定義gradle插件,也可以引用他人釋出的gradle插件來給項目建構過程中加入自己想要的邏輯。
  • Java 反射基礎
java反射,某些不友善直接使用的類或者方法,可以通過反射的方式使用。反射通常用在架構設計,hook技術中。
  • Android 權限基礎知識
本文的重點是優雅地寫出權限申請的代碼,要讀懂本文自然不能對權限一無所知。
  • AOP面向切面程式設計思想
面向切面程式設計是代碼解耦的重要手段之一。更多資訊且看下文。

3. 關于Android權限的梗

權限問題,自android問世以來就是一個梗,最早做android的那一批人,當時可以随便擷取使用者資訊,包括聯系人,包括短信内容,包括通話記錄,可以說Android被人诟病的安全問題,源自于此。代碼層面,開發者隻需要對照android官網權限說明,在manifest檔案中聲明所需的權限,即可在代碼種通路所需的資料。各類權限十分繁多,超過上百種權限,适用于各種不同場景,記不下來,一般也不用記。

需要的時候到官網https://developer.android.com/reference/android/Manifest.permission.html查找即可.

下面總結幾點Android發展曆史種,權限體系的重大變革。

  • Android 1.0 - Android 5.0/5.1 App開發者隻需要在清單檔案中聲明權限,安裝的時候就會自動授予。
  • Android 6.0 起 谷歌把所有的權限分為2類,普通權限,即 依然是隻需要在清單檔案中聲明即可。另一類,是危險權限,涉及到使用者隐私的權限,除了在清單檔案種聲明之外,還需要在

    App

    啟動之時動态申請,并且,谷歌還提供了 權限組和權限的概念差别,把某一些功能類似的權限放在一個組别,當你去申請其中一個權限的時候,其實也是在預設申請該組的其他權限。雖然這種做法可以讓你少寫一個權限,但是谷歌依然建議把所需的權限寫完整,因為保不齊哪天谷歌就變更了權限組,到時候代碼出相容問題,沒必要,而且把所需權限寫完整也是程式設計好習慣。

    下圖是所有的危險權限以及權限組。

AOP程式設計_Android優雅權限架構(1)概念基礎,2021金三銀四前言正文大綱正文
  • Android Q 起 又有重大變革。從筆者适配Android Q的過程種,發現
    1. STORAGE 權限組的兩個權限,READ_EXTERNAL_STORAGE / WRITE_ETERNAL_STORAGE 無需動态申請(但是依然要在清單檔案中聲明), 因為Q系統啟用了沙盒機制,app通路自己app所屬目錄無需任何權限,而如果是要通路app所屬目錄之外的地方,就需要申請 READ_EXTERNAL_STORAGE / WRITE_ETERNAL_STORAGE這兩個權限。
    2. 如果裝置在背景運作時,需要使用 位置資訊,需要動态申請權限,Q 引入了 ACCESS_BACKGROUND_LOCATION 這個新權限,目的是限制背景程序擷取悄悄的擷取使用者位置資訊。如果此權限運作在Q以下(不含)的系統時,就會預設授予,但是Q及以上,則必須申請。
    3. 其他一些改動,詳見官網,https://developer.android.google.cn/about/versions/10/privacy/changes?hl=zh-tw.
  • 另外說一個比較麻煩的問題,如果你運作我的Demo在多種機型上會發現效果可能會完全不同,舉兩個極端的例子:android6.0版本的mumu模拟器,很多權限會預設授予比如位置資訊權限。另外,某些華為手機上,一些權限會預設拒絕,每一次你申請都是 使用者已經永久拒絕。 這是因為 手機廠商或者模拟器廠家已經對 谷歌的原生安卓系統進行了深度定制,更改了權限的相關代碼。是以,處理這種問題,要對多種機型進行适配處置。

4. 初級/中級/進階android開發的權限請求寫法

權限的梗其實就那麼一些,比較簡單。上面這些梗,我們需要 特别關注的隻有一個,那就是6.0以後的動态權限申請。它的處理方式為:

AOP程式設計_Android優雅權限架構(1)概念基礎,2021金三銀四前言正文大綱正文

主要流程轉化成代碼展示出來:

AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
           

Java 代碼

/**
     * 申請權限
     */
    protected void requestPermission(String[] permissions, int requestCode) {
        // 檢查已經有了這些權限
        if (PermissionUtil.hasSelfPermissions(this, permissions)) {
            Log.e(TAG, "Activity,requestPermission: 所有權限都已經有了,無需申請");
        } else {
            // 開始請求權限
            ActivityCompat.requestPermissions(this, permissions, requestCode);
        }
    }
           
/**
     * 處理回調
     *
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (PermissionUtil.verifyPermissions(grantResults)) {//檢查是否都賦予了權限
            granted(requestCode);
        } else {
            // 顯示提示
            if (PermissionUtil.shouldShowRequestPermissionRationale(this, permissions)) {
                //shouldShowRequestPermissionRationale 這個方法就是檢查,是不是權限被永久拒絕了。。。
                //如果用就拒絕,這裡就傳回false,隻是第一次拒絕,那就傳回true

                // 取消權限
                denied(requestCode);
            } else {
                // 權限被拒絕
                deniedForever(requestCode);
            }
        }
    }
           

上面申請權限

ActivityCompat.requestPermissions

和處理回調

onRequestPermissionsResult

是開發者需要手動編碼的地方。

同樣是上面的邏輯,

初級/中級/進階

開發者的處理方式截然不同。

  • 初級
一個完整的商業項目,勢必會涉及到非常多的

Activity

Fragment

,以及

普通Java類

等等 ,諸多地方需要使用到特定的權限,如果我們

ctrl+H

全文搜尋一下

onRequestPermissionsResult

,發現如下場景:
AOP程式設計_Android優雅權限架構(1)概念基礎,2021金三銀四前言正文大綱正文

同樣一份回調方法,居然在項目中出現了25次之多. 而且是權限申請這種和業務并不直接搭邊的代碼 還嵌入到業務代碼内部。OK,這裡就不多說了。

(PS: 其實這個就是我自己公司的代碼,我不知道為什麼會這樣…也許是公司人員更替太多,後人都懶得改架構)

  • 中級

    PS:參考 https://github.com/18598925736/GracefulPermissionFramework/tree/dev

中級開發,作為有一定工作經驗的程式員,知道如何優化代碼,減少維護成本,那麼他很可能會發現,需要用到權限申請的地方,基本上是以Activity和Fragment,隻要解決了這裡的代碼備援,他會這麼寫
public abstract class BaseActivity extends AppCompatActivity implements IPermissionCallback {
    protected static final String TAG = "BaseActivity";

    /**
     * 申請權限
     */
    protected void requestPermission(String[] permissions, int requestCode) {
        // 檢查已經有了這些權限
        if (PermissionUtil.hasSelfPermissions(this, permissions)) {
            Log.e(TAG, "Activity,requestPermission: 所有權限都已經有了,無需申請");
        } else {
            // 開始請求權限
            ActivityCompat.requestPermissions(this, permissions, requestCode);
        }
    }

    /**
     * 請求回饋
     *
     * @param requestCode
     * @param permissions
     * @param grantResults


# 最後

面試是跳槽漲薪最直接有效的方式,馬上金九銀十來了,各位做好面試造飛機,工作擰螺絲的準備了嗎?

掌握了這些知識點,面試時在候選人中又可以奪目不少,暴擊9999點。機會都是留給有準備的人,隻有充足的準備,才可能讓自己可以在候選人中脫穎而出。

如果你需要這份完整版的**面試筆記**,隻需你多多**支援**我這篇文章。

**[CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視訊】](https://codechina.csdn.net/m0_60958482/java-p7)**

![](https://img-blog.csdnimg.cn/img_convert/5d69927f4f70184c79ef38a8e174fa0f.png)

備,才可能讓自己可以在候選人中脫穎而出。

如果你需要這份完整版的**面試筆記**,隻需你多多**支援**我這篇文章。

**[CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視訊】](https://codechina.csdn.net/m0_60958482/java-p7)**

[外鍊圖檔轉存中...(img-XjXpWWBy-1630546176323)]

![](https://img-blog.csdnimg.cn/img_convert/e227b20ff63f4976a1429a8c3cdd7a2c.png)