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工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

img

img

img

img

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

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

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

**一个零基础的新人,我认为坚持是最最重要的。**我的很多朋友都找我来学习过,我也很用心的教他们,可是不到一个月就坚持不下来了。我认为他们坚持不下来有两点主要原因:

他们打算入行不是因为兴趣,而是因为所谓的IT行业工资高,或者说完全对未来没有任何规划。

刚开始学的时候确实很枯燥,这确实对你是个考验,所以说坚持下来也很不容易,但是如果你有兴趣就不会认为这是累,不会认为这很枯燥,总之还是贵在坚持。

技术提升遇到瓶颈了?缺高级Android进阶视频学习提升自己吗?还有大量大厂面试题为你面试做准备!

提升自己去挑战一下BAT面试难关吧

对于很多Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些知识图谱希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

不论遇到什么困难,都不应该成为我们放弃的理由!

如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!

最后祝各位新人都能坚持下来,学有所成。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!**

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

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

**一个零基础的新人,我认为坚持是最最重要的。**我的很多朋友都找我来学习过,我也很用心的教他们,可是不到一个月就坚持不下来了。我认为他们坚持不下来有两点主要原因:

他们打算入行不是因为兴趣,而是因为所谓的IT行业工资高,或者说完全对未来没有任何规划。

刚开始学的时候确实很枯燥,这确实对你是个考验,所以说坚持下来也很不容易,但是如果你有兴趣就不会认为这是累,不会认为这很枯燥,总之还是贵在坚持。

技术提升遇到瓶颈了?缺高级Android进阶视频学习提升自己吗?还有大量大厂面试题为你面试做准备!

提升自己去挑战一下BAT面试难关吧

[外链图片转存中…(img-yRoNFZUG-1711796242868)]

对于很多Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些知识图谱希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

不论遇到什么困难,都不应该成为我们放弃的理由!

如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!

最后祝各位新人都能坚持下来,学有所成。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值