组件化开发框架的简单使用

来源:互联网 发布:多空通道指标源码 编辑:程序博客网 时间:2024/06/03 17:15

这篇笔记是想要对我最近学习的组件化开发做一个简单的笔记,加深学习的印象。

首先说一下什么是组件化开发:组件化开发就是在团队开发中可能会有功能上的大的模块,可以将其分为不同的组件,这些组件在平时开发中可以单独作为app运行调试,当正式上线的时候打包为一个apk,组件化开发好处就是模块化,更加清晰,而且便于管理和调试,不用说调试一个模块的功能整个项目都一起跟着跑.组件化开发的示例图如下:


接下来具体说一下组件开发简单框架搭建的一个搭建:

(1)配置application与library之间的切换(单独开发的时候是application,等到合并的时候是library)

在整个个项目的gradle.properties中配置:

#每次更改“isModule”的值后,需要点击 "Sync Project" 按钮isModule=false

组件的build.gradle中如下配置:当是单独开发的时候配置为application,合并的时候配置为library:

if (isModule.toBoolean()) {    apply plugin: 'com.android.application'} else {    apply plugin: 'com.android.library'}

(2)解决合并组件和主app之间的menifest冲突问题

1.在组件的main 目录下建立两个目录来维护两个menifest(一个是单独可运行的(debug下),一个是作为library合并后的(release下))


debug下的menifest:就是类似于主app的menifest,可以单独运行,指定启动的activity,可以指定application


release下的menifest:不可以指定的application以及启动的activity:


2.组件里面的build.gradle要配置何时用哪个menifest文件(保证合并是不冲突,单独的时候有启动的activity)

sourceSets {    main {        if (isModule.toBoolean()) {            manifest.srcFile 'src/main/debug/AndroidManifest.xml'        } else {            manifest.srcFile 'src/main/release/AndroidManifest.xml'            //集成开发模式下排除debug文件夹中的所有Java文件            java {                exclude 'debug/**'            }        }    }}


(3)解决主app和组件之间的application的冲突问题

当android程序启动时,android系统会为每个程序创建一个Application类的对象,并且只创建一个,但是我们在组件化开发的时候每一个组件可能都会有一个自己的Application类的对象但是当所有组件要打包合并在一起的时候就会出现问题,因为最后程序只有一个Application。所以解决的办法就是创建一个commonLibrary,这里存放公共基类,工具类,自定义view,比如baseActivity ,BaseFragment,BaseApplication等,每个组件都依赖commonLibrary

创建library:CommonLibrary,定义BaseApplication:

public class BaseApplication extends Application {    private static BaseApplication sInstance;    public static Context context;    public static BaseApplication getsInstance() {        return sInstance;    }    @Override    public void onCreate() {        super.onCreate();        sInstance = this;        context = this.getApplicationContext();    }}

每个组件如果要定义自己的application的时候只要继承这个BaseApplication即可,当然如果整体打包运行的时候不需要自己的application那么就排除掉组件的application:在组件的build.gradle中如下




4.解决library重复依赖问题,第三方版本号控制问题

将常用的第三方库放到commonlibrary的组件的build.gradle的依赖中,然后组件依赖commonlibrary库

commonlibrary:

dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    //Android Support    compile "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion"    testCompile "junit:junit:$rootProject.junitVersion"    androidTestCompile("com.android.support.test.espresso:espresso-core:$rootProject.espressoVersion", {        exclude group: 'com.android.support', module: 'support-annotations'})    compile "org.greenrobot:eventbus:$rootProject.eventbusVersion"    annotationProcessor "com.github.mzule.activityrouter:compiler:$rootProject.annotationProcessor"    //router    compile "com.github.mzule.activityrouter:activityrouter:$rootProject.routerVersion"}
组件的依赖:

dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    compile project(':lib_common')}
主app的依赖:当组件独立运行时候,主app需要单独依赖commonlibrary:

dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])     if (isModule.toBoolean()) {        compile project(':lib_common')    } else {        compile project(':lib_demo')        compile project(':lib_test')    }}

接下来是整体版本的控制:在整个项目的build.gradle中配置ext

// Define versions in a single placeext {// Sdk and tools    buildToolsVersion = "25.0.2"    compileSdkVersion = 25    minSdkVersion = 14    targetSdkVersion = 25//时间:2017.2.13;每次修改版本号都要添加修改时间    versionCode = 1    versionName = "1.0"    javaVersion = JavaVersion.VERSION_1_8// App dependencies version    supportLibraryVersion = "25.3.1"    junitVersion = "4.12"    espressoVersion = "2.2.2"    annotationProcessor = "1.1.7"    routerVersion = "1.2.2"    eventbusVersion = "3.0.0"}

主项目和插件可以统一修改:

android {    compileSdkVersion rootProject.ext.compileSdkVersion    buildToolsVersion rootProject.ext.buildToolsVersion    defaultConfig {        minSdkVersion rootProject.ext.minSdkVersion        targetSdkVersion rootProject.ext.targetSdkVersion        versionCode rootProject.ext.versionCode        versionName rootProject.ext.versionName    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}

最后一步就是组件之间的activity调用,这里说道一个路由 ,这里使用的是activity Router 大家可以去查,这里说一下大概的使用步骤:

(1)整个项目的build.gradle:

dependencies {    classpath 'com.android.tools.build:gradle:2.3.3'    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'    // NOTE: Do not place your application dependencies here; they belong    // in the individual module build.gradle files}
(2)引入第三方依赖:

annotationProcessor "com.github.mzule.activityrouter:compiler:$rootProject.annotationProcessor"//routercompile "com.github.mzule.activityrouter:activityrouter:$rootProject.routerVersion"

(3)主app的menifest中

<activity    android:name="com.github.mzule.activityrouter.router.RouterActivity"    android:theme="@android:style/Theme.NoDisplay">    <intent-filter>        <action android:name="android.intent.action.VIEW" />        <category android:name="android.intent.category.DEFAULT" />        <category android:name="android.intent.category.BROWSABLE" />        <data android:scheme="myapp" /><!--改成自己的scheme-->    </intent-filter></activity>

(4)指定要跳转到的activity:

@Router("test")public class TestActivity extends Activity {    TextView tvmy;    @Override
(5)跳转时:

Routers.open(DemoActivity.this, "myapp://test");

传递数据用到了EventBus,这里就不细说了,下面是我写的一个简单的小demo,有需要的可以下载来简单学习,有什么不对的地方随时欢迎指出与交流

GitHub: https://github.com/wjn919/MyModuleDemo

原创粉丝点击