1.添加依赖
在app下的build.gradle中添加如下代码
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName :project.getName()]
}
}
}
}
在app下的build.gradle中添加如下代码
implementation 'com.alibaba:arouter-api:1.3.1'
annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'
2.自定义一个Application
并继承自Application
在onCreate()
方法中初始化Arouter
ARouter.init(this);
不要忘记在AndroidManifest.xml
文件中加入自定义的Application
3.在Activity
/Fragment
类上面写上Route path注解
注意:这里的路径需要注意的是至少需要两级,/xx/xx
4.Activity
/Fragment
中将Arouter
注入,在onCreate()
中加入以下代码即可
ARouter.getInstance().inject(this);
5.接着在目标Activity
/Fragment
中声明注解,用来对应
注意:如果无法对应上则会有Toast提示:路径不匹配
@Route(path = "/app/MainActivity")
6.调用要打开的Activity
/Fragment
Arouter.getInstance().build("/app/MainActivity").navigation();
完整代码如下:
@Route(path = "/app/MainActivity")
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private ActivityMainBinding mBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
ARouter.getInstance().inject(this);
initClick();
}
private void initClick() {
mBinding.btnSecond.setOnClickListener(v ->
//打开SecondActivity
ARouter.getInstance().build("/app/SecondActivity") .navigation());
}
}
7.这个框架有注入和绑定那就必然会有解绑或者释放资源的API,这样做的目的是优化内存。
Arouter.getInstance().destroy();
在onDestroy()
中调用上面的代码即可释放资源
以上就是一次Arouter的基本使用,但是后期随着Activity增多,一个Activity
可能会被多个Activity
打开,上面的写法就会无法管理,所以我们进行一些封装
1.将注入代码放入到基类中,这样实现一个方法调用
public void injectARouter() {
ARouter.getInstance().inject(this);
}
2.将 Route path
进行封装
public class ActivityConsts {
public static final String PATH = "path";
public static final String ACTIVITY_URL_MAIN = "/app/MainActivity";
public static final String ACTIVITY_URL_SECOND = "/app/SecondActivity";
public static final String ACTIVITY_URL_LOGIN = "/app/LoginActivity";
public static final String ACTIVITY_URL_THIRD = "/app/ThirdActivity";
}
3.封装完成后即可实现如下调用方式
@Route(path = ActivityConsts.ACTIVITY_URL_MAIN)
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private ActivityMainBinding mBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
ARouter.getInstance().inject(this);
initClick();
}
private void initClick() {
mBinding.btnSecond.setOnClickListener(v ->
ARouter.getInstance().build(ActivityConsts.ACTIVITY_URL_SECOND)
.navigation());
mBinding.btnThird.setOnClickListener(v ->
ARouter.getInstance()
.build(ActivityConsts.ACTIVITY_URL_THIRD)
.navigation());
}
}
Arouter
传递对象的时候,首先该对象需要Parcelable或者Serializable序列化,Parcelable写起来较为麻烦,但是Android Studio有一些插件帮我们自动生成Parcelable序列化了
Arouter
可传递的参数类型还是够我们日常使用的
可以传递参数,那就可以接收参数,@Autoired()
便是接收参数的方法,使用时有两个点要注意。
@Autoired(name = "age")
,否则会出现null或者无法接受到你传递的参数;@Autowired(name = "name")
String mName;
@Autowired(name = "age")
int mAge;
@Autowired(name = "hero")
boolean isHero;
简单举个例子:
传递参数
mBinding.btnThird.setOnClickListener(v ->
ARouter.getInstance()
.build(ActivityConsts.ACTIVITY_URL_THIRD)
.withString("name", "Tony")
.withInt("age", 56)
.withBoolean("hero", true)
.navigation(this, new CustomNavigationCallback()));
接收参数
@Route(path = ActivityConsts.ACTIVITY_URL_THIRD, extras = ActivityExtras.EXTRA_LOGIN)
public class ThirdActivity extends AppCompatActivity {
private static final String TAG = ThirdActivity.class.getSimpleName();
@Autowired(name = "name")
String mName;
@Autowired(name = "age")
int mAge;
@Autowired(name = "hero")
boolean isHero;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
Log.i(TAG, mName + ", age:" + mAge + ", isHero:" + isHero);
}
mBinding.btnThird.setOnClickListener(v ->
ARouter.getInstance()
.build(ActivityConsts.ACTIVITY_URL_THIRD)
.withTransition(R.anim.xxxxxxx) //传入动画即可
.navigation());
startActivityForResult()
呢?1.在调用Arouter
进行Activity
进行跳转时,在navigation()
中加入requestCode
即可。
2.调用setRsult(requestCode)
。
3.在onActivityResult()
中根据响应的requestCode
获取参数
有些App进入时不需要登录,只有在需要的时候才会登录,这个时候就需要逐一判断,涉及页面较少时也没什么的,但是多了就会影响很麻烦,Arouter
很好地解决了这个问题,只需要判断一次,后期可直接进行配置。
Arouter
的拦截器是通过实现IInterceptor
接口,重写init()
和process()
方法去完成拦截器内部操作的。
1.首先定义一个拦截器
定义UseIInterceptor
实现IInterceptor
及其方法
2.定义一个被拦截后的处理类
这一步的目的是我们可以在这类面添加自己需要的操作,不写也行可以直接在拦截时调用NavigationCallback
,但是会比较麻烦。
3.这一步就是使用了
在需要拦截的Activity中加入定义好的拦截常量
extras = ActivityExtras.EXTRA_LOGIN
在触发事件的里面加入刚才定义的CustomNavigationCallback
即可
这时候可能会有疑问UseIInterceptor
没有在任何地方调用,怎么会产生拦截呢,卖个关子,讲原理的时候再解开这个疑问。
上面的代码中在UseIInterceptor
的顶部定义了一个@Interceptor(priority = 1)
,这个是拦截器的优先级,此处有两个点需要注意一下
1.priority的数值越小优先级越高,越先执行,这根四大组件的广播是相反的。
2.不可以同时定义两个一样优先级的拦截器,这样会导致项目无法正常编译,而且这也没必要。