什么是 URL Scheme败明?
android中的scheme是一種頁面內(nèi)跳轉(zhuǎn)協(xié)議,是一種非常好的實(shí)現(xiàn)機(jī)制,通過定義自己的scheme協(xié)議,可以非常方便跳轉(zhuǎn)app中的各個頁面糯彬;通過scheme協(xié)議,服務(wù)器可以定制化告訴App跳轉(zhuǎn)那個頁面葱她,可以通過通知欄消息定制化跳轉(zhuǎn)頁面撩扒,可以通過H5頁面跳轉(zhuǎn)頁面等。
URL Schema應(yīng)用場景
客戶端應(yīng)用可以在服務(wù)端注冊一個URL Scheme吨些,該Scheme用于從瀏覽器或其他應(yīng)用啟動本應(yīng)用搓谆。通過指定的URL字段,可以讓應(yīng)用在被調(diào)起后直接打開某些特定界面锤灿,比如商品詳情頁挽拔,活動詳情頁等。也可以執(zhí)行某些特定的動作但校,如完成支付等螃诅。也可以在應(yīng)用內(nèi)通過html頁來直接調(diào)用顯示app內(nèi)的某個界面。綜上URL Schema使用場景大致分以下幾種:
- 服務(wù)器下發(fā)跳轉(zhuǎn)路徑状囱,客戶端根據(jù)服務(wù)器下發(fā)跳轉(zhuǎn)路徑跳轉(zhuǎn)相應(yīng)的頁面
- H5頁面點(diǎn)擊錨點(diǎn)术裸,根據(jù)錨點(diǎn)具體跳轉(zhuǎn)路徑APP端跳轉(zhuǎn)具體的頁面
- APP端收到服務(wù)器端下發(fā)的PUSH通知欄消息,根據(jù)消息的點(diǎn)擊跳轉(zhuǎn)路徑跳轉(zhuǎn)相關(guān)頁面
- APP根據(jù)URL跳轉(zhuǎn)到另外一個APP指定頁面
URL Schema協(xié)議格式
一個完整的Scheme的協(xié)議格式由 scheme亭枷、userInfo袭艺、host、port叨粘、path猾编、query和fragment 組成。結(jié)構(gòu)如下:
scheme://userInfo@host:port/path?query#fragment
scheme://是固定的格式升敲。userInfo@ 可以省略答倡,host 是必須的。port 驴党、query 和 fragment 也是可以省略的瘪撇。
其中scheme既可以是Android已經(jīng)定義好的協(xié)議,也可使用我們自定義的港庄。Android 常見的scheme 協(xié)議有:content 倔既、file、http 等鹏氧。如果我們自定義協(xié)議就可以隨意使用一些字符串來限定協(xié)議渤涌。當(dāng)然最好是有一定含義的字符串。如下面的協(xié)議:
wangyy://ricky@com.wangyy.sample:8888/goodDetail?param1=參數(shù)1¶m2=參數(shù)2#片段"
- wangyy : 即為 Scheme 把还,即我們自定義的Scheme 協(xié)議名稱
- ricky :即為用戶信息实蓬,注意它跟host 之間一定要跟上 @ 符號
- com.wangyy.sample : 即為 host 稿存;這里我用了一個包名
- 8888 : 即為 port ;自定義協(xié)議的端口號
-goodDetail: 即為path 瞳秽,路徑;代表scheme的指定的頁面率翅,我們匹配頁面的時候练俐,這里就是匹配的重點(diǎn) - param1 和 param2:即為 query ,代表我們跳轉(zhuǎn)到指定界面后傳遞的參數(shù)
- 片段:即為fragment,也可以把它看成跳轉(zhuǎn)到指定界面后傳遞的參數(shù)冕臭,只不過它只能傳遞一個腺晾,而query 可以傳遞多個它會把 #后的所有的內(nèi)容都看成一個片段。
Android中 URL Scheme的使用
首先配置需要跳轉(zhuǎn)的Activity辜贵,Mainifest文件配置如下:
<activity android:name=".SchemeActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="com.wangyy.sample"
android:path="/goodsDetail"
android:port="8888"
android:scheme="wangyy" />
</intent-filter>
</activity>
SchemeActivity
class SchemeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_scheme)
val data = intent.data
Log.i("TAG", "host = ${data.host} path = ${data.path} query = ${data.query}")
val param = data.getQueryParameter("goodsId")
Log.i("TAG", "param: $param")
}
}
1. H5喚起APP界面
在網(wǎng)頁中調(diào)用:
<a href="wangyy://com.wangyy.sample:8888/goodsDetail?goodsId=10011002">打開商品詳情</a>
404?悯蝉,試試系統(tǒng)自帶瀏覽器或者谷歌瀏覽器吧⊥锌肯定能成功的鼻由。
2. APP內(nèi)跳轉(zhuǎn)界面
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
helloBtn.setOnClickListener {
val intent = Intent(Intent.ACTION_VIEW,
Uri.parse("wangyy://com.wangyy.sample:8888/goodsDetail?goodsId=10011002"))
startActivity(intent)
}
}
}
運(yùn)行結(jié)果如下:
01-11 11:18:55.542 7920-7920/com.wangyy.example I/TAG: host = com.wangyy.sample path = /goodsDetail query = goodsId=10011002
01-11 11:18:55.542 7920-7920/com.wangyy.example I/TAG: param: 10011002
其他運(yùn)用方式都基于樣例,源碼地址:URL_SchemeDemo