接着Android 元件化(一)之入門 回答一下大嬸的問題
Androidmanifest.xml 的改動
Androidmanifest.xml 是有改動的,內建模式群組件模式是有相對較大的卻别的,因為在內建模式中我們隻需要一個launch的Activity ,是不允許出現多個launch和多個Application的 也不能出現多個圖示啊 lable啊 等屬性,
我們先看一下內建模式下的Anroidmanifest.xml
我們在圖說過
項目殼中我們将上述在元件中不能有的屬性全部申明在項目殼中的Androidmanifest.xml中
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.beastwars.componentizationdemo">
<application
android:name="com.beastwars.componentizationdemo.MainApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
</application>
</manifest>
在這個Androidmanifest.xml中不做元件中Activity的申明
然後在元件中的src/main/Androidmanifest.xml 中
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.beastwars.module_main">
<application android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Main2Activity"></activity>
</application>
</manifest>
⚠️:元件中內建模式下的androidmanifest.xml 的application節點是沒有上述不能出現的屬性的,當然我在這裡放置了自己的啟動類群組件中的類的申明
再看一下元件模式src/main/module/androidmanifest.xml 中是和平時一樣的
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.beastwars.module_test">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".TestActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
內建模式群組件模式下的Context
好的 Androidmanifest.xml 就設計完了,接下來我們考慮一下,在Android運作的時候我們的程式是不是會建立一個Application 并且隻會建立一個,他在整個程式中的聲明周期是最長的,預設情況下程式是自動建立的,隻有在自定義的時候并且是在Androidmanifest.xml中申明之後才會建立我們自定義的Application,那這個有什麼沖突呢?在元件化開發的時候,我們可能可能回在每個元件中申明一個自己的Application,但是程式咋內建模式的時候隻需要一個Application,是以必須找一個全局的Application用來提供Context
在Android元件化(一)中我寫過元件化過程中使用到的名詞,有一個通用元件,我們就在這個元件中建設一個BaseApplication 作為所有Application的基類,主要用作內建模式下,在元件模式下,還是各自建設自己的Application 并且在build.gradle中進行申明
圈中的是元件自己使用的Application
然後在build.gradle中申明
sourceSets {
main {
if (isComponent.toBoolean()) {
manifest.srcFile 'src/main/moudle/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
//這個申明的時候不是像Androidmanifest.xml這樣 而是在內建模式的時候将我們這個包中的類檔案排除
java {
exclude 'component/**'
}
}
}
}
Library
一般我們是将依賴放在我們的通用元件中,但是如果出現像元件模式圖中某個業務元件即使用通用元件,有單獨添加了一個自己的元件,那在內建模式的時候會出現什麼問題呢?
對,老表說的對,很大可能會出現的就是依賴重複,我們常見的就是添加完依賴之後v4 包提示重複了,很頭疼,那怎麼辦呢?問得好!
gradle提供了解決的方法 就是根據元件名或者包名排除重複包 看一下代碼
//排除v4包重複
implementation("com.jude:easyrecyclerview:$rootProject.easyRecyclerVersion") {
exclude module: 'support-v4'
}
到目前為止,元件化的中出現的基本問題都已經解決了,之後我們就要讓每個元件跑起來,
- 那麼是什麼驅使他們內建在一起調用?
Android 元件化(三)之元件間的通信
- 又是是什麼讓整個項目一目了然?
Android 元件化(四)之內建模式中的重構