ARouter学习随笔

今天看了会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,"我想说,我饿了");

说实话,我不是很明白这服务的作用,可能经验尚浅,没有碰到实际应用场景。但是隐约感觉到还是有用的,比如把一些功能写成服务,在其他地方随便调用。

 

 

原文地址:https://www.cnblogs.com/qzdf/p/9008631.html