第二步:添加ARouter路由注解(可选)
**
-
在支持路由的页面上添加注解(必选)
-
注意:这里的路径需至少需要有两级,/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;
最后
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
上面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。
【Android思维脑图(技能树)】
知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。
【Android高级架构视频学习资源】
Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
ss RouteDemoActivity extends AppCompatActivity {
private TextView textView;
//为每一个参数声明一个字段,并使用@Autowired标注
@Autowired
String name;
最后
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
上面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。
【Android思维脑图(技能树)】
知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。
[外链图片转存中…(img-wC7zhGjJ-1714753589078)]
【Android高级架构视频学习资源】
Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!