Android应用间调用方式——URL Scheme

本文介绍了Android中URL Scheme的概念,它是一种页面内跳转协议,用于通过类似打开网页的方式调用Activity。详细讲解了协议格式,包括scheme、host、port、path和query,并阐述了在AndroidManifest.xml中配置Scheme的方法以及如何通过URL启动Activity和提取参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

URL Scheme简介

URL Scheme是Android中的自定义的URL Scheme是一种页面内跳转协议,也可以被称为URLRouter,就是通过类似打开网页的方式去通过路由打开一个Activity,而非直接通过显式Intent方式去进行跳转。

协议格式

协议格式:由scheme、host、port、path、query组成。
<scheme>://<host>:<port>/<path>?<query>
例如:jqchen://android:8088/urlscheme?id=3919

  1. jqchen,即为Scheme,代表该Scheme 协议名称
  2. android,即为Host,代表Scheme作用于哪个地址域
  3. 8088,即为port,代表该路径的端口号
  4. urlscheme,即为path, 代表Scheme指定的页面
  5. id,即为query,代表传递的参数

使用方法

第一步, 在AndroidManifest.xml中对标签增加设置Scheme

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <!--URL Scheme启动-->
    <intent-filter>
        <!--必有项-->
        <action android:name="android.intent.action.VIEW" />
        <!--表示该页面可以被隐式调用,必须加上该项-->
        <category android:name="android.intent.category.DEFAULT" />
        <!--如果希望该应用可以通过浏览器的连接启动,则添加该项-->
        <category android:name="android.intent.category.BROWSABLE" /
        <!--URL Scheme协议部分-->
        <data
            android:host="android"
            android:path="/urlscheme"
            android:port="8088"
            android:scheme="jqchen" />
    </intent-filter>
</activity>

上边配置文件中配置了两组,第一组是作为应用的默认启动Activity配置,第二组是通过URL Scheme方式启动,其本身也是隐式启动的一种,不同在于添加了属性,定义了其接受URL Scheme协议格式为jqchen://android:8088/urlscheme

组成URI的这些属性在中都是可选的,但是存在如下制约关系:

  • 如果没有指定scheme,那么host参数会被忽略
  • 如果没有指定host,那么port参数会被忽略
  • 如果scheme和host都没有指定,path参数会被忽略

当intent对象中的URI中的参数与intent-filter中的标签指定的URI格式进行对比,只对比intent-filter的标签指定的部分,例如:

  • 如果intent-filter中只指定了scheme,那么所有带有该sheme的URI都能匹配到该intent-filter。
  • 如果intent-filter中只指定了scheme和authority(authority包括host和port两部分)而没有指定path,那么所有具有相同scheme和authority的URI都能匹配到该intent-filter,而不用考虑path为何值。
  • 如果intent-filter中同时指定了scheme、authority和path,那么只有具有相同scheme、authority和path的URI才能匹配到该intent-filter。

第二步 ,使用URL启动Activity

// url scheme
String url = "jqchen://android:8088/urlscheme?id=3919";
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setComponent(null);
intent.setSelector(null);
if (checkUrlScheme(intent)) {
    try {
        startActivity(intent);
    } catch (ActivityNotFoundException e) {
        e.printStackTrace();
    }
}// 检查url scheme 是否有效
boolean checkUrlScheme(Intent intent) {
    PackageManager packageManager = getPackageManager();
    List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
    return !activities.isEmpty();
}

第三步,提取scheme参数

private void handlerIntent() {
    Intent intent = getIntent();
    if (null == intent) {
        System.out.println("intent == null");
        return;
    }
    Uri uri = intent.getData();
    if (null == uri) {
        System.out.println("uri == null");
        return;
    }
    // 完整的URL信息
    String url = uri.toString();
    System.out.println("URL = " + url);
    // Scheme
    String scheme = uri.getScheme();
    System.out.println("Scheme = " + scheme);
    // Host
    String host = uri.getHost();
    System.out.println("Host = " + host);
    // port
    int port = uri.getPort();
    System.out.println("Port = " + port);
    // path
    String path = uri.getPath();
    System.out.println("Path = " + path);
    // query
    String query = uri.getQuery();
    System.out.println("Query = " + query);
}

致谢

感谢阅读,欢迎点赞和评论!

<think>嗯,用户这次聚焦在eBay URL Scheme的具体使用上,看来ta正在开发需要深度链接到eBay App的功能。从ta特意强调引用资料来看,可能是个iOS开发者,正在处理应用间跳转的兼容性问题。 用户提供的引用[1]特别关键,展示了iOS检查URL Scheme的经典方法。不过ta没提到Android实现,可能需要补充。引用[2]的API调用示例虽然不直接相关,但说明用户对eBay技术体系有基础认知,可以适当关联到Web场景的替代方案。 注意到用户上次询问的是eBay系统架构,这次突然转向移动端深度链接,可能是同一个电商项目在不同阶段的开发需求。应该强调URL Scheme与微服务架构的关系——比如商品详情页跳转实际触发的是商品服务的微服务调用。 需要重点解释三个核心场景:商品页跳转(ebay://item?id=)、搜索页跳转(ebay://search?query=)、用户页跳转(ebay://user?id=)。特别是iOS 9之后的LSApplicationQueriesSchemes白名单机制必须提及,这是开发者最容易踩的坑。 对于Android用户,要补充PackageManager的resolveActivity检查方法。考虑到用户可能做跨平台开发,Flutter/React Native的插件建议也值得加入。最后提醒ebay://launch这种万能回退方案很必要,毕竟不是所有用户都安装App。 安全提示不能少,特别是iOS 15之后需要添加NSAllowsArbitraryLoads权限。最后用grafana监控的引用[4]来暗示用户:这类功能上线后应该监控打开成功率。</think>eBay URL Scheme 是 eBay 为开发者提供的一种深度链接机制,允许第三方应用直接唤起 eBay 原生 App 并跳转到指定页面(如商品详情、搜索页、用户主页等)。以下是详细解释和使用方法: --- ### 一、核心 URL Scheme 格式 eBay 官方定义的通用 Scheme 为: ``` ebay:// ``` ### 二、常用场景与具体格式 1. **打开商品详情页** ``` ebay://item?id=<商品ID> ``` **示例**: `ebay://item?id=1234567890` *用途*:直接跳转到商品 ID 为 `1234567890` 的页面。 2. **执行关键词搜索** ``` ebay://search?query=<关键词> ``` **示例**: `ebay://search?query=harry+potter+book` *用途*:在 eBay App 中搜索 “harry potter book”。 3. **打开用户主页** ``` ebay://user?id=<用户名> ``` **示例**: `ebay://user?id=top_seller_2023` *用途*:查看用户 `top_seller_2023` 的主页。 4. **打开 App 首页** ``` ebay://launch ``` *用途*:直接启动 eBay App 到首页。 --- ### 三、代码实现(以 iOS 为例) 使用 `canOpenURL` 检测是否安装 eBay App,再通过 `openURL` 唤起: ```swift // 检测 eBay App 是否安装 if let url = URL(string: "ebay://"), UIApplication.shared.canOpenURL(url) { // 跳转到商品详情页 let itemURL = URL(string: "ebay://item?id=1234567890")! UIApplication.shared.open(itemURL, options: [:], completionHandler: nil) } else { // 未安装 App,跳转到 App Store 或 Web 版 let webURL = URL(string: "https://www.ebay.com/itm/1234567890")! UIApplication.shared.open(webURL, options: [:], completionHandler: nil) } ``` > **注意**:iOS 9+ 需在 `Info.plist` 中添加白名单: > ```xml > <key>LSApplicationQueriesSchemes</key> > <array> > <string>ebay</string> > </array> > ``` --- ### 四、Android 实现示例 ```java // 尝试唤起 eBay App Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("ebay://item?id=1234567890")); intent.setPackage("com.ebay.mobile"); // 指定包名 // 检测是否安装 if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } else { // 跳转 Web 版 Intent webIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.ebay.com/itm/1234567890")); startActivity(webIntent); } ``` --- ### 五、注意事项 1. **参数编码** 关键词等参数需进行 URL 编码(如空格替换为 `+` 或 `%20`)。 2. **兼容性** - 部分旧版本 App 可能不支持特定 Scheme,需测试目标用户常用版本。 - 若未安装 App,应提供备用方案(如跳转网页版)。 3. **安全限制** iOS 15+ 对 `canOpenURL` 有更严格的隐私控制,需明确声明用途[^1]。 --- ### 六、进阶使用 eBay 的 Finding API(引用[2])可获取商品 ID 或关键词,结合 URL Scheme 实现「从 API 数据到 App 跳转」的闭环: ```php // 通过 API 获取商品 ID 后生成 Scheme $itemURL = "ebay://item?id=" . $itemId; echo "<a href=\"$itemURL\">在 App 中查看</a>"; ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值