意图与跳转
# Intent(意图)
Intent(意图) 是一个消息传递对象,您可以使用它从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个:
启动活动(Activity): Activity 表示应用中的一个"屏幕"。例如应用主入口都是一个Activity,应用的功能通常也以Activity的形式独立,例如微信的主界面、朋友圈、聊天窗口都是不同的Activity。通过将 Intent 传递给 startActivity(),您可以启动新的 Activity 实例。Intent 描述了要启动的 Activity,并携带了任何必要的数据。
启动服务(Service): Service 是一个不使用用户界面而在后台执行操作的组件。通过将 Intent 传递给 startService(),您可以启动服务执行一次性操作(例如,下载文件)。Intent 描述了要启动的服务,并携带了任何必要的数据。
传递广播: 广播是任何应用均可接收的消息。系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播。通过将 Intent 传递给 sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast(),您可以将广播传递给其他应用。
注意
除非应用专门暴露Activity出来,否则在没有root权限的情况下使用intent是无法跳转到特定Activity、应用的特定界面的。
例如我们能通过Intent跳转到QQ的分享界面,是因为QQ对外暴露了分享的Activity;而在没有root权限的情况下,我们无法通过intent跳转到QQ的设置界面,因为QQ并没有暴露这个Activity。
# 如何获取Intent(意图)地址
关于intent的参数如何获取的问题,一些intent是意外发现并且在网络中传播的(例如跳转QQ聊天窗口是因为QQ给网页提供了跳转到客服QQ的方法),如果要自己获取活动的intent的参数,可以通过例如"intent记录","隐式启动"等应用拦截内部intent或者查询暴露的intent。
其中拦截内部intent需要XPosed框架,或者可以通过反编译等手段获取参数。
总之,没有简单直接的方法。
更多信息,请百度安卓Intent
或参考Android指南: Intent
# URL Scheme(Android 跨应用间调用)
Android中的自定义的URL Scheme是一种页面内跳转协议,也可以被称为URLRouter,就是通过类似打开网页的方式去通过路由打开一个Activity,而非直接通过显式Intent方式去进行跳转。
在Android开发中,不同Activity之间的跳转和切换是很常见的,这使得APP的内容更加丰富,功能更为多样,但是一个应用所能包括的功能毕竟有限,在很多的场景下需要跨应用调用,比如在应用中跳转到微信支付的页面,或者使用第三方账号登陆时跳转到QQ登陆等等。这样的情况下,要跳转的Activity或者Application是第三方开发的,很可能不知道要具体跳转到哪一个Activity中,或者直接跳转并不安全,诸如这些问题都需要在跨应用间调用时被周全地考虑到。
# 如何获取Scheme地址
- 网络搜索
- 反编译apk,从
xml
文件中提取 - 浏览器抓包
# 示例
# 通过Intent跳转的方式打开华为设备的的设置页面
//导入包
importClass(Packages.android.content.Intent);
importClass(Packages.android.net.Uri);
/**
* @author 飞云
* @wechat imfeiyun
* @wiki http://aiwork.wiki
* @link http://www.feiyunjs.com
*/
var intent = new android.content.Intent(android.content.Intent.ACTION_VIEW);
intent.setClassName("com.android.settings", "com.android.settings.HWSettings");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
# Scheme示例:跳转到某音用户视频页
/**
* @author 未知
* @wiki http://aiwork.wiki
*/
var app = {}
app.parseIntentFlag = function (flag) {
if (typeof (flag) == 'string') {
return android.content.Intent["FLAG_" + flag.toUpperCase()];
}
return flag;
}
app.parseUri = function (uri) {
if (uri.startsWith("file://")) {
return app.getUriForFile(uri);
}
return android.net.Uri.parse(uri);
}
app.intent = function (i) {
var intent = new android.content.Intent();
if (i.className && i.packageName) {
intent.setClassName(i.packageName, i.className);
}
if (i.extras) {
for (var key in i.extras) {
intent.putExtra(key, i.extras[key]);
}
}
if (i.category) {
if (i.category instanceof Array) {
for (var j = 0; i < i.category.length; j++) {
intent.addCategory(i.category[j]);
}
} else {
intent.addCategory(i.category);
}
}
if (i.action) {
if (i.action.indexOf(".") == -1) {
i.action = "android.intent.action." + i.action;
}
intent.setAction(i.action);
}
if (i.flags) {
let flags = 0;
if (Array.isArray(i.flags)) {
for (let j = 0; j < i.flags.length; j++) {
flags |= app.parseIntentFlag(i.flags[j]);
}
} else {
flags = app.parseIntentFlag(i.flags);
}
intent.setFlags(flags);
}
if (i.type) {
if (i.data) {
intent.setDataAndType(app.parseUri(i.data), i.type);
} else {
intent.setType(i.type);
}
} else if (i.data) {
intent.setData(android.net.Uri.parse(i.data));
}
return intent;
}
app.startActivity = function (i) {
context.startActivity(app.intent(i).addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK))
}
app.startActivity({
data: "snssdk1128://aweme/detail/7264853865835531574?browser_name=safari&did=MS4wLjABAAAALOcz-_R2cdwAmx2BzOYcXUSfRF5jtoQvi6wpPFTbuSxy4A1GDK9TPG8H2GAKJYlx&from=web_code_link&from_ssr=1&gd_label=click_schema_lhft_41030704a&group_id=7264853865835531574&host=www.iesdouyin.com&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&launch_method=click_wap_rf_video_top_banner&mid=7264853928205110076&needlaunchlog=1&refer=web&referrer_host=www.iesdouyin.com®ion=CN&scene_from=share_reflow&share_sign=CKf0abjGw27J3Cyxoqn9xK.XAbc.1dr4t1VKV68mEII-&share_version=170400&titleType=title&ts=1697875728&u_code=0&web_id=7270420314449217039&with_sec_did=1&zlink=https%3A%2F%2Fz.douyin.com%2FtA4V&zlink_click_time=1697875760&__reporte_stage=launch"
});