当多个应用都注册了相同的 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,并理解用户是如何选择具体应用来处理这些请求的。