安卓scheme_url调端:如果手机上多个app都注册了 http或者https 的 intent。 调端的时候,调起哪个app呢?

简介: 当多个Android应用注册了相同的URL Scheme(如http或https)时,系统会在尝试打开这类链接时展示一个选择对话框,让用户挑选偏好应用。若用户选择“始终”使用某个应用,则后续相同链接将直接由该应用处理,无需再次选择。本文以App A与App B为例,展示了如何在`AndroidManifest.xml`中配置对http与https的支持,并提供了从其他应用发起调用的示例代码。此外,还讨论了如何在系统设置中管理这些默认应用选择,以及建议开发者为避免冲突应注册更独特的Scheme。


当多个应用都注册了相同的 URL scheme(如 http 或 https)的 intent-filter 时,Android 系统会弹出一个选择对话框,让用户选择用哪个应用来处理该 Intent。这个对话框通常会显示所有能够处理该 Intent 的应用列表,用户可以选择一个来完成操作。

如果用户选择了某一个应用并且选择了“始终”(Always),那么下一次执行相同的 Intent 时,系统将直接调用那个应用,而不会再弹出选择对话框。


示例:配置多个应用支持 http 和 https Scheme

假设有两个应用,App A 和 App B,都注册了对 http 和 https 的支持:

App A 的 AndroidManifest.xml 配置


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.appa">
    <application
        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">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="http" android:host="www.example.com" />
                <data android:scheme="https" android:host="www.example.com" />
            </intent-filter>
        </activity>
    </application>
</manifest>



App B 的 AndroidManifest.xml 配置


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.appb">
    <application
        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">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="http" android:host="www.example.com" />
                <data android:scheme="https" android:host="www.example.com" />
            </intent-filter>
        </activity>
    </application>
</manifest>



调起 URL 的示例代码

在任何应用中(假设是 App C)使用以下代码来调起指定 URL:

java

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 创建 Intent 来调起指定 URL
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("http://www.example.com"));
        
        // 检查是否有应用可以处理该 Intent
        if (intent.resolveActivity(getPackageManager()) != null) {
            startActivity(intent);
        } else {
            // 没有应用可以处理该 Intent
            // 可以显示一个提示或者做其他处理
            System.out.println("No application can handle this intent.");
        }
    }
}

用户体验

当用户运行上述代码时,如果系统中有多个应用(如 App A 和 App B)都可以处理 http://www.example.com,Android 系统将显示一个选择对话框,列出所有可以处理这个 Intent 的应用:

  • 用户可以选择一个应用来完成操作。
  • 用户可以选择“仅此一次”(Just once)或者“始终”(Always)来决定这个选择是否持久化。

持久化选择

如果用户选择了“始终”,系统会记住用户的选择,在以后遇到相同的 Intent 时直接调用指定的应用而不再弹出对话框。

如果用户想要重置这些选择,可以在设备的设置中找到“应用管理”或“默认应用”,清除该选择。

备注

  • 当涉及到系统级别的 Scheme(如 http 或 https)时,应该谨慎对待,因为注册这些 Scheme 意味着你的应用会与其他许多应用(如浏览器、社交媒体应用等)产生竞争。
  • 为了避免用户体验中的不确定性,尽量使用更具体的 Scheme 或者 Path 进行注册。

通过上述配置和代码示例,你可以让多个应用响应同一 URL Scheme,并理解用户是如何选择具体应用来处理这些请求的。



相关文章
|
15天前
|
安全 网络安全 Windows
【Azure App Service】遇见az命令访问HTTPS App Service 时遇见SSL证书问题,暂时跳过证书检查的办法
【Azure App Service】遇见az命令访问HTTPS App Service 时遇见SSL证书问题,暂时跳过证书检查的办法
【Azure App Service】遇见az命令访问HTTPS App Service 时遇见SSL证书问题,暂时跳过证书检查的办法
|
15天前
|
Android开发
【Azure 环境】记录使用Notification Hub,安卓手机收不到Push通知时的错误,Error_Code 30602 or 30608
【Azure 环境】记录使用Notification Hub,安卓手机收不到Push通知时的错误,Error_Code 30602 or 30608
|
15天前
|
Linux Python
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
|
2月前
|
存储 移动开发 Android开发
使用kotlin Jetpack Compose框架开发安卓app, webview中h5如何访问手机存储上传文件
在Kotlin和Jetpack Compose中,集成WebView以支持HTML5页面访问手机存储及上传音频文件涉及关键步骤:1) 添加`READ_EXTERNAL_STORAGE`和`WRITE_EXTERNAL_STORAGE`权限,考虑Android 11的分区存储;2) 配置WebView允许JavaScript和文件访问,启用`javaScriptEnabled`、`allowFileAccess`等设置;3) HTML5页面使用`<input type="file">`让用户选择文件,利用File API;
|
2月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的多功能智能手机阅读APP的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的多功能智能手机阅读APP的详细设计和实现(源码+lw+部署文档+讲解等)
|
1月前
|
存储 Linux Docker
Could not fetch/save url https://download.docker.com/linux/centos/docker-ce.repo
CentOS 安装Docker时,将 Docker 官方的 YUM 存储库添加到 CentOS 系统中出现错误。
288 0
|
2月前
|
机器学习/深度学习 人工智能 视频直播
AI直播手机APP震撼发布!3大场景直播,60秒一键开播!
🎉 青否数字人AI直播APP发布!🚀 在抖音等平台60秒一键开播,简化直播流程。💡 3种AI直播模式,融合6大AIGC技术,助力新手轻松直播带货且避免违规。💪 AI主播、声音克隆,实时话术改写,智能互动与讲品同步,提升转化。📊 实景与视频直播结合,适应多种场景。🌐 独立部署,自定义版权,1年免费升级,专业售后支持。🚀 (直播: zhibo175) #青否数字人 #AI直播
AI直播手机APP震撼发布!3大场景直播,60秒一键开播!
|
Web App开发 新零售 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
1.尽可能地了解需求,系统层面适用开闭原则 2.模块化,低耦合,能快速响应变化,也可以避免一个子系统的问题波及整个大系统 3.
733 0
|
Web App开发 监控 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
Datanode的日志中看到: 10/12/14 20:10:31 INFO hdfs.DFSClient: Could not obtain block blk_XXXXXXXXXXXXXXXXXXXXXX_YYYYYYYY from any node: java.
684 0
|
Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
Found lingering reference异常 ERROR: Found lingering reference file hdfs://jiujiang1:9000/hbase/month_hotstatic/...
709 0