Android業(yè)務(wù)組件化之URL Scheme使用

Android業(yè)務(wù)組件化之URL Scheme使用
H5打包的apk使用(Android平臺(tái)通過(guò)UrlSchemes與第三方應(yīng)用相互調(diào)用)

什么是 URL Scheme暖哨?

android中的scheme是一種頁(yè)面內(nèi)跳轉(zhuǎn)協(xié)議赌朋,是一種非常好的實(shí)現(xiàn)機(jī)制,通過(guò)定義自己的scheme協(xié)議篇裁,可以非常方便跳轉(zhuǎn)app中的各個(gè)頁(yè)面沛慢;通過(guò)scheme協(xié)議,服務(wù)器可以定制化告訴App跳轉(zhuǎn)那個(gè)頁(yè)面达布,可以通過(guò)通知欄消息定制化跳轉(zhuǎn)頁(yè)面团甲,可以通過(guò)H5頁(yè)面跳轉(zhuǎn)頁(yè)面等。

URL Scheme應(yīng)用場(chǎng)景:

客戶端應(yīng)用可以向操作系統(tǒng)注冊(cè)一個(gè) URL scheme往枣,該 scheme 用于從瀏覽器或其他應(yīng)用中啟動(dòng)本應(yīng)用伐庭。通過(guò)指定的 URL 字段,可以讓?xiě)?yīng)用在被調(diào)起后直接打開(kāi)某些特定頁(yè)面分冈,比如商品詳情頁(yè)、活動(dòng)詳情頁(yè)等等霸株。也可以執(zhí)行某些指定動(dòng)作雕沉,如完成支付等。也可以在應(yīng)用內(nèi)通過(guò) html 頁(yè)來(lái)直接調(diào)用顯示 app 內(nèi)的某個(gè)頁(yè)面去件。綜上URL Scheme使用場(chǎng)景大致分以下幾種:
● 服務(wù)器下發(fā)跳轉(zhuǎn)路徑坡椒,客戶端根據(jù)服務(wù)器下發(fā)跳轉(zhuǎn)路徑跳轉(zhuǎn)相應(yīng)的頁(yè)面
● H5頁(yè)面點(diǎn)擊錨點(diǎn),根據(jù)錨點(diǎn)具體跳轉(zhuǎn)路徑APP端跳轉(zhuǎn)具體的頁(yè)面
● APP端收到服務(wù)器端下發(fā)的PUSH通知欄消息尤溜,根據(jù)消息的點(diǎn)擊跳轉(zhuǎn)路徑跳轉(zhuǎn)相關(guān)頁(yè)面
● APP根據(jù)URL跳轉(zhuǎn)到另外一個(gè)APP指定頁(yè)面

URL Scheme協(xié)議格式:
先來(lái)個(gè)完整的URL Scheme協(xié)議格式:
xl://goods:8888/goodsDetail?goodsId=10011002
通過(guò)上面的路徑 Scheme倔叼、Host、port宫莱、path丈攒、query全部包含,基本上平時(shí)使用路徑就是這樣子的授霸。
● xl代表該Scheme 協(xié)議名稱(chēng)
● goods代表Scheme作用于哪個(gè)地址域
● goodsDetail代表Scheme指定的頁(yè)面
● goodsId代表傳遞的參數(shù)
● 8888代表該路徑的端口號(hào)

URL Scheme如何使用:
1.)在AndroidManifest.xml中對(duì)<activity />標(biāo)簽增加<intent-filter />設(shè)置Scheme

<activity
            android:name=".GoodsDetailActivity"
            android:theme="@style/AppTheme">
            <!--要想在別的App上能成功調(diào)起App巡验,必須添加intent過(guò)濾器-->
            <intent-filter>
                <!--協(xié)議部分,隨便設(shè)置-->
                <data android:scheme="xl" android:host="goods" android:path="/goodsDetail" android:port="8888"/>
                <!--下面這幾行也必須得設(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);
    // 訪問(wèn)路勁
    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 goodsId = uri.getQueryParameter("goodsId");
    Log.e(TAG, "goodsId: " + goodsId);
}

3.)調(diào)用方式

網(wǎng)頁(yè)
<a href="xl://goods:8888/goodsDetail?goodsId=10011002">打開(kāi)商品詳情</a>

原生調(diào)用

  Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002"));
  startActivity(intent);

4.)如何判斷一個(gè)Scheme是否有效

PackageManager packageManager = getPackageManager();
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002"));
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isValid = !activities.isEmpty();
if (isValid) {
    startActivity(intent);
}

說(shuō)明:如果遇到特殊情況參考

實(shí)際使用中的一些小細(xì)節(jié)
當(dāng)自定義的URL配置在LAUNCHER對(duì)應(yīng)的Activity上時(shí)碘耳,上述配置就足夠了显设。
但是當(dāng)自定義的URL配置在非LAUNCHER對(duì)應(yīng)的Activity時(shí),還需要增加額外幾步操作辛辨。

問(wèn)題一:使用自定義的URL啟動(dòng)Activity時(shí)捕捂,默認(rèn)是已FLAG_ACTIVITY_NEW_TASK的方式啟動(dòng)的瑟枫,所以可能存在URL啟動(dòng)的Activity跟應(yīng)用已啟動(dòng)的Activity不再同一個(gè)堆棧的現(xiàn)象。
解決方式:這種情況下指攒,需要在manifest中將Activity多配置一個(gè)taskAffinity屬性力奋,約束URL啟動(dòng)的Activity與應(yīng)用自身的啟動(dòng)的Activity在同一個(gè)堆棧中。

問(wèn)題二:應(yīng)用A使用url的方式喚起應(yīng)用B的Activity時(shí)幽七,可能存在應(yīng)用B的Activity啟動(dòng)了景殷,但是堆棧仍然在后臺(tái)的現(xiàn)象,即應(yīng)用B的Activity沒(méi)有聚焦的問(wèn)題澡屡。
解決方式:這種情況下猿挚,應(yīng)用B的Activity收到啟動(dòng)的請(qǐng)求后,可以主動(dòng)將Activity對(duì)應(yīng)的堆棧移動(dòng)到最前端驶鹉。

  1. ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);  
  2. activityManager.moveTaskToFront(getTaskId(), ActivityManager.MOVE_TASK_WITH_HOME);

使用這種方式需要注意的是該api是在Android 3.0(api 11)以后才提供的绩蜻,現(xiàn)在基本上手機(jī)rom版本都是Android4.4以上了,就不太需要關(guān)注3.0一下怎么處理了室埋,且使用這個(gè)需要在manifest中申請(qǐng)android.permission.REORDER_TASKS權(quán)限办绝。

H5部分

Android平臺(tái)可以通過(guò)Url Scheme來(lái)調(diào)用第三方應(yīng)用,設(shè)置步驟如下:

5+應(yīng)用配置支持urlscheme
雙擊應(yīng)用的manifest.json文件姚淆,切換到“代碼視圖”孕蝉,在根節(jié)點(diǎn)下添加plus->distribute->google下添加schemes節(jié)點(diǎn)數(shù)據(jù)如下:


QQ截圖20180419170602.jpg

其值為字符串?dāng)?shù)組,每個(gè)字符串為一個(gè)urlscheme腌逢,使用小寫(xiě)字母降淮,可設(shè)置多個(gè)。
保存后提交App云端打包生效
瀏覽器中通過(guò)href啟動(dòng)應(yīng)用
安裝應(yīng)用后搏讶,我們可以在html頁(yè)面中佳鳖,通過(guò)href直接調(diào)用應(yīng)用:

<a href="test://abc">test:<a><br/>

5+應(yīng)用中處理urlscheme啟動(dòng)傳遞的參數(shù)
在其它應(yīng)用中通過(guò)href調(diào)用Url Scheme傳遞過(guò)來(lái)的值,可以通過(guò)plus.runtime.arguments獲取
其值為完整的urlscheme字符串媒惕,如上面href的值啟動(dòng)應(yīng)用后獲取的plus.runtime.arguments值為“test://abc

代碼示例如下:
document.addEventListener('plusready',function(){
    checkArguments();
},false);
// 判斷啟動(dòng)方式
function checkArguments(){
    console.log("plus.runtime.launcher: "+plus.runtime.launcher);
    var args= plus.runtime.arguments;
    if(args){
        // 處理args參數(shù)系吩,如打開(kāi)新頁(yè)面等
    }
}
// 處理從后臺(tái)恢復(fù)
document.addEventListener('newintent',function(){
    console.log("addEventListener: newintent");
    checkArguments();
},false);

android實(shí)例
參考 :http://www.reibang.com/writer#/notebooks/24554617/notes/26872651

iOS平臺(tái)請(qǐng)參考:

iOS平臺(tái)通過(guò)UrlSchemes與第三方應(yīng)用相互調(diào)用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市妒蔚,隨后出現(xiàn)的幾起案子穿挨,更是在濱河造成了極大的恐慌,老刑警劉巖面睛,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件絮蒿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡叁鉴,警方通過(guò)查閱死者的電腦和手機(jī)土涝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)幌墓,“玉大人但壮,你說(shuō)我怎么就攤上這事冀泻。” “怎么了蜡饵?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵弹渔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我溯祸,道長(zhǎng)肢专,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任焦辅,我火速辦了婚禮博杖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筷登。我一直安慰自己剃根,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布前方。 她就那樣靜靜地躺著狈醉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惠险。 梳的紋絲不亂的頭發(fā)上苗傅,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音莺匠,去河邊找鬼金吗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛趣竣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旱物,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼遥缕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了宵呛?” 一聲冷哼從身側(cè)響起单匣,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宝穗,沒(méi)想到半個(gè)月后户秤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逮矛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年鸡号,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片须鼎。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鲸伴,死狀恐怖府蔗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情汞窗,我是刑警寧澤姓赤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站仲吏,受9級(jí)特大地震影響不铆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜裹唆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一誓斥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧品腹,春花似錦岖食、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至羡鸥,卻和暖如春蔑穴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惧浴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工存和, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衷旅。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓捐腿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親柿顶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茄袖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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