Android的路由框架用法,可能是全网最细的Android-资源加载机制剖析

@Override

public void onLost(Postcard postcard) {

Log.e(“监听路由过程”, “onArrival: 找不到路由”);

}

@Override

public void onArrival(Postcard postcard) {

Log.e(“监听路由过程”, “onArrival: 路由跳转完成”);

}

@Override

public void onInterrupt(Postcard postcard) {

Log.e(“监听路由过程”, “onArrival: 路由被拦截了”);

}

});

七、发起路由并且传递参数

// 跳转并携带参数

ARouter.getInstance().build(“/test/RouteActivity”)

.withLong(“id”, 1)

.withString(“name”, “张三”)

.withObject(“obj”, this)

.navigation();

ARouter 提供了大量的参数类型,如下所示:

//基础类型

.withString( String key, String value )

.withBoolean( String key, boolean value)

.withChar( String key, char value )

.withShort( String key, short value)

.withInt( String key, int value)

.withLong( String key, long value)

.withDouble( String key, double value)

.withByte( String key, byte value)

.withFloat( String key, float value)

.withCharSequence( String key, CharSequence value)

//数组类型

.withParcelableArrayList( String key, ArrayList<? extends Parcelable > value)

.withStringArrayList( String key, ArrayList value)

.withIntegerArrayList( String key, ArrayList value)

.withSparseParcelableArray( String key, SparseArray<? extends Parcelable> value)

.withCharSequenceArrayList( String key, ArrayList value)

.withShortArray( String key, short[] value)

.withCharArray( String key, char[] value)

.withFloatArray( String key, float[] value)

.withCharSequenceArray( String key, CharSequence[] value)

//Bundle 类型

.with( Bundle bundle )

//Activity 跳转动画

.withTransition(int enterAnim, int exitAnim)

//其他类型

.withParcelable( String key, Parcelable value)

.withParcelableArray( String key, Parcelable[] value)

.withSerializable( String key, Serializable value)

.withByteArray( String key, byte[] value)

.withTransition(int enterAnim, int exitAnim)

八、路由分组

什么是路由分组?

ARouter框架是分组管理,按需加载。在编译期框架扫描了所有的注册页面/服务/字段/拦截器等,那么很明显运行期不可能一股脑全部加载进来,这样就太不和谐了。所以就分组来管理,ARouter在初始化的时候只会一次性地加载所有的root结点,而不会加载任何一个Group结点,这样就会极大地降低初始化时加载结点的数量。比如某些Activity分成一组,组名就叫demo,然后在第一次需要加载组内的某个页面时再将demo这个组加载进来。

@Route(path = “/test/RouteActivity”)

上面这行代码,就是我们前面添加的路由注释,最前面的demo就是路由分组。我们还可以在监控路由过程里,获取所在的分组,代码如下:

ARouter.getInstance().build(“/test/RouteActivity”).navigation(this, new NavCallback() {

@Override

public void onArrival(Postcard postcard) {

String group = postcard.getGroup();

Log.e(“监听路由过程”, "当前路由分组是: " + group);

}

});

运行结果如下:

九、自定义路由分组

1、在原来的注解上添加group字段

**

  • 添加路由和分组

*/

@Route(path = “/test/RouteActivity”, group = “testGroup”)

public class RouteDemoActivity extends AppCompatActivity {

//省略这里的代码…

}

2、发起路由时,第二个参数填写路由的分组

build(String path, String group)

具体示例代码如下:

// 应用内简单的跳转(通过URL跳转在’进阶用法’中)

ARouter.getInstance().build(“/test/RouteActivity”,“testGroup”).navigation();

3、添加自定义分组后,运行结果如下:

十、Fragment路由

创建 Fragment 类,并且添加路由注解,如下:

/**

  • 添加Fragment碎片路由

*/

@Route(path = “/test/ModuleFragment”)

public class ModuleCFragment extends Fragment {

//省略这里的代码…

}

然后我们可以通过路由,获取Fragment实例:

//通过路由,获取Fragment实例

Fragment moduleFragment = (Fragment) ARouter.getInstance().build( “/test/ModuleFragment” ).navigation();

十一、android和html交互:通过URL跳转(进阶用法)

先来看一下web的URL链接跳转流程图:

1、创建一个URL中间跳转页,可以在公共common组件里创建一个URLReceiveActivity活动,具体代码如下:

/**

  • URL中间跳转页

  • 原理:新建一个Activity用于监听Scheme事件,之后直接把url传递给ARouter即可

*/

public class URLReceiveActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_urlreceive);

//对URI数据进行分发

Uri uri = getIntent().getData();

ARouter.getInstance().build(uri).navigation();

finish();

}

}

2、URLReceiveActivity需要在AndroidManifest.xml清单文件里,添加如下注册:

<data

android:host=“m.zy13.net”

android:scheme=“arouter” />

注意:这里面的 host 、scheme 字段很重要。点击 url 会根据这两个字段调起本地的Activity 。

3、将android studio目录模式切换至Project,然后在main目录下创建一个assets目录:

4、在 assets目录下创建一个demo.html文件,编写如下HTML代码:

<!doctype html>

1、URL普通跳转

URL普通跳转

2、URL普通跳转携带参数

URL普通跳转携带参数

注明: a标签里面的arouter://m.zy13.net分别代表着scheme和host,/demo/RouteActivity就是目标Activity的注解。

5、在需要与html交互的活动页面xml布局里,添加WebView控件:

<WebView

android:id=“@+id/webview”

android:layout_marginTop=“50dp”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

/>

6、然后在Activity活动的onCreate()里加载html页面,如下:

private WebView contentWebView = null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

// 从assets目录加载html文件

contentWebView = (WebView) findViewById(R.id.webview);

contentWebView.loadUrl(“file:///android_asset/demo.html”);

}

在实际开发中,通常是直接调用网址链接与html进行交互的,这里为了简化,我们直接加载了html文件,效果如下:

7、如果需要接收 UR 中的参数,需要在Activity中调用自动注入初始化的方法,代码如下:

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Button;

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;

/**

  • 在支持路由的页面上添加注解(必选)

  • 注意:这里的路径需至少需要有两级,/xx/xx

*/

@Route(path = “/test/RouteActivity”)

public class RouteDemoActivity extends AppCompatActivity {

private TextView textView;

//为每一个参数声明一个字段,并使用@Autowired标注

@Autowired

String name;

// 通过name来映射URL中的不同参数

@Autowired(name = “age”)

int age;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//自动注入初始化,ARouter会自动对字段进行赋值,无需主动获取

ARouter.getInstance().inject(this);

setContentView(R.layout.activity_route_demo);

//文本

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

textView.setText("URL参数是: " + "name: " + name + " age: " + age);

}

}

8、如果不使用自动注入,那么可以不写ARouter.getInstance().inject(this),但是需要取值的字段仍然需要标上 @Autowired 注解,因为 只有标上@Autowired注解之后,ARouter才能知道以哪一种数据类型提取URL中的参数并放入Intent中,这样才能在intent中获取到对应的参数,具体的代码如下:

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Button;

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;

/**

  • 在支持路由的页面上添加注解(必选)

  • 注意:这里的路径需至少需要有两级,/xx/xx

*/

@Route(path = “/test/RouteActivity”)

public class RouteDemoActivity extends AppCompatActivity {

private TextView textView;

//为每一个参数声明一个字段,并使用@Autowired标注

@Autowired

String name;

// 通过name来映射URL中的不同参数

@Autowired(name = “age”)

int age;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_route_demo);

//文本

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

/**

  • 解析URL参数,手动获取

*/

Bundle bundle = getIntent().getExtras();

name = bundle.getString(“name”);

age = bundle.getInt(“age”);

textView.setText("URL参数是: " + "name: " + name + " age: " + age);

}

}

获取URL参数效果如下:

十二、对外暴露接口服务

这里所指的服务不是Android四大组件中的Service,而是接口开发的概念,就是将一部分功能和组件封装起来成为接口,以接口的形式对外提供能力,我们可以将需要对外提供的功能作为一个服务,而服务的实现就是具体的业务功能。

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

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后

有任何问题,欢迎广大网友一起来交流,分享高阶Android学习视频资料和面试资料包~

偷偷说一句:群里高手如云,欢迎大家加群和大佬们一起交流讨论啊!

望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
[外链图片转存中…(img-SgpSae0A-1711922687497)]
[外链图片转存中…(img-QqDdDduZ-1711922687497)]
[外链图片转存中…(img-fOW1SzMp-1711922687498)]
[外链图片转存中…(img-YRqtjvH6-1711922687498)]
[外链图片转存中…(img-UyvoW2n6-1711922687499)]
[外链图片转存中…(img-kLGvcb28-1711922687499)]
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-Ji1tUcJe-1711922687499)]

最后

有任何问题,欢迎广大网友一起来交流,分享高阶Android学习视频资料和面试资料包~

偷偷说一句:群里高手如云,欢迎大家加群和大佬们一起交流讨论啊!

[外链图片转存中…(img-kVUbKmd8-1711922687500)]

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值