使用阿里ARouter路由实现组件化(模块化)开发流程

R.drawable.tab_recommend,

R.drawable.tab_user

};

private String[] tab_array;

private DemandAdapter mDemandAdapter;

private ArrayList fragments = new ArrayList<>();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initData();

initView();

// 给viewpager设置适配器

setViewPagerAdapter();

setTabBindViewPager();

setItem();

}

private void initData() {

tab_array = getResources().getStringArray(R.array.tab_main);

fragments.clear();

fragments.add(FragmentUtils.getHomeFragment());

fragments.add(FragmentUtils.getChatFragment());

fragments.add(FragmentUtils.getRecomFragment());

fragments.add(FragmentUtils.getMeFragment());

}

private void initView() {

mMViewPager = (ViewPager) findViewById(R.id.mViewPager);

mToolbarTab = (TabLayout) findViewById(R.id.toolbar_tab);

}

private void setViewPagerAdapter() {

mDemandAdapter = new DemandAdapter(getSupportFragmentManager());

mMViewPager.setAdapter(mDemandAdapter);

}

private void setTabBindViewPager() {

mToolbarTab.setupWithViewPager(mMViewPager);

}

private void setItem() {

/**

  • 一定要在设置适配器之后设置Icon

*/

for (int i = 0; i < mToolbarTab.getTabCount(); i++) {

mToolbarTab.getTabAt(i).setCustomView(getTabView(i));

}

}

public View getTabView(int position) {

View view = LayoutInflater.from(this).inflate(R.layout.item_tab, null);

ImageView tab_image = view.findViewById(R.id.tab_image);

TextView tab_text = view.findViewById(R.id.tab_text);

tab_image.setImageResource(tabIcons[position]);

tab_text.setText(tab_array[position]);

return view;

}

/**

  • 适配器

*/

public class DemandAdapter extends FragmentStatePagerAdapter {

public DemandAdapter(FragmentManager fm) {

super(fm);

}

@Override

public Fragment getItem(int position) {

return fragments.get(position);

}

@Override

public int getCount() {

return fragments.size();

}

}

}

代码中有注释,切很简单,不会出现什么毛病!如果有小毛病,就clean一下解决

使用ARouter路由实现各种功能


  • 跨模块跳转Activity

实现这个Activity跳转的路径。

//跳转到我的模块登录页面

public static final String Me_Login = “/me/main/login”;

ARouter跳转Activity,在这个Activity上加入注解。

@Route(path = RouteUtils.Me_Login)

public class LoginActivity extends AppCompatActivity implements View.OnClickListener {

跳转逻辑是

//登录(跨模块跳转Activity)

ARouter.getInstance().build(RouteUtils.Me_Login).navigation();

  • 跨模块实现ForResult返回数据(activity中使用)

实现这个Activity跳转的路径。

//跳转ForResult

public static final String Chat_ForResult = “/chat/main/ForResult”;

ARouter跳转Activity,在这个Activity上加入注解。

@Route(path = RouteUtils.Chat_ForResult)

public class ForResultActivity extends AppCompatActivity implements View.OnClickListener {

跳转逻辑是

//跳转ForResult,在fragment中使用不起作用

ARouter.getInstance().build(RouteUtils.Chat_ForResult).navigation(this, 666);

接收数据数据

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

switch (requestCode) {

case 666:

String name = data.getStringExtra(“name”);

UIUtils.showToast(name + “,resultCode===>” + resultCode);

break;

default:

break;

}

}

返回数据

Intent intent = new Intent();

intent.putExtra(“name”, “ForResult返回的数据”);

setResult(999, intent);

finish();

  • 跳转并携带参数和Eventbus夸模块通信

EventBus.getDefault().register(this);

EventBus.getDefault().unregister(this);

@Subscriber(tag = EvenBusTag.GOTO_EVENTBUS)

public void onEvent(String s) {

UIUtils.showToast(s);

}

//跳转到eventBus数据接收页面

public static final String Me_EventBus = “/me/main/EventBus”;

@Route(path = RouteUtils.Me_EventBus)

public class EventBusActivity extends AppCompatActivity implements View.OnClickListener {

// 跳转并携带参数,基本涵盖所以类型传递,具体可以查看Postcard类

//传递过去的值使用getIntent()接收

//在fragment中无法使用ForResult进行夸模块传递数据

//在activity中可以(详细请看LoginActivity)这里的EventBusBean 已经实现了Parcelable接口

EventBusBean eventBusBean = new EventBusBean();

eventBusBean.setProject(“android”);

eventBusBean.setNum(3);

ARouter.getInstance().build(RouteUtils.Me_EventBus)

.withString(“name”, “haungxiaoguo”)

.withLong(“age”, 25)

.withParcelable(“eventbus”, eventBusBean)

.navigation();

@Route(path = RouteUtils.Me_EventBus)

public class EventBusActivity extends AppCompatActivity implements View.OnClickListener {

/**

  • eventBus数据接收页面

*/

private TextView mTextView;

/**

  • eventBus返回数据

*/

private Button mBtnBackData;

private String name;

private long age;

private EventBusBean eventbus;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_event_bus);

ARouter.getInstance().inject(this);

initData();

initView();

}

private void initData() {

name = getIntent().getStringExtra(“name”);

age = getIntent().getLongExtra(“age”, 0);

eventbus = getIntent().getParcelableExtra(“eventbus”);

}

private void initView() {

mTextView = (TextView) findViewById(R.id.textView);

mBtnBackData = (Button) findViewById(R.id.btn_back_data);

mBtnBackData.setOnClickListener(this);

mTextView.setText(“name=” + name + “,\tage=” + age + “,\tproject=” + eventbus.getProject() +

“,\tnum=” + eventbus.getNum());

}

@Override

public void onClick(View v) {

int i = v.getId();

if (i == R.id.btn_back_data) {

EventBus.getDefault().post(name, EvenBusTag.GOTO_EVENTBUS);

finish();

} else {

}

}

}

路径配置都是一样,以下只介绍跳转方式


  • 使用Uri应用内跳转

EventBusBean eventBusBean = new EventBusBean();

eventBusBean.setProject(“android”);

eventBusBean.setNum(3);

Uri testUriMix = Uri.parse(“arouter://tsou.cn.huangxiaoguo/me/main/EventBus”);

ARouter.getInstance().build(testUriMix)

.withString(“name”, “haungxiaoguo”)

.withLong(“age”, 25)

.withParcelable(“eventbus”, eventBusBean)

.navigation();

  • 旧版本转场动画

//旧版本转场动画

ARouter.getInstance()

.build(RouteUtils.Me_Test)

.withTransition(R.anim.slide_in_bottom, R.anim.slide_out_bottom)

.navigation(getContext());//context上下文不传无效果

  • 新版本转场动画

//新版本转场动画

if (Build.VERSION.SDK_INT >= 16) {

ActivityOptionsCompat compat = ActivityOptionsCompat.

makeScaleUpAnimation(v, v.getWidth() / 2, v.getHeight() / 2, 0, 0);

ARouter.getInstance()

.build(RouteUtils.Me_Test)

.withOptionsCompat(compat)

.navigation();

} else {

UIUtils.showToast(“API < 16,不支持新版本动画”);

}

  • 通过URL跳转(webview)

//通过URL跳转(webview)

ARouter.getInstance()

.build(RouteUtils.Me_WebView)

.withString(“url”, “file:///android_asset/schame-test.html”)

.navigation();

拦截器操作


首先实现IInterceptor:

这里写图片描述

package tsou.cn.lib_base.interceptor;

import android.content.Context;

import android.util.Log;

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.alibaba.android.arouter.launcher.ARouter;

import tsou.cn.lib_base.utils.RouteUtils;

/**

  • Created by Administrator on 2017/12/6 0006.

  • 添加拦截器的时候,建议clean再打包运行,不然会出现,无效的情况

  • 切记一个项目里面priority的值保证唯一,不然会出毛病

*/

@Interceptor(priority = 1, name = “重新分组进行拦截”)

public class MyDataInterceptor implements IInterceptor {

@Override

public void process(Postcard postcard, InterceptorCallback callback) {

if (postcard.getGroup().equals(“needLogin”)) {

Log.e(“huangxiaoguo”, “需要去登陆”);

//直接执行

// callback.onContinue(postcard);

//直接拦截,走onLost方法

// callback.onInterrupt(null);

//添加数据

// postcard.withString(“extra”, “我是在拦截器中附加的参数”);

// callback.onContinue(postcard);

callback.onInterrupt(null);

ARouter.getInstance().build(RouteUtils.Me_Login)

.withString(“path”, postcard.getPath()).navigation();

} else {

postcard.withString(“extra”, “我是在拦截器中附加的参数”);

callback.onContinue(postcard);

}

}

@Override

public void init(Context context) {

}

}

接收未拦截时拦截器添加的数据(postcard.withString(“extra”, “我是在拦截器中附加的参数”);)

private void initData() {

extra = getIntent().getStringExtra(“extra”);

}

对目标Activity指定新的分组(组名为“needLogin”,注意同时也是“me”组下的成员)

@Route(path = RouteUtils.Me_Test2, group = “needLogin”)

public class Test2Activity extends AppCompatActivity {

  • 拦截器操作(利用重新分组拦截)

/**

  • 如果利用重新分组,就需要在build中进行指定的分组不然没有效果

*/

ARouter.getInstance()

.build(RouteUtils.Me_Test2, “needLogin”)

.navigation(getContext(), new NavCallback() {

@Override

public void onFound(Postcard postcard) {

super.onFound(postcard);

//路由目标被发现时调用

Log.e(“huangxiaoguo”, “发现了”);

}

@Override

public void onLost(Postcard postcard) {

super.onLost(postcard);

//路由被丢失时调用

Log.e(“huangxiaoguo”, “丢失了”);

}

@Override

public void onArrival(Postcard postcard) {

//路由到达之后调用

Log.e(“huangxiaoguo”, “到达了”);

}

@Override

public void onInterrupt(Postcard postcard) {

super.onInterrupt(postcard);

//路由被拦截时调用

Log.e(“huangxiaoguo”, “拦截了”);

}

});

  • 拦截器操作(利用原有分组)

/**

  • 专门的分组,这里就叫做needLogin组,凡是在这个组下的,都会进行登录操作

*/

public static final String NeedLogin_Test3 = “/needLogin/main/Test3”;

@Route(path = RouteUtils.NeedLogin_Test3)

public class Test3Activity extends AppCompatActivity {

//拦截器操作(利用原有分组)

ARouter.getInstance().build(RouteUtils.NeedLogin_Test3).navigation();

  • 拦截器操作(绿色通道,跳过拦截器)

//拦截器操作(绿色通道,跳过拦截器)

ARouter.getInstance().build(RouteUtils.NeedLogin_Test3)

.withString(“extra”, “我是绿色通道直接过来的,不经过拦截器”)

.greenChannel()

.navigation();

  • 依赖注入

必须先初始化JsonServiceImpl实现SerializationService

这里写图片描述

package tsou.cn.lib_base.JsonService;

import android.content.Context;

import com.alibaba.android.arouter.facade.annotation.Route;

import com.alibaba.android.arouter.facade.service.SerializationService;

import com.alibaba.fastjson.JSON;

import java.lang.reflect.Type;

import tsou.cn.lib_base.utils.RouteUtils;

/**

  • 依赖注入使用,注意:必须实现SerializationService进行注册,

*/

@Route(path = RouteUtils.Home_Json_Service,name = “序列化JavaBean使用”)

public class JsonServiceImpl implements SerializationService {

@Override

public void init(Context context) {

}

@Override

public T json2Object(String text, Class clazz) {

return JSON.parseObject(text, clazz);

}

@Override

public String object2Json(Object instance) {

return JSON.toJSONString(instance);

}

@Override

public T parseObject(String input, Type clazz) {

return JSON.parseObject(input, clazz);

}

}

实现跳转

/**

  • 序列化过得

  • 必须先初始化JsonServiceImpl实现SerializationService

*/

EventBusBean eventBusBean = new EventBusBean();

eventBusBean.setProject(“android”);

eventBusBean.setNum(3);

/**

  • 普通的javaBean

*/

JavaBean javaBean = new JavaBean();

javaBean.setName(“huangxiaoguo”);

javaBean.setAge(25);

List objList = new ArrayList<>();

objList.add(javaBean);

Map<String, List> map = new HashMap<>();

map.put(“testMap”, objList);

ARouter.getInstance().build(RouteUtils.Me_Inject)

.withString(“name”, “老王”)

.withInt(“age”, 18)

.withBoolean(“boy”, true)

.withLong(“high”, 180)

.withString(“url”, “https://www.baidu.com”)

.withParcelable(“pac”, eventBusBean)

.withObject(“obj”, javaBean)

.withObject(“objList”, objList)

.withObject(“map”, map)

.navigation();

接收数据

package tsou.cn.module_me.activity;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.widget.TextView;

import com.alibaba.android.arouter.facade.annotation.Autowired;

import com.alibaba.android.arouter.facade.annotation.Route;

import com.alibaba.android.arouter.launcher.ARouter;

import java.util.List;

import java.util.Map;

import tsou.cn.lib_base.bean.EventBusBean;

import tsou.cn.lib_base.bean.JavaBean;

import tsou.cn.lib_base.utils.RouteUtils;

import tsou.cn.module_me.R;

/**

  • 依赖注入使用,注意:必须实现SerializationService进行注册,

*/

@Route(path = RouteUtils.Me_Inject)

public class InjectActivity extends AppCompatActivity {

@Autowired

String name = “hahahha”;

@Autowired

int age = 13;

@Autowired(name = “boy”)//映射参数名

boolean sex;

@Autowired

long high = 160;

@Autowired

String url;

@Autowired

EventBusBean pac;

@Autowired

JavaBean obj;

@Autowired

List objList;

@Autowired

Map<String, List> map;

@Autowired

int height = 21;//上页面没有传递

private TextView mTextView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_inject);

ARouter.getInstance().inject(this);

initView();

}

private void initView() {

mTextView = (TextView) findViewById(R.id.textView);

String params = String.format(

“name=%s,\n age=%s, \n height=%s,\n girl=%s,\n high=%s,\n url=%s,\n pac=%s,\n obj=%s \n” +

" objList=%s, \n map=%s",

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

总结

现在新技术层出不穷,如果每次出新的技术,我们都深入的研究的话,很容易分散精力。新的技术可能很久之后我们才会在工作中用得上,当学的新技术无法学以致用,很容易被我们遗忘,到最后真的需要使用的时候,又要从头来过(虽然上手会更快)。

我觉得身为技术人,针对新技术应该是持拥抱态度的,入了这一行你就应该知道这是一个活到老学到老的行业,所以面对新技术,不要抵触,拥抱变化就好了。

Flutter 明显是一种全新的技术,而对于这个新技术在发布之初,花一个月的时间学习它,成本确实过高。但是周末花一天时间体验一下它的开发流程,了解一下它的优缺点、能干什么或者不能干什么。这个时间,并不是我们不能接受的。

如果有时间,其实通读一遍 Flutter 的文档,是最全面的一次对 Flutter 的了解过程。但是如果我们只有 8 小时的时间,我希望能关注一些最值得关注的点。

Android学习PDF+架构视频+面试文档+源码笔记

(跨平台开发(Flutter)、java基础与原理,自定义view、NDK、架构设计、性能优化、完整商业项目开发等)

id.textView);

String params = String.format(

“name=%s,\n age=%s, \n height=%s,\n girl=%s,\n high=%s,\n url=%s,\n pac=%s,\n obj=%s \n” +

" objList=%s, \n map=%s",

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-rHL1zU25-1710896534383)]
[外链图片转存中…(img-16cUlTZD-1710896534384)]
[外链图片转存中…(img-HmJsGqOn-1710896534384)]
[外链图片转存中…(img-CP0Crjoq-1710896534384)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-dv7CLWi9-1710896534385)]

总结

现在新技术层出不穷,如果每次出新的技术,我们都深入的研究的话,很容易分散精力。新的技术可能很久之后我们才会在工作中用得上,当学的新技术无法学以致用,很容易被我们遗忘,到最后真的需要使用的时候,又要从头来过(虽然上手会更快)。

我觉得身为技术人,针对新技术应该是持拥抱态度的,入了这一行你就应该知道这是一个活到老学到老的行业,所以面对新技术,不要抵触,拥抱变化就好了。

Flutter 明显是一种全新的技术,而对于这个新技术在发布之初,花一个月的时间学习它,成本确实过高。但是周末花一天时间体验一下它的开发流程,了解一下它的优缺点、能干什么或者不能干什么。这个时间,并不是我们不能接受的。

如果有时间,其实通读一遍 Flutter 的文档,是最全面的一次对 Flutter 的了解过程。但是如果我们只有 8 小时的时间,我希望能关注一些最值得关注的点。

Android学习PDF+架构视频+面试文档+源码笔记

(跨平台开发(Flutter)、java基础与原理,自定义view、NDK、架构设计、性能优化、完整商业项目开发等)

[外链图片转存中…(img-qwRhgFIF-1710896534385)]

  • 16
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值