浅谈android组件化之ARouter简单使用

ARouter是阿里巴巴开源出来的一款android路由框架,github地址为 : https://github.com/alibaba/ARouter

至于ARouter的诸多好处我就不介绍了,这里主要讲解在项目组件化下,ARouter的一些简单使用

先贴上工程目录:

工程一共分为4个模块,基础组件app、基础服务(包涵路由服务)basecommonlibrary模块、业务模块libraryone、业务模块librarytwo;

在4个模块的gradle文件当中加入如下代码:

android {
  ...
  defaultConfig {
    ...
    javaCompileOptions {
      annotationProcessorOptions {
        arguments = [moduleName: project.getName()]
      }
    }
  }
} 

dependencies {
  ...
  compile 'com.alibaba:arouter-api:1.2.1'
  annotationProcessor 'com.alibaba:arouter-compiler:1.1.2'
} 

依赖包的具体版本可自行选择。

接下来就是具体讲解ARouter如何在这几个模块中充当路由的角色了。

首先是app模块中定义的一个页面,布局很简单,就不贴代码了,效果如下;

Activity 部分代码如下:

@Override
public void onClick(View v) {
  switch (v.getId()) {
    case R.id.bt1:
      RouterCommonUtil.startMainTextActivity(this, "测试文本");
      break;
    case R.id.bt2:
      RouterCommonUtil.startMainImageActivity(this, "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1492584424522&di=5dcde77431914e0b944b8af9ff5f9277&imgtype=jpg&src=http%3A%2F%2Fimg3.imgtn.bdimg.com%2Fit%2Fu%3D1489971249%2C1618541505%26fm%3D214%26gp%3D0.jpg");
      break;
    case R.id.bt3:
      RouterCommonUtil.startLibraryOneActivity(this);
      break;
    case R.id.bt4:
      RouterCommonUtil.startLibraryTwoActivity(this);
      break;
  }
} 

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (resultCode == 1002) {
    Toast.makeText(this, data.getStringExtra("arg2"), Toast.LENGTH_SHORT).show();
  }
}

点击事件分别响应到本module(app)中的两个activity以及libraryone和librarytwo中的activity,其中第一个用来测试ForResult方式启动的Acitivty。

接下来是libraryone中Activity布局截图:

activity部分代码如下:

@Override
public void onClick(View v) {
  int i = v.getId();
  if (i == R.id.bt1) {
    RouterCommonUtil.startMainActivity(this); 

  } else if (i == R.id.bt2) {
    RouterCommonUtil.startLibraryTwoActivity(this);
  }
} 

也是测试了两个跳转,分别跳转到主Module中的Activity中和libraryTwo的Activity中,libraryTwo中的布局和代码跟libraryone中大同小异,这里就不继续贴出了,本项目会在附件中提供源码,欢迎下载。这里还需要贴出封装在basecommonlibrary模块中的公共跳转类,所有的module,都是通过该模块中的路由公共类来实现跳转的,完整代码如下:

import android.app.Activity;
import android.text.TextUtils;
import android.widget.Toast; 

import com.alibaba.android.arouter.facade.Postcard;
import com.alibaba.android.arouter.launcher.ARouter;
import com.example.basecommonlibrary.router.IInterceptor.InterruptCallback; 

import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1; 

/**
 * @author: xiewenliang
 * @Filename:
 * @Description:
 * @date: 2017/4/25 15:06
 */ 

public class RouterCommonUtil { 

  private static void toastInterruptInfo(final Activity activity, final Postcard postcard) {
    if (postcard.getTag() != null && postcard.getTag() instanceof String) {
      Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
          subscriber.onNext((String) postcard.getTag());
        }
      }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<String>() {
        @Override
        public void call(String s) {
          if (!TextUtils.isEmpty(s) && activity != null) {
            Toast.makeText(activity, (String) postcard.getTag(), Toast.LENGTH_SHORT).show();
          }
        }
      });
    }
  } 

  public static void startMainActivity(final Activity activity) {
    ARouter.getInstance().build("/ui/主页").navigation(activity, new InterruptCallback() {
      @Override
      public void onInterrupt(Postcard postcard) {
        toastInterruptInfo(activity, postcard);
      }
    });
  } 

  public static void startMainTextActivity(final Activity activity, String value) {
    ARouter.getInstance().build("/ui/text", "文本").withString("arg1", value).navigation(activity, 1001, new InterruptCallback() {
      @Override
      public void onInterrupt(Postcard postcard) {
        toastInterruptInfo(activity, postcard);
      }
    });
  } 

  public static void startMainImageActivity(final Activity activity, String value) {
    ARouter.getInstance().build("/ui/image", "图片").withString("arg1", value).navigation(activity, new InterruptCallback() {
      @Override
      public void onInterrupt(Postcard postcard) {
        toastInterruptInfo(activity, postcard);
      }
    });
  } 

  public static void startLibraryOneActivity(final Activity activity) {
    ARouter.getInstance().build("/libraryOne/主页").navigation(activity, new InterruptCallback() {
      @Override
      public void onInterrupt(Postcard postcard) {
        toastInterruptInfo(activity, postcard);
      }
    });
  } 

  public static void startLibraryTwoActivity(final Activity activity) {
    ARouter.getInstance().build("/libraryTwo/主页").navigation(activity, new InterruptCallback() {
      @Override
      public void onInterrupt(Postcard postcard) {
        toastInterruptInfo(activity, postcard);
      }
    });
  }
}

该类中主要提供了几个类的跳转方法,以及跳转失败后的信息打印方法,接下来就是测试跳转是否能够正常执行了,请大家自行构建代码或者下载本demo源码查看执行效果。

接下来讲解拦截器,以libraryone中的activity为例

@Route(path = "/libraryOne/主页", extras = CommonStation.CHECK_LOADING) 

我们在activity上添加如上注解,其中extras的值可以作为判断的类型,具体看拦截器代码

import android.content.Context; 

import com.alibaba.android.arouter.facade.Postcard;
import com.alibaba.android.arouter.facade.annotation.Interceptor;
import com.alibaba.android.arouter.facade.callback.InterceptorCallback;
import com.alibaba.android.arouter.facade.template.IInterceptor;
import com.example.basecommonlibrary.CommonStation; 

/**
 * @author: xiewenliang
 * @Filename:
 * @Description:
 * @date: 2017/4/25 15:37
 */
@Interceptor(priority = 1, name = "拦截未登录")
public class TestOneIInterceptor implements IInterceptor {
  @Override
  public void process(Postcard postcard, InterceptorCallback callback) {
    if (postcard.getExtra() == CommonStation.CHECK_LOADING && !CommonStation.checkLoading()) {
      callback.onInterrupt(new RuntimeException("账号未登录"));
    } else {
      callback.onContinue(postcard);
    }
  } 

  @Override
  public void init(Context context) { 

  }
}

在拦截器中,可以根据extra属性判断是否是需要拦截的类型,如果需要拦截,则执行callback的onInterrupt方法,并注明拦截原因,可以在路由跳转中提取拦截原因信息并打印。

当然ARouter中其它功能就不再一一介绍了,大家可以自行研究,附源码下载地址:ARouterDemo_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Android业务组件化之URL Schema使用

    前言: 最近公司业务发展迅速,单一的项目工程不再适合公司发展需要,所以开始推进公司APP业务组件化,很荣幸自己能够牵头做这件事,经过研究实现组件化的通信方案通过URL Schema,所以想着现在还是在预研阶段,很有必要先了解一下URL Schema,看看是如何使用的?其实在之前做Hybrid混合编程的时候就接触过URL Schema,总来的来说还不算陌生,今天就来回顾总结一下. 什么是 URL Schema?  android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义

  • 浅谈android组件化之ARouter简单使用

    ARouter是阿里巴巴开源出来的一款android路由框架,github地址为 : https://github.com/alibaba/ARouter 至于ARouter的诸多好处我就不介绍了,这里主要讲解在项目组件化下,ARouter的一些简单使用 先贴上工程目录: 工程一共分为4个模块,基础组件app.基础服务(包涵路由服务)basecommonlibrary模块.业务模块libraryone.业务模块librarytwo; 在4个模块的gradle文件当中加入如下代码: android

  • 浅谈Android插件化

    目录 一.认识插件化 1.1 插件化起源 1.2 插件化优点 1.3 与组件化的区别 二.插件化的技术难点 三.ClassLoader Injection 3.1 java 中的 ClassLoader 3.2 android 中的 ClassLoader 3.3 双亲委派机制 3.4 如何加载插件中的类 3.5 执行插件类的方法 四.Runtime Container 4.1 为什么没有注册的 Activity 不能和系统交互 4.2 运行时容器技术 4.3 字节码替换 五.Resource

  • 浅谈Android单元测试的作用以及简单示例

    前提概要 受人嫌弃的单元测试 对于单元测试这个知识点,其实很多开发者是不太接触的,包括笔者,在实习之前也并未实用过单元测试,或者说并没感受到单元测试的好处. 对于bug的调试,笔者之前更倾向于使用log和断点调试,可以说会了这两个,大部分的逻辑bug都能自己解决了.这两个与看似臃肿的单元测试代码相比更受大家的喜爱. 但是,使用log和断点调试的前提是开发人员较少,甚至是单人开发的情况.如果我自己开发,我完全可以每次都使用集成测试,我知道每一个功能会涉及哪些模块的代码,然后根据逻辑设置log或者断

  • 浅谈Android中Service的注册方式及使用

    Service通常总是称之为"后台服务",其中"后台"一词是相对于前台而言的,具体是指其本身的运行并不依赖于用户可视的UI界面,因此,从实际业务需求上来理解,Service的适用场景应该具备以下条件: 1.并不依赖于用户可视的UI界面(当然,这一条其实也不是绝对的,如前台Service就是与Notification界面结合使用的): 2.具有较长时间的运行特性. 1.Service AndroidManifest.xml 声明 一般而言,从Service的启动方式上

  • 浅谈Android Studio导出javadoc文档操作及问题的解决

    1.在Android studio中进行打开一个项目的文件之后,然后进行点击Android stuio中菜单中的"tools"的选项.在弹出了下拉菜单中,进行选中下拉菜单中的"Generate JavaDoc"的选项. 2.在弹出界面中 Output directory是你即将生产的javadoc文件的存储位置,图中1指示的位置:正常点击ok即可: 但是如果有异常情况 比如空指针异常或者文档乱码 java.lang.NullPointerException 或者 j

  • 浅谈android @id和@+id的区别

    今天,简单讲讲android里关于@id和@+id的区别. 之前,自己在布局里无论什么情况都使用@+id,可是后来发现有些代码用的是@id,自己不知道这两者之间有什么区别.于是就在网上查找资料,最终是解决了问题.这里记录一下. Android中的组件需要用一个int类型的值来表示,这个值也就是组件标签中的id属性值.id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc.@+id/xyz等. 如果在@后面使用"+",表示当修改完某个布局文件并保存后,系统会自动在R.

  • 浅谈Android手机的抢红包插件

    前语 最近,Android手机上的手机管家更新了新版本,提供了红包闹钟功能,只要有微信红包或者QQ红包,就会自动提醒.恰逢最近又在做UI自动化的工作,使用到UI Automator框架.几行代码,就可以让手机自动完成某些操作,很有意思,今天就来扒一扒这背后的原理. UI Automator 传统的手工测试,我们需要点击一些控件元素,来查看输出的结果是否符合预期.比如在登录界面,输入正确的用户名和密码,点击登录按钮后,就可以正常登录. 如果这些操作,每一次都需要手工执行的话,是需要大量的人力成本的

  • 浅谈Android安全风险与防范措施

    做好的apk文件,被检测工具检测出一大堆风险问题,是不是感觉自己的付出白费了,今天咱就聊聊android的安全防范问题. 一,先说安全检查方面的吧 1,源文件安全问题方面 1.1篡改和二次打包风险 1.2应用签名未校验风险 1.3Java代码反编译风险检测 1.4代码未混淆风险检测 1.5资源文件泄露风险检测 2,数据存储安全问题方面 2.1 WebView明文存储密码风险检测 2.2Internal Storage数据全局可读写风险检测 3.3加密算法不安全使用风险 4.4日志数据泄露风险 4

  • 浅谈Android Activity与Service的交互方式

    实现更新下载进度的功能 1. 通过广播交互 Server端将目前的下载进度,通过广播的方式发送出来,Client端注册此广播的监听器,当获取到该广播后,将广播中当前的下载进度解析出来并更新到界面上. 优缺点分析: 通过广播的方式实现Activity与Service的交互操作简单且容易实现,可以胜任简单级的应用.但缺点也十分明显,发送广播受到系统制约.系统会优先发送系统级广播,在某些特定的情况下,我们自定义的广播可能会延迟.同时在广播接收器中不能处理长耗时操作,否则系统会出现ANR即应用程序无响应

  • 浅谈Android Studio 3.0 工具新特性的使用 Android Profiler 、Device File Explorer

    前言: 其实 studio3.0的工具大家也已经使用过一段时间了,自己呢,就是从bate版开始使用的,我觉得比较好用的几个地方.就几个,可能还没用到其他的精髓. 但我觉的这个两个功能对我是比较实用的.好那么下面就给大家介绍一下吧. 正文: 话不多说咱们直接上图吧.(个人比较喜欢看图说话) 第一个(Android Profiler)我要介绍的就是这个了.(先看一下效果"震撼一下") (图-1) (图-2) (图-3) (厉害不厉害,牛逼不牛逼)那么我们怎么来操作这个工具呢,来咱们接着看图

随机推荐