Android 組件化 (二)之重要的Application和Androidmanifest.xml

接着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 組件化(四)之集成模式中的重構

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章