Android跳转-ARouter详细使⽤教程⼀、简介
Android平台中对页⾯、服务提供路由功能(跳转)的⼀个库
1.1 最新版本
模块 arouter-api arouter-compiler arouter-annotation
最新版本
1.2 实例图⽚
1.3 功能介绍
⽀持直接解析标准URL进⾏跳转,并⾃动注⼊参数到⽬标页⾯中
⽀持多模块⼯程使⽤
⽀持添加多个,⾃定义拦截顺序
⽀持依赖注⼊,可单独作为依赖注⼊框架使⽤
⽀持InstantRun
⽀持MultiDex(Google⽅案)
映射关系按组分类、多级管理,按需初始化
⽀持⽤户指定全局降级与局部降级策略
页⾯、、服务等组件均⾃动注册到框架
⽀持多种⽅式配置转场动画
⽀持获取Fragment
完全⽀持Kotlin以及混编(配置见⽂末 其他#5)
1.4 应⽤场景
从外部URL映射到内部页⾯,以及参数传递与解析
跨模块页⾯跳转,模块间解耦
拦截跳转过程,处理登陆、埋点等逻辑
跨模块API调⽤,通过控制反转来做组件解耦
⼆、使⽤⽅法
1.1 导包
导包现在分java和kotlin, java的导包⽅法如下,在根moduel的adle添加如下内容:
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : Name() ]
}
}
}
}
dependencies {
// 替换成最新版本, 需要注意的是api,最新版本看⽂章开头android最新版
// 要与compiler匹配使⽤,均使⽤最新版可以保证兼容
compile 'com.alibaba:'
annotationProcessor 'com.alibaba:'
...
}
如果java使⽤的是apt,导⼊⽅法则是如下:
apply plugin: 'bedankt.android-apt'
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'adle.plugins:android-apt:1.8'
}
}
apt {
arguments {
Name();
}
}
dependencies {
//这⾥填写最新的版本看⽂章开始
compile 'com.alibaba:'
apt 'com.alibaba:'
...
}
kotlin的导包⽅法如下,在根moduel的adle添加如下内容:
apply plugin: 'kotlin-kapt'
kapt {
arguments {
arg("moduleName", Name())
}
}
dependencies {
//这⾥填写最新的版本,看⽂章开始
compile 'com.alibaba:'
kapt 'com.alibaba:'
...
}
1.2 初始化
解析在代码中
class BaseApplication :Application(){
override fun onCreate() {
if(BuildConfig.DEBUG){ //如果在debug模式下
// 打印⽇志,默认关闭
ARouter.openLog()
// 开启调试模式,默认关闭(如果在InstantRun模式下运⾏,必须开启调试模式!线上版本需要关闭,否则有安全风险) ARouter.openDebug()
// 打印⽇志的时候打印线程堆栈
ARouter.printStackTrace()
}
// 尽可能早,推荐在Application中初始化
ARouter.init(this)
}
}
1.3 普通的Activity跳转
⽅法⼜有Uri和path两种
利⽤ARouter的path⽅法:
例如我要在 AActivity跳转到BActivity,这时候AActivity的代码是这样⼦的(记得编写manifest):
override fun onCreate(savedInstanceState: Bundle?) {
setContentView(R.layout.activity_main)
textView = findViewById(View) as TextView
textView!!.setOnClickListener {
.build("/path/bactivity")
.navigation()
}
}
然后BActivity的代码是这样⼦的(记得编写manifest):
@Route(path = "/path/bactivity")
class BActivity :AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
}
}
可以看到,跳转是利⽤build⽅法⾥⾯的⼀个字符串进⾏标识,然后调⽤navigation进⾏跳转到 注解@Route标记的字符串路径。利⽤Uri⽅法:
例如上⾯的AActivity⾥⾯的跳转⽅法改为:
override fun onCreate(savedInstanceState: Bundle?) {
setContentView(R.layout.activity_main)
textView = findViewById(View) as TextView
textView!!.setOnClickListener {
val uri = Uri.parse("/path/bactivity")
.build(uri)
.navigation()
}
}
然后BActivity保持不变,效果是⼀样的。
PS: Uri.parse的时候,改为完整路径也是⽀持的,例如改为val uri = Uri.parse(“tpnet://m.aliyun/path/bactivity”),也可以成功跳转到BActivity
1.4 普通的Activity跳转参数
调⽤with对应的类型即可,
//第⼀个参数为key,第⼆个参数为值
.withLong("longKey", 0x555555L)
.withString("stringKey", "66666")
.navigation()
在接收的activity解析的时候,获取到extras,get对应的类型即可:
val extrsa = as
Long("longKey"))
String("stringKey"))
1.5普通的Activity跳转动画
添加跳转动画有两种⽅法,⼀个是兼容,⼀个是只能⼤于等于sdk16才能⽤。
兼容⽅法:
使⽤withTransition⽅法,添加 进⼊动画,退出动画即可
.build("/path/bactivity")
//参数1为打开的Activity的进⼊动画,参数2为当前的Activity的退出动画
.withTransition(R.anim.slide_in_bottom, R.anim.slide_out_bottom)
.navigation(this);
sdk⼤于等于16的动画⽅法:
利⽤withOptionsCompat添加ActivityOptionsCompat对象,
if (Build.VERSION.SDK_INT >= 16) {
ActivityOptionsCompat compat = ActivityOptionsCompat.
makeScaleUpAnimation(v, v.getWidth() / 2, v.getHeight() / 2, 0, 0);
.build("/path/bactivity")
.withOptionsCompat(compat)
.navigation();
} else {
Toast.makeText(this, "API < 16,不⽀持新版本动画", Toast.LENGTH_SHORT).show();
}
PS: akeSceneTransitionAnimation 使⽤共享元素的时候,需要在navigation⽅法中传⼊当前Activity
三、 Url跳转
Url跳转就是可以根据url来跳转,可以从⽹页跳到Activity
3.1 ⽹页url正常跳转Activity
⾸先定义⼀个Activity作为中转,⽹页的链接都跳到这个Activity,然后再从这个Activity打开⽹页需要打开的Activity
class SchemeFilterActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
override fun onArrival(postcard: Postcard?) {
finish()
}
})
}
}
该Activity的manifest为:
<activity android:name=".Url.SchemeFilterActivity">
<intent-filter>
<data
android:host="m.aliyun"
android:scheme="arouter"
/>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
然后定义你要跳转到的Activity,这⾥定义⼀个UrlTargetActivity (记得在Manifest说明):
@Route(path = "/test/activity1")
class UrlTargetActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
setContentView(R.layout.activity_url_target)
val tvContent = findViewById(t) as TextView
< = "当前页⾯是:" + this@UrlTargetActivity::class.java.name
}
}
然后在⼿机打开⼀个⽹页,⽹页内容为:
<a href="arouter://m.aliyun/test/activity1">arouter://m.aliyun/test/activity1</a></p>
1
点击了这个⽹页链接之后,就到根据"arouter://m.aliyun(scheme://host)跳转到SchemeFilterActivity这个Activity,然后在这个Activity利⽤ARouter 根据path = test/activity1跳转到UrlTargetActivity
3.2 Url跳转带常⽤类型参数
上⾯的⽹页链接添加name、age、sex三个参数,例如:
<p><a href="arouter://m.aliyun/test/activity1?
name=tpnet&age=21&sex=true">arouter://m.aliyun/test/activity1</a></p>
1
然后,在⽬标Activity: UrlTargetActivity修改为:
@Route(path = "/test/activity1")
class UrlTargetActivity : AppCompatActivity() {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论