美文网首页
ARouter的集成

ARouter的集成

作者: 读书人heart | 来源:发表于2019-05-19 08:49 被阅读0次

有3种不同的module,app模块,base模块,和功能模块(module_begin(主模块),module_home(首页模块))(发代码块搞了很久不会发。。。)

一、AndroidStudio环境和配置

Android Studio 3.1.3

Build #AI-173.4819257, built on June 5, 2018

JRE: 1.8.0_152-release-1024-b01 x86_64

JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o

Mac OS X 10.13.6

注意:包名不可以一样

二、配置过程()

第1步:在项目的gradle.properties里面配置isModule=false,作为开关,设置功能模块是以application的模式启动还是library的模式启动

WechatIMG137.jpeg

isModule=false

第2步:在项目的build.gradle的dependencies配置


WechatIMG138.jpeg

classpath'com.neenbedankt.gradle.plugins:android-apt:1.4'

第3步:新建1个Android Library类型的module作为基础库 baselibrary

第4步:新建2个Phone & Tablet Module类型的module 作为功能模块 module_begin(这里放一个MainActivity),module_home(这边放一个HomeActivity)(模块的命名不要改,一会要用到)

image

接下来开始修改4个模块(app,baselibrary,module_begin,module_home)里面的配置

第5步:修改baselibrary模块

1、在build.gradle添加2个依赖和一个配置(跳转页面要用到)

android{
  defaultConfig {
   .....
   javaCompileOptions { annotationProcessorOptions { arguments = [moduleName: project.getName()] }}
  }
}
dependencies {
    .....
    annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'
    api 'com.alibaba:arouter-api:1.3.1'
 }
image

2、在模块内部新建一个BaseActivity作为基类,一个JumpUtil作为页面跳转的常量

BaseActivity类

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.alibaba.android.arouter.launcher.ARouter;
/**
 * Activity的基类
 * */
public class BaseActivity extends AppCompatActivity{
    @Override
    protected void onCreate( Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        ARouter的初始化
        ARouter.init(getApplication());
    }
}

JumpUtil类

public class JumpUtil {
     /**
     * begin和home要跟module_XXX的一样
     * */
    public static final String MainActivity = "/begin/MainActivity";
    public static final String HomeActivity = "/home/HomeActivity";
}

3、接下来修改功能模块(moduel_begin,module_home)(已module_begin为例)
(1)在模块里面的 src/main文件下创建buildApp(作为module)和buildModule(作为单独App,方便单元测试)文件夹


屏幕快照 2019-05-12 下午2.15.43.png

(2)把AndroidManifest复制到buildApp和buildModule文件夹里面,然后把外面的AndroidManifest文件删除


WechatIMG142.jpeg
(3)修改buildApp里面的AndroidManifest.xml,删除掉2个icon和1个label,Activity的启动,buildModule里面的不用修改,因为是作为独立模块运行
WechatIMG146.jpeg
WechatIMG147.jpeg

(4)修改功能模块的build.gradle


WechatIMG149.jpeg
WechatIMG151.jpeg

moduel_begin的build.gradle

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

android {
    compileSdkVersion 28
    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        if (isModule.toBoolean()) {
            applicationId "com.tianniu.module_begin"
        }
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [moduleName: project.getName()]
            }
        }
        sourceSets {
            main {
                if (isModule.toBoolean()) {
                    manifest.srcFile 'src/main/buildModule/AndroidManifest.xml'
                } else {
                    manifest.srcFile 'src/main/buildApp/AndroidManifest.xml'
                }
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    //noinspection GradleCompatible
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'
    implementation project(':baselibrary')
    if (!isModule.toBoolean()) {
//        implementation project(':module_home')
    }
}

另一个模块module_home,步骤跟module_begin的一样(build.gradle有一点不一样,其它一样)
module_home的build.gradle

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

android {
    compileSdkVersion 28



    defaultConfig {

        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

        if (isModule.toBoolean()) {
            applicationId "com.tianniu.moddule_home"
        }
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [moduleName: project.getName()]
            }
        }
        sourceSets {
            main {
                if (isModule.toBoolean()) {
                    manifest.srcFile 'src/main/buildModule/AndroidManifest.xml'
                } else {
                    manifest.srcFile 'src/main/buildApp/AndroidManifest.xml'
                }
            }
        }
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    //noinspection GradleCompatible
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'
    implementation project(':baselibrary')
    if (!isModule.toBoolean()) {
//        这里写你作为module时要添加的模块,因为begin模块需要home模块,而这里需要
    }
}

4、接下来是app模块的修改
(1)配置app的build.gradle


WechatIMG154.jpeg

app的build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.tianniu.aroutertest"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [moduleName: project.getName()]
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    //noinspection GradleCompatible
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'
    implementation 'com.alibaba:arouter-api:1.3.1'
    if (!isModule.toBoolean()) {
        implementation project(':module_begin')
    }
}

(2)删除掉所有Activity,创建一个Application,设置到AndroidManifest.xml里面的name里面,并在AndroidManifest.xml添加begin的MainActivity,设置启动


WechatIMG155.jpeg

MyApplication.java

import android.app.Application;
import com.alibaba.android.arouter.launcher.ARouter;

public class MyApplication  extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        initRouter(this);
    }

    private void initRouter(MyApplication myApplication) {
        if (BuildConfig.DEBUG) {
            ARouter.openLog();     // 打印日志
            ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
        }
        ARouter.init(myApplication);
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
        ARouter.getInstance().destroy();
    }
}

app的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tianniu.aroutertest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:name=".MyApplication"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name="com.tianniu.module_begin.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>
WechatIMG184.jpeg

配置就已经完成了。
(MainActivity可以用module_begin模块里面的默认Activity,HomeActivity可以在module_home模块里面新建一个activity,也可以里面的MianActivity直接改名)
将之前提到过的在工程目录下的gradle.properties的 isModule=false
false :一整个APP
true:可以已一个module单独运行(方便测试,不用每次都编译个1分钟2分钟的)

Activity跳转页面
MainActivity

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.alibaba.android.arouter.launcher.ARouter;
import com.tianniu.baselibrary.JumpUtil;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /**
         * 跳转页面
         * */
        ARouter.getInstance()
                .build(JumpUtil.HomeActivity) //页面的String值
//                .withString("key",s) //附带参数
                .navigation();
    }
}

在另一个Activity可以这样接收参数(HomeActivity)

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.alibaba.android.arouter.facade.annotation.Autowired;

public class HomeActivity extends AppCompatActivity {
    @Autowired(name = "key")
    String text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

    }
}

如果跳转失败会Toast出现,大多数是JumpUtil里面的String变量写错了
暂时只学到这里,有新的会更新。有什么错的地方和不足的地方,请

相关文章

  • ARouter的集成

    有3种不同的module,app模块,base模块,和功能模块(module_begin(主模块),module_...

  • ARouter集成问题

    组件化项目中使用ARouter来做跳转,集成进来失败 这句log中GroupIndex只有1个,其实就是我们添加的...

  • LitePal学习总结————怕忘记

    1.集成添加依赖api 'com.alibaba:arouter-api:1.5.0'2.初始化在Applicat...

  • Arouter源码分析

    Arouter核心请求类图 Arouter 和 _Arouter 的关系 _Arouter主要是处理Arouter...

  • 集成arouter,跨module报错

    根据github的使用文档,路由路径至少需要有两级:/xx/xx

  • Arouter

    ARouter github[https://github.com/alibaba/ARouter]ARouter...

  • ARouter使用总结

    1.ARouter是什么? 2.为什么使用ARouter? 3.如何使用ARouter? 3.使用ARouter的...

  • Arouter初始化过程

    Arouter初始化过程 Arouter初始化入口是Arouter类中的init方法,但Arouter类只是个代理...

  • ARouter原理解析

    基于arouter-api:1.3.1 arouter-compiler:1.1.4ARouter 为And...

  • Android组件化,阿里ARouter的集成

    一、概述 组件化开发优点多多,我也不多讲。但怎么样去搭建一个组件化的项目?下面就带大家一步步的集成,少走点弯路。 ...

网友评论

      本文标题:ARouter的集成

      本文链接:https://www.haomeiwen.com/subject/zlumaqtx.html