Android中的Scheme是一種頁(yè)面跳轉(zhuǎn)協(xié)議,和網(wǎng)站通過(guò)URL的形式訪問(wèn)一樣片仿,APP同樣可以通過(guò)這種方式進(jìn)行跳轉(zhuǎn)屁使,它可以很方便的滿(mǎn)足我們?cè)谝恍﹫?chǎng)景中的需求:
- 當(dāng)應(yīng)用接收到Push流济,點(diǎn)擊通知欄消息跳轉(zhuǎn)到特定頁(yè)面,比如商品詳情等技即。
- 通過(guò)服務(wù)器下發(fā)的跳轉(zhuǎn)路徑著洼,客戶(hù)端可以根據(jù)路徑跳轉(zhuǎn)相應(yīng)頁(yè)面。
- 應(yīng)用跳轉(zhuǎn)到其他APP指定頁(yè)面而叼。
- H5頁(yè)面點(diǎn)擊錨點(diǎn)身笤,APP端跳轉(zhuǎn)具體頁(yè)面。
關(guān)于URL葵陵,URI液荸,Uri
-
URL:Uniform Resource Locator,通用資源定位符脱篙;
所屬:
import java.net.URL;
URL是一種資源定位器和根據(jù)協(xié)議建立的約束規(guī)則與資源通信的讀寫(xiě)機(jī)制娇钱,用于定位、讀寫(xiě)資源涡尘。
-
URI:Uniform Resource Identifier忍弛,通用資源標(biāo)識(shí)符;
所屬:
import java.net.URI;
URI僅僅是資源名稱(chēng)考抄,知道了URI最多就是知道有這么一個(gè)名稱(chēng)的資源细疚,也就是說(shuō)URI只能定位資源。
-
Uri:Universal Resource Identifier川梅,通用資源標(biāo)識(shí)符(同URI)疯兼;
所屬:
import android.net.Uri;
Uri是URI的“擴(kuò)展”以適應(yīng)Android系統(tǒng)的需要,Uri類(lèi)是一個(gè)不可改變的URI引用贫途,包括一個(gè)URI和一些碎片吧彪,Android上可用的每種資源 - 圖像、視頻片段等都可以用Uri來(lái)表示丢早。
URI是一種更廣的定義姨裸,而URL則是URI的一個(gè)子集,就是說(shuō)URL是URI的一部分怨酝,換句話說(shuō)傀缩,每個(gè)URL都是URI,但是不是每個(gè)URI都是URL的农猬。同樣屬于URI子集的還有一個(gè)URN赡艰。
在Android中我們使用Uri
Uri
-
結(jié)構(gòu)
[scheme:]scheme-specific-part[#fragment]
進(jìn)一步劃分:
[scheme:][//authority][path][?query][#fragment]
- path可以有多個(gè),每個(gè)用/連接斤葱,比如
scheme://authority/path1/path2/path3?query#fragment - query參數(shù)可以帶有對(duì)應(yīng)的值,也可以不帶,如果帶對(duì)應(yīng)的值用=表示筹裕,如:
scheme://authority/path1/path2/path3?id = 1#fragment边琉,這里有一個(gè)參數(shù)id,它的值是1 - query參數(shù)可以有多個(gè),每個(gè)用&連接
scheme://authority/path1/path2/path3?id = 1&name = mingming&old#fragment
這里有三個(gè)參數(shù):
參數(shù)1:id,其值是:1
參數(shù)2:name,其值是:mingming
參數(shù)3:old蹲嚣,沒(méi)有對(duì)它賦值,所以它的值是null - 在android中祟牲,除了scheme隙畜、authority是必須要有的,其它的幾個(gè)path说贝、query议惰、fragment,它們每一個(gè)可以選擇性的要或不要乡恕,但順序不能變言询,比如:
其中"path"可不要:scheme://authority?query#fragment
其中"path"和"query"可都不要:scheme://authority#fragment
其中"query"和"fragment"可都不要:scheme://authority/path
"path","query","fragment"都不要:scheme://authority
上邊的解釋是抄來(lái)的
出處在此
Scheme怎么用
模擬點(diǎn)擊鏈接獲得鏈接中的參數(shù)
AndroidManifest中設(shè)置增加攔截器(intent-filter),設(shè)置scheme
<activity
android:name=".SchemeActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<!--夠被瀏覽器安全使用的 activitie 必須支持這個(gè)類(lèi)別 此Demo中非必須-->
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="chicha" />
</intent-filter>
</activity>
設(shè)置鏈接
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_scheme)
scheme_tvnodata.text = Html.fromHtml("<a href='chicha://domain/path?params'>CLICK THIS NODATA</a>")
//激活鏈接
scheme_tvnodata.movementMethod = LinkMovementMethod.getInstance()
scheme_tvdata.text = Html.fromHtml("<a href='chicha://scheme_activity?type=0&buffer=這是個(gè)字符串'>CLICK THIS DATA</a>")
scheme_tvdata.movementMethod = LinkMovementMethod.getInstance()
}
}
在SchemeActivity中通過(guò)重寫(xiě)onNewIntent方法獲取參數(shù)
/**
* 為了避免多次實(shí)例化這里我們使用onNewIntent
*/
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
val uri = intent?.data
if (uri != null) {
// 完整的url信息
val url = uri.toString()
Log.e(TAG, "url: $uri")
// scheme部分
val scheme = uri.scheme
Log.e(TAG, "scheme: $scheme")
// host部分
val host = uri.host
Log.e(TAG, "host: $host")
//port部分
val port = uri.port
Log.e(TAG, "port: $port")
// 訪問(wèn)路勁
val path = uri.path
Log.e(TAG, "path: $path")
// Query部分
val query = uri.query
Log.e(TAG, "query: $query")
//獲取指定參數(shù)值
val type = uri.getQueryParameter("type")
Log.e(TAG, "type: $type")
val buffer = uri.getQueryParameter("buffer")
Log.e(TAG, "buffer: $buffer")
}
}
Log如下:
09-10 23:03:19.547 31722-31722/com.vayne.firstkotlintest E/BaseActivity: ------SchemeActivity
09-10 23:03:21.749 31722-31722/com.vayne.firstkotlintest E/SchemeActivity:
url: chicha://scheme_activity?type=0&buffer=這是個(gè)字符串
scheme: chicha
host: scheme_activity
port: -1
path:
09-10 23:03:21.750 31722-31722/com.vayne.firstkotlintest E/SchemeActivity:
query: type=0&buffer=這是個(gè)字符串
type: 0
09-10 23:03:21.751 31722-31722/com.vayne.firstkotlintest E/SchemeActivity:
buffer: 這是個(gè)字符串
服務(wù)器下發(fā)路徑
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("chicha://domain/path?params")));
這里的”chicha://domain/path?params”就是服務(wù)器下發(fā)的跳轉(zhuǎn)路徑傲宜,當(dāng)我們執(zhí)行startActivity的時(shí)候就會(huì)調(diào)起SchemeActivity运杭,然后我們通過(guò)在SchemeActivity解析scheme的內(nèi)容,跳轉(zhuǎn)相應(yīng)的頁(yè)面函卒。