Scheme跳轉(zhuǎn)協(xié)議

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è)面函卒。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辆憔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子报嵌,更是在濱河造成了極大的恐慌虱咧,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锚国,死亡現(xiàn)場(chǎng)離奇詭異腕巡,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)血筑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)绘沉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人豺总,你說(shuō)我怎么就攤上這事梆砸。” “怎么了园欣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)休蟹。 經(jīng)常有香客問(wèn)我沸枯,道長(zhǎng)日矫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任绑榴,我火速辦了婚禮哪轿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翔怎。我一直安慰自己窃诉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布赤套。 她就那樣靜靜地躺著飘痛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪容握。 梳的紋絲不亂的頭發(fā)上宣脉,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音剔氏,去河邊找鬼塑猖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谈跛,可吹牛的內(nèi)容都是我干的羊苟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼感憾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜡励!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起吹菱,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤巍虫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鳍刷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體占遥,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年输瓜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓦胎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡尤揣,死狀恐怖搔啊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情北戏,我是刑警寧澤负芋,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站嗜愈,受9級(jí)特大地震影響旧蛾,放射性物質(zhì)發(fā)生泄漏莽龟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一锨天、第九天 我趴在偏房一處隱蔽的房頂上張望毯盈。 院中可真熱鬧,春花似錦病袄、人聲如沸搂赋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)脑奠。三九已至,卻和暖如春左刽,著一層夾襖步出監(jiān)牢的瞬間捺信,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工欠痴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迄靠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓喇辽,卻偏偏與公主長(zhǎng)得像掌挚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子菩咨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容