ARouter实现功能组件之间的Activity跳转
先看下效果:
本文Android studio版本:Android Studio Dolphin | 2021.3.1
在app module里面导入arouter
- app module下面的build.gradle文件里添加配置
android {
...
defaultConfig {
...
//ARouter添加
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
...
}
dependencies {
...
// 替换成最新版本, 需要注意的是api
// 要与compiler匹配使用,均使用最新版可以保证兼容
implementation 'com.alibaba:arouter-api:1.5.2'
annotationProcessor 'com.alibaba:arouter-compiler:1.5.2'
}
ARouter的初始化
- 新建
MyApplication
,如下:
import android.app.Application;
import com.alibaba.android.arouter.launcher.ARouter;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 这两行必须写在init之前,否则这些配置在init过程中将无效
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
ARouter.init(this); // 尽可能早,推荐在Application中初始化
}
}
- 别忘了放到AndroidManifest.xml文件的
标签中:
android:name=".MyApplication"
- 给MainActivity添加路径,布局代码自己写哈!
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;
@Route(path = "/app/main_act")
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void toLogin(View view) {
ARouter.getInstance().build("/login/login_act").navigation();
}
}
新建library类型的module:login
-
如下图:
-
导入Arouter库,和app module一样:
android {
...
defaultConfig {
...
//ARouter添加
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
...
}
dependencies {
...
// 替换成最新版本, 需要注意的是api
// 要与compiler匹配使用,均使用最新版可以保证兼容
implementation 'com.alibaba:arouter-api:1.5.2'
annotationProcessor 'com.alibaba:arouter-compiler:1.5.2'
}
- 然后新建LoginActivity,并添加路径,布局文件自己写哈!
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;
@Route(path = "/login/login_act")
public class LoginActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
}
public void toShare(View view) {
ARouter.getInstance().build("/share/share_act").navigation();
}
}
新建library类型的module:share
- 也是新建module,然后添加ARouter依赖,同步一下。照上面弄就好。
- 新建ShareActivity,并添加路径。布局里就一个TextView,显示“分享页”。
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.alibaba.android.arouter.facade.annotation.Route;
@Route(path = "/share/share_act")
public class ShareActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_share);
}
}
app module 添加login和share 这两个依赖
build.gradle文件添加:
dependencies {
...
runtimeOnly project(':login')
runtimeOnly project(':share')
}
运行,解决报错。
第一个错误参考:https://stackoverflow.com/questions/55217992/manifest-merger-failed-attribute-applicationappcomponentfactory-androidx
报错如下:
Error:
Attribute application@appComponentFactory value=(androidx.core.app.CoreComponentFactory) from [androidx.core:core:1.7.0] AndroidManifest.xml:24:18-86
is also present at [com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18-91 value=(android.support.v4.app.CoreComponentFactory).
Suggestion: add 'tools:replace="android:appComponentFactory"' to <application> element at AndroidManifest.xml:5:5-28:19 to override.
解决办法是在根目录的gradle.properties文件中添加:
android.enableJetifier=true
android.useAndroidX=true
同步一下。再Run,成功了。