zoukankan      html  css  js  c++  java
  • 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,"我想说,我饿了");

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

     

     

  • 相关阅读:
    240 Search a 2D Matrix II 搜索二维矩阵 II
    239 Sliding Window Maximum 滑动窗口最大值
    bzoj5029: 贴小广告&&bzoj5168: [HAOI2014]贴海报
    bzoj5178: [Jsoi2011]棒棒糖
    bzoj5293: [Bjoi2018]求和
    bzoj5194: [Usaco2018 Feb]Snow Boots
    bzoj2007: [Noi2010]海拔
    bzoj4956: [Wf2017]Secret Chamber at Mount Rushmore
    bzoj3296: [USACO2011 Open] Learning Languages
    bzoj4887: [Tjoi2017]可乐
  • 原文地址:https://www.cnblogs.com/qzdf/p/9008631.html
Copyright © 2011-2022 走看看