什么是 URL Scheme?
android中的scheme是一種頁面內(nèi)跳轉(zhuǎn)協(xié)議忿磅,通過定義自己的scheme協(xié)議糯彬,可以跳轉(zhuǎn)app中的各個頁面;通過scheme協(xié)議葱她,服務(wù)器可以定制化告訴App跳轉(zhuǎn)那個頁面撩扒,可以通過通知欄消息定制化跳轉(zhuǎn)頁面,可以通過H5頁面跳轉(zhuǎn)頁面等吨些。
URL Scheme應(yīng)用場景
客戶端應(yīng)用可以向操作系統(tǒng)注冊一個 URL scheme搓谆,該 scheme 用于從瀏覽器或其他應(yīng)用中啟動本應(yīng)用。通過指定的 URL 字段豪墅,可以讓應(yīng)用在被調(diào)起后直接打開某些特定頁面泉手,比如商品詳情頁、活動詳情頁等等偶器。也可以執(zhí)行某些指定動作斩萌,如完成支付等。也可以在應(yīng)用內(nèi)通過 html 頁來直接調(diào)用顯示 app 內(nèi)的某個頁面屏轰。綜上URL Scheme使用場景大致分以下幾種:
- 服務(wù)器下發(fā)跳轉(zhuǎn)路徑颊郎,客戶端根據(jù)服務(wù)器下發(fā)跳轉(zhuǎn)路徑跳轉(zhuǎn)相應(yīng)的頁面
- H5頁面點擊錨點,根據(jù)錨點具體跳轉(zhuǎn)路徑APP端跳轉(zhuǎn)具體的頁面
- APP端收到服務(wù)器端下發(fā)的PUSH通知欄消息亭枷,根據(jù)消息的點擊跳轉(zhuǎn)路徑跳轉(zhuǎn)相關(guān)頁面
- APP根據(jù)URL跳轉(zhuǎn)到另外一個APP指定頁面
URL Scheme協(xié)議格式
先來個完整的URL Scheme協(xié)議格式:
http://baidu:8080/newsDetail?type=1&id=10001
通過上面的路徑 Scheme袭艺、Host、port叨粘、path猾编、query全部包含瘤睹,基本上平時使用路徑就是這樣子的。
- http代表該Scheme 協(xié)議名稱
- baidu代表Scheme作用于哪個地址域
- newsDetail代表Scheme指定的頁面
- type和id代表傳遞的參數(shù)
- 8080代表該路徑的端口號
URL Scheme如何使用
1.)在AndroidManifest.xml中對<activity />標簽增加<intent-filter />設(shè)置Scheme
<activity
android:name=".NewsDetailActivity"
android:theme="@style/AppTheme">
<!--要想在別的App上能成功調(diào)起App答倡,必須添加intent過濾器-->
<intent-filter>
<!--協(xié)議部分轰传,隨便設(shè)置-->
<data android:scheme="http" android:host="baidu" android:path="/newsDetail" android:port="8080"/>
<!--下面這幾行也必須得設(shè)置-->
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
2.)獲取Scheme跳轉(zhuǎn)的參數(shù)
Uri uri = getIntent().getData();
if (uri != null) {
// 完整的url信息
String url = uri.toString();
Log.e(TAG, "url: " + uri);
// scheme部分
String scheme = uri.getScheme();
Log.e(TAG, "scheme: " + scheme);
// host部分
String host = uri.getHost();
Log.e(TAG, "host: " + host);
//port部分
int port = uri.getPort();
Log.e(TAG, "host: " + port);
// 訪問路勁
String path = uri.getPath();
Log.e(TAG, "path: " + path);
List<String> pathSegments = uri.getPathSegments();
// Query部分
String query = uri.getQuery();
Log.e(TAG, "query: " + query);
//獲取指定參數(shù)值
String type=uri.getQueryParameter("type");
String id = uri.getQueryParameter("id");
Log.e(TAG, "type: " + type);
Log.e(TAG, "id: " + id);
}
3.)調(diào)用方式
網(wǎng)頁調(diào)用:
<a href="http://baidu:8080/newsDetail?type=1&id=10001">打開新聞詳情</a>
原生調(diào)用
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://baidu:8080/newsDetail?type=1&id=10001"));
startActivity(intent);
4.)如何判斷一個Scheme是否有效
PackageManager packageManager = getPackageManager();
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://baidu:8080/newsDetail?type=1&id=10001"));
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isValid = !activities.isEmpty();
if (isValid) {
startActivity(intent);
}