Android的路由框架用法

**

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

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

*/

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

public class RouteDemoActivity extends AppCompatActivity {

//省略这里的代码…

}

上面的代码就是在目标Activity类上面声明Route path 注解,以此对应,跳转如果不对应路径,框架会Toast说路径不匹配。

第三步:ARouter初始化

方建议我们在Application里面进行ARouter初始化,因此需要创建一个自定义的Application,看下面的步骤:

1、在Activity同级包里,创建一个新的类RouteApplication.java继承Application,代码如下:

import android.app.Application;

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

/**

  • @author 安阳 QQ:15577969

  • @version 1.0

  • @team 美奇软件开发工作室

  • @date 2020/11/14 14:56

*/

public class RouteApplication extends Application {

//ARouter调用开关

private boolean isDebugARouter=true;

@Override

public void onCreate() {

super.onCreate();

if (isDebugARouter) {

// 打印日志

ARouter.openLog();

// 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)

ARouter.openDebug();

}

ARouter.init(this);

}

}

2、在AndroidManifest.xml清单配置文件,中加入android:name=“RouteApplication”

<application

android:name=“RouteApplication”

android:allowBackup=“true”

android:icon=“@mipmap/ic_launcher”

android:label=“@string/app_name”

android:roundIcon=“@mipmap/ic_launcher_round”

android:supportsRtl=“true”

android:theme=“@style/AppTheme”>

第四步:发起路由操作

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

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

六、监听路由过程

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

@Override

public void onFound(Postcard postcard) {

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

}

@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参数,手动获取

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

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

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

img

img

img

img

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

如果你觉得这些内容对你有帮助,可以扫码领取!!!!

面试复习笔记:

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《960页Android开发笔记》

《1307页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可免费领取!

外链图片转存中…(img-g0wfhoTB-1711235879166)]

[外链图片转存中…(img-kFhEVNoz-1711235879166)]

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

如果你觉得这些内容对你有帮助,可以扫码领取!!!!

面试复习笔记:

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《960页Android开发笔记》

[外链图片转存中…(img-g4VhauXx-1711235879166)]

《1307页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

[外链图片转存中…(img-1FsnuhcL-1711235879166)]

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可免费领取!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值