Android基础之Arouter的使用
2023-04-05 本文已影响0人
南风知我咦
资料
组件化开发的利器
- 组件化项目存在各个模块之间耦合,通信麻烦的问题 ,,为了解决这个问题,阿里巴巴的开发者就搞出了Arouter这个框架,以解决上述问题.
Arouter 支持模块间的路由、通信、解耦
简单使用
配置
- 添加依赖和gradle配置
- 我实在moudle_common中配置的
defaultConfig {
minSdk rootProject.ext.minSdkVersion
targetSdk rootProject.ext.targetSdkVersion
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
//ARouter配置
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MOUDLE_NAME: project.getName()]
}
}
}
dependencies {
...
//路由ARouter
api 'com.alibaba:arouter-api:1.5.2'
annotationProcessor 'com.alibaba:arouter-compiler:1.5.2'
...
}
- 初始化
public class MyApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
}
@Override
public void onCreate() {
super.onCreate();
//初始化音乐播放器
LocalMediaPlayer.getInstance().setWeakReference(this);
initARouter();
}
/**
* 初始化ARouter
*/
private void initARouter() {
if (BuildConfig.DEBUG){
ARouter.openLog();
// 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
ARouter.openDebug();
}
ARouter.init(this);
}
@Override
public void onTerminate() {
super.onTerminate();
//释放
ARouter.getInstance().destroy();
}
}
简单使用
- 写一个Constant类统一管理路由地址
/**
* 路由表
*/
public class ARouterConstant {
public static final String USB_ACTIVITY = "/com/mj/UsbActivity";
}
依赖注入
- 在支持路由的页面上添加注解(必选), 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = ARouterConstant.USB_ACTIVITY)
public class TestActivity extends BaseActivity {
}
发起路由操作
- 应用内简单跳转
initButton2(R.id.btn_jump2_test_arouter, new View.OnClickListener() {
@Override
public void onClick(View v) {
//路由跳转
ARouter.getInstance().build("/arouter/TestActivity").navigation();
}
});
- 携带参数的跳转
/**
* 路由跳转
*/
private void aRouterJump(){
//带参数
ARouter.getInstance().build(ARouterConstant.SECOND_ACTIVITY)
.withLong("long",123l)
.withString("string","路由")
.withObject("object",new TestARouterEntry("时间", TimeUtils.getCurrentTime(TimeUtils.DateMode.SIMPLE_TIME_MODE)))
.navigation();
}
混淆
- 使用Proguard
-keep public class com.alibaba.android.arouter.routes.**{*;}
-keep public class com.alibaba.android.arouter.facade.**{*;}
-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}
#如果使用了 byType 的方式获取 Service,需要添加下面规则,保护接口
#emmm还没看到这种使用方法呢,这应该是进阶用法吧(这种就是自己定义接口继承自IProvider,然后实现自己的接口的方式使用IProvider)
-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider
#如果使用了 单类注入 即 不顶用接口实现IPrvider,需要要添加规则,保护实现(哦哦 就是直接实现接口IProvider的类,不是通过自己定义接口继承自IProvider,然后在实现自己的接口)
#-keep class * implements com.alibaba.android.arouter.facade.template.IProvider
使用Gradle插件实现路由表的自动加载
- 额这个没怎么搞懂
IDE插件导航
- 去插件市场下载ARouter Helper插件
-
然后就可以方便直接定位你将要跳转的类了,很方便。
图片.png
进阶用法
URl跳转
- 通过uri跳转的方式,类似采用Scheme协议跳转,在目标Activity的清单文件中定义指定的scheme,host,path等属性,然后拼接成一个uri对象,就可以跳转到指定的Activity,但是采用之前的方法,我们必须在每一个目标Activity清单中都定义scheme相关参数,要是需要跳转的Activity数量比较多的话,那整个清单文件就会显得比较臃肿,维护起来比较麻烦。-
- 我们可以在项目中创建一个统一处理Scheme跳转的SchemeActivity作为中转,该Activity不需要布局文件,然后在清单中为该Activity定义scheme和host,如果外部需要跳转时,就采用统一的scheme和host,然后再拼接目标Activity的路劲,这样就可以在新建的SchemeActivity中统一通过ARouter传入接收的uri,进行跳转到指定的Activity
- 这个是真的叼,只需要定义一个中转的Activity,设置它的清单文件,然后所有的URL都通过它来中转。天才的想法。
- 创建一个Scheme协议跳转的中转页面SchemeActivity
/**
* 协议中转页面
*/
public class SchemeActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Uri uri = getIntent().getData();
ARouter.getInstance().build(uri).navigation();
finish();
}
}
- 设置清单文件,指定scheme和host
<application>
<activity android:name=".activity.SchemeActivity">
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<action android:name="android.intent.action.VIEW"/>
<data android:host="com.mj.app"
android:scheme="common"/>
</intent-filter>
</activity>
</application>
- 在需要的跳转的页面添加注解,添加路由路劲
@Route(path = ARouterConstant.TEST_ACTIVITY)
public class TestActivity extends BaseActivity {
}
- 使用ARouter跳转
/**
* 通过url跳转
*/
private void aRouterJumpByUri(){
String url = ARouterConstant.A_ROUTER_BASE_URL + ARouterConstant.TEST_ACTIVITY;
Log.d("url","url = " + url);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
}
URL携带参数的跳转
- 同上
/**
* 带参数的url跳转
* 就是把数据拼接在url后面
*/
private void aRouterJumpByUri(String name, int age) {
String url = ARouterConstant.A_ROUTER_BASE_URL + ARouterConstant.TEST_ACTIVITY;
url += "?name=" + name + "&age = " + age;
Log.d("url", "url = " + url);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
}
- 解析参数
@Route(path = ARouterConstant.TEST_ACTIVITY)
public class TestActivity extends BaseActivity {
private static final String TAG = "TestActivityTAG";
@Autowired(name = "name")
private String name;
@Autowired(name = "age")
private int age;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ARouter.getInstance().inject(this);
Log.d(TAG,"name = " + name);
Log.d(TAG,"age = " + age);
}
}