今天看了会ARouter,在这里简单记录下
跟着其他大哥的博客学习了下,总感觉不牢固,借此机会再次简单记录下。
第一步:ARouter 配置
android { defaultConfig { ... javaCompileOptions { annotationProcessorOptions { arguments = [ moduleName : project.getName() ] } } } } dependencies { /* ARouter */ compile 'com.alibaba:arouter-api:1.2.2' annotationProcessor 'com.alibaba:arouter-compiler:1.1.3' }
第二步:ARouter 初始化
public class DemoApplication extends Application{ @Override public void onCreate() { super.onCreate(); ARouter.openLog(); // 打印日志 ARouter.openDebug(); // 开启调试模式,线上版本需要关闭,否则有安全风险) ARouter.init( this ); // 尽可能早,推荐在Application中初始化 } }
目前准备工作就绪,通常如果从A页面跳转到B页面,下面代码我们都很熟悉。
Intent intent = new Intent(A.this,B.class); startActivity(intent);
但是用ARouter就厉害了,注意了,注意了哈。
第三步:新建两个Activity
MainActivity和SecondActivity,从MainActivity路由到SecondActivity,SecondActivity代码如下:
@Route(path = "/activity/secondActivity") public class SecondActivity extends AppCompatActivity{ @Autowired String name; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); ARouter.getInstance().inject(this); Toast.makeText(this,name,Toast.LENGTH_SHORT).show(); } }
对于被路由到的Activity需要用Route注解,并且注明path路径,path路径需要有两层及以上,比如"/activity/secondActivity",在此个人建议可以对所有的path路径封装在类或接口中,便于统一管理。
public interface RouterContacts { String GRO_LOGIN = "/login/"; interface login { String LOGIN = GRO_LOGIN + "login"; } String GRO_MAIN = "/main/"; interface main { String MAIN = GRO_MAIN + "main"; } }
按类别来分,美观大方。
然后在MainActivity中来出发路由,如下
ARouter.getInstance().build("/activity/secondActivity").navigation();
好了,走到这里,基本的路由已经完成了。
这就完了?只是跳转并不能满足我们,我们还要路由带参数
我们先看下在发起者(此处是MainActivity)那里如何用
ARouter.getInstance(). build("/activity/secondActivity"). withString("name","小菜鸟"). navigation();
是的,就是这么简单,另外,ARouter提供了丰富的传参类型,必须多方位满足你。
看看,是不是很多,随便用吧!!
如何取值呢?上边SecondActivity的代码绿色部分已经体现出如何接收取值了。大致为:
a.为参数声明字段,并用@Autowired注解表示,
b.使用ARouter.getInstance().inject(this);方法来inject来初始化@Autowired注解的字段。
c.拿到值了,用就行。
路由结果:
有些时候我们要知道路由结果,比如是否到达,是否丢失,是否被拦截,贴心的ARouter也帮我们想到了
ARouter.getInstance().build("/activity/secondActivity").withString("name","王二蛋").navigation(this, new NavCallback() { @Override public void onArrival(Postcard postcard) { Toast.makeText(MainActivity.this,"已经跳到secondActivity",Toast.LENGTH_SHORT).show(); } });
源码是这样的
public abstract class NavCallback implements NavigationCallback { @Override public void onFound(Postcard postcard) { // Do nothing } @Override public void onLost(Postcard postcard) { // Do nothing } @Override public abstract void onArrival(Postcard postcard); @Override public void onInterrupt(Postcard postcard) { // Do nothing } }
实际用的时候重写用到的方法就行,我目前用onArrival(Postcard postcard);最多,比如在路由到主页面后关闭登录界面等。
ARouter管理服务之暴露服务
声明一个接口
public interface IService extends IProvider { void saySomething(Context context,String someword); }
实现接口
@Route(path = "/service/testsaySomething") public class MySerivce implements IService{ @Override public void saySomething(Context context,String someword) { Toast.makeText(context ,"hello", Toast.LENGTH_SHORT).show(); } @Override public void init(Context context) { } }
ARouter管理服务之发现服务
可以通过两种API来获取Service,分别是ByName、ByType
IService service = ARouter.getInstance().navigation(IService.class); IService service = (IService) ARouter.getInstance().build("/service/testsaySomething").navigation(); service.saySomething("我想说我饿了");
还可以这样的,在需要调用的class中声明,如同声明变量。
@Autowired(name = "/service/testsaySomething")
IService service;
然后初始化@Autowired
ARouter.getInstance().inject(this);
然后调用就ok了
service.saySomething(this,"我想说,我饿了");
说实话,我不是很明白这服务的作用,可能经验尚浅,没有碰到实际应用场景。但是隐约感觉到还是有用的,比如把一些功能写成服务,在其他地方随便调用。