提示:
前言
安卓中的跳转是经常需要考虑到的问题,在应用之间的跳转比较容易,但是如果涉及到跳转至其他应用或者调用一些系统应用应该如何做呢?
一、intent是什么?
Intent(意图)是安卓中非常重要的常用类,可用于跳转activity、启动service、发送broadcast,被称为链接四大组件的纽带。
context.startActivity(aIntent)
context.sendBroadcast(aIntent)
context.startService(aIntent)
重要组成:
- extras:附加数据。一般用于跳转activity时传递数据。它是一个Bundle类,以键值对的形式存储传递的数据。
例如:
前一个页面:
val intent = Intent(context, XActivity::class.java)
intent.putExtra(BundleKeys.TITLE, title)
context.startActivity(intent)
//也可以像下面这样写:
val intent = Intent(context, XActivity::class.java)
var bundle = Bundle()
bundle.putString(BundleKeys.TITLE, title)
intent.putExtras(bundle)
context.startActivity(intent)
后一个页面
//接收数据
val title = intent.extras?.getString(BundleKeys.TITLE)
-
Action:
Intent.ACTION_MAIN / String: android.intent.action.MAIN:标识Activity为一个程序的开始。
Intent.ACTION_VIEW / String: android.intent.action.VIEW:用于显示用户的数据。比较通用,会根据用户的数据类型打开相应的Activity。比如: tel:13400010001打开拨号程序;http://www.g.cn则会打开浏览器等。具体的内容(tel:13400010001 / http://www.g.cn)一般是会放在data中 -
Category:
Category属性用于指定当前动作(Action)被执行的环境。通过addCategory()方法或在清单文件AndroidManifest.xml中设置。默认为:CATEGORY_DEFAULT。 -
Data
Data通常是URI格式定义的操作数据。例如:tel://…… 。通过setData()方法设置。
二、跳转方式
1.显式跳转
显示跳转仅限于跳转到应用内的其他页面。需要知道确切的类名。
val intent = Intent(context, XActivity::class.java)
intent.putExtra(BundleKeys.TITLE, title)
context.startActivity(intent)
2.隐式跳转
隐式跳转可用于应用内部,也可跳转到其他应用:
1. 应用内部
首先需要在AndroidManifest中设置intent_filter属性,必须包括以下的两个属性(action&category)。另外,过滤器可以有多个,过滤器中的action、data、category也可以有多个。
data标签的属性中的scheme, host, port, path 是用来匹配 Intent 中的 Data Uri 的。具体规则如下:
scheme : // host:port / path(or pathPrefixor pathPattern)
若<data…/>指定了属性,那么Inent的Data属性所设置的URI类要指定相同的scheme,host,port才可以启动该组件。大多情况下指定scheme即可。
<activity
android:name=".intent.XActivity"
android:exported="true">
<intent-filter>
<!-- action的名字可以自定义 -->
<action android:name="android.intent.action.GOTOX" />
<action android:name="android.intent.action.GOTOXX" />
<data android:scheme="gotox" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
在activity中:
val intent = Intent()
intent.action = "android.intent.action.GOTOX"
intent.putExtra(BundleKeys.TITLE, binding.editTitle.text.toString())
intent.data = Uri.parse("gotox:"+"123")
startActivity(intent)
2. 应用外部
跳转至已知intent-filter的页面
例如自己所写的XActivity页面,直接和应用内部跳转的写法一摸一样即可。但是一定要注意AndroidManifest中必须有android:exported=“true”
val intent = Intent()
intent.action = "android.intent.action.GOTOX"
intent.putExtra(BundleKeys.TITLE, binding.editTitle.text.toString())
intent.data = Uri.parse("gotox:"+"123")
startActivity(intent)
跳转至浏览器
在data中放入一个Uri类即可跳转至浏览器
val intent = Intent("android.intent.action.VIEW")
intent.data = Uri.parse("https://www.baidu.com/")
startActivity(intent)
跳转至系统应用
有许多定义好的action,例如以下几种:
//跳转到短信编辑
val smsIntent = Intent(Intent.ACTION_SENDTO)
val uri = Uri.parse("sms:123123")
smsIntent.setData(uri)
startActivity(smsIntent);
//跳转到拨号页面
val dialIntent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + 123123))
startActivity(dialIntent)