轉載請聲明出處!
前言
上一個大的系列文章叫 “手把手講解”, 曆時10個月,出産博文二十餘篇,講解細緻,幾乎每一篇都提供了詳實的原理講解,提供了可運作
github Demo
,并且針對Demo中的關鍵地地方進行了重點拆解。相信每一位詳細閱讀文章的同行都會有所收獲。但是,講解雖詳細,但是缺乏對于技術的深度的挖掘。
從今天開始開辟新的專題:
移動架構師專業技能深入淺出
,以一步步成為架構師為目标,詳述一項架構師技能的最直接使用價值,橫向周邊知識以及縱深專業技術.
最直接使用價值: 網上最怕看到一種文章,全文開篇高大上,讓人覺得遙不可及,通篇看下來卻沒有展示技術如何落地,落地之後是何種效果。文章寫出來,就要以最容易讓人接受的方式帶讀者進入作者的世界,而不是裝作一副高高在上的樣子俯視衆生。是以,文章開篇,一定是最直接的展示技術的落地效果。提供可運作Demo可以讓讀者親自嘗試。
橫向周邊知識: 一項核心技術,必然不是獨立存在,技術是一個體系,但是一篇文章能夠詳述的技術有限,必然是以一項技術為中心,其他技術作為輔助。核心技術需要詳述,但是周邊技術,也需要交代,參天大樹拔地而起也少不得土壤作為依附。用簡明的語言交代周邊知識,并提供這些知識正确的研究方向。也是一個負責任的博文作者不可忽視的一步。
縱深專業技術: 做技術,最忌諱的就是淺嘗辄止。稍微深入一點就退出去,一來不利于了解底層實作,長此以往永遠隻是一個技術小白,成不了大師;二來不利于長久記憶, 記憶力再強的人時間長了,技術細節必然會記憶模糊。但是如果深入核心,了解了原理,在技術的大方向上絕對不會偏差。作為要成為架構師的男人,即使記不了那麼多細節,但是對于大方向的把握絕對不能錯。是以,技術縱深很有必要。
正文大綱
- Demo位址
- 本文所涉技術盤點
- 關于Android權限的梗
- 初級/中級/進階android開發的權限請求寫法
AOP優雅權限架構詳解
gradle配置
Java代碼
- AOP思想以及常用AOP架構
AOP架構的深入原理研究
AspectJ
正文
1.Demo位址
Demo位址:https://github.com/18598925736/GracefulPermissionFramework/tree/dev_aspectJ
2. 本文所涉技術盤點
以下适合有一定Android開發年限的開發閱讀。并且對以下技術點至少有個基本了解,才能了解本文demo代碼
java代碼中大量使用@符号作為注解标志,注解用途多種多樣,但是基本都是做标記,用于源碼期,編譯期,或者運作期的特别處理。注解有自己的特定文法以及API。
注解基礎
java
Gradle是androidStudio中的項目建構架構,用于将android源碼工程整合編譯打包成apk。其中可以自定義gradle插件,也可以引用他人釋出的gradle插件來給項目建構過程中加入自己想要的邏輯。
插件基礎
Gradle
java反射,某些不友善直接使用的類或者方法,可以通過反射的方式使用。反射通常用在架構設計,hook技術中。
- Java 反射基礎
本文的重點是優雅地寫出權限申請的代碼,要讀懂本文自然不能對權限一無所知。
- 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
啟動之時動态申請,并且,谷歌還提供了 權限組和權限的概念差别,把某一些功能類似的權限放在一個組别,當你去申請其中一個權限的時候,其實也是在預設申請該組的其他權限。雖然這種做法可以讓你少寫一個權限,但是谷歌依然建議把所需的權限寫完整,因為保不齊哪天谷歌就變更了權限組,到時候代碼出相容問題,沒必要,而且把所需權限寫完整也是程式設計好習慣。
下圖是所有的危險權限以及權限組。
- Android Q 起 又有重大變革。從筆者适配Android Q的過程種,發現
- STORAGE 權限組的兩個權限,READ_EXTERNAL_STORAGE / WRITE_ETERNAL_STORAGE 無需動态申請(但是依然要在清單檔案中聲明), 因為Q系統啟用了沙盒機制,app通路自己app所屬目錄無需任何權限,而如果是要通路app所屬目錄之外的地方,就需要申請 READ_EXTERNAL_STORAGE / WRITE_ETERNAL_STORAGE這兩個權限。
- 如果裝置在背景運作時,需要使用 位置資訊,需要動态申請權限,Q 引入了 ACCESS_BACKGROUND_LOCATION 這個新權限,目的是限制背景程序擷取悄悄的擷取使用者位置資訊。如果此權限運作在Q以下(不含)的系統時,就會預設授予,但是Q及以上,則必須申請。
- 其他一些改動,詳見官網,https://developer.android.google.cn/about/versions/10/privacy/changes?hl=zh-tw.
- 另外說一個比較麻煩的問題,如果你運作我的Demo在多種機型上會發現效果可能會完全不同,舉兩個極端的例子:android6.0版本的mumu模拟器,很多權限會預設授予比如位置資訊權限。另外,某些華為手機上,一些權限會預設拒絕,每一次你申請都是 使用者已經永久拒絕。 這是因為 手機廠商或者模拟器廠家已經對 谷歌的原生安卓系統進行了深度定制,更改了權限的相關代碼。是以,處理這種問題,要對多種機型進行适配處置。
4. 初級/中級/進階android開發的權限請求寫法
權限的梗其實就那麼一些,比較簡單。上面這些梗,我們需要 特别關注的隻有一個,那就是6.0以後的動态權限申請。它的處理方式為:
主要流程轉化成代碼展示出來:
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
同樣一份回調方法,居然在項目中出現了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)