引用
1于样、Android業(yè)務(wù)組件化之URL Scheme使用
2屡律、android 通過schema喚起應(yīng)用指定頁面
3挪圾、js 通過schema協(xié)議拉起本地app
定義
1浅萧、android中的scheme是一種頁面內(nèi)跳轉(zhuǎn)協(xié)議,是一種非常好的實現(xiàn)機(jī)制哲思,通過定義自己的scheme協(xié)議洼畅,可以非常方便跳轉(zhuǎn)app中的各個頁面;通過scheme協(xié)議棚赔,服務(wù)器可以定制化告訴App跳轉(zhuǎn)那個頁面帝簇,可以通過通知欄消息定制化跳轉(zhuǎn)頁面,可以通過H5頁面跳轉(zhuǎn)頁面等靠益。
2丧肴、schema也是【隱示啟動】中的一種,在data屬性下的胧后,其他內(nèi)容查看Android Intent的隱示啟動(啟動其他APP界面并傳遞數(shù)據(jù))
使用場景
- 服務(wù)器下發(fā)跳轉(zhuǎn)路徑芋浮,客戶端根據(jù)服務(wù)器下發(fā)跳轉(zhuǎn)路徑跳轉(zhuǎn)相應(yīng)的頁面
- H5頁面點擊錨點,根據(jù)錨點具體跳轉(zhuǎn)路徑APP端跳轉(zhuǎn)具體的頁面绩卤,如果沒有的話跳轉(zhuǎn)下載等
- APP端收到服務(wù)器端下發(fā)的PUSH通知欄消息途样,根據(jù)消息的點擊跳轉(zhuǎn)路徑跳轉(zhuǎn)相關(guān)頁面
- APP根據(jù)URL跳轉(zhuǎn)到另外一個APP指定頁面
- 各種二維碼掃碼跳轉(zhuǎn)
規(guī)則
-
schema完整路徑:schema://host:port/path/query
- authority --> host:port
- query --> queryParameter=queryString
-
舉例:xl://goods:8888/goodsDetail?goodsId=10011002
- schema=xl
- host=goods
- port=8888 (必須是int型哦)
- authority=goods:8888
- path=/goodsDetail
- query=(此處方便看清,稍微隔開一點)goodsId=10011002
截圖
schema.png
實例
-
需要被打開的activity在manifest清單文件中的寫法濒憋,注意action和category就行了
<!--schema-->
<activity android:name=".module.study.components.activity.schema.ZZZActivity"
android:screenOrientation="portrait">
<intent-filter>
<!--action.VIEW和category.DEFAULT必須設(shè)置-->
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<!--如果需要瀏覽器支持打開,則category.BROWSABLE-->
<category android:name="android.intent.category.BROWSABLE"/>
<!--schema的協(xié)議類型:隨便設(shè)置陶夜,只要按照統(tǒng)一規(guī)則凛驮,前后端一致就行-->
<data
android:scheme="xl"
android:host="goods"
android:port="8888"
android:path="/goodsDetail"
/>
</intent-filter>
</activity>
-
被打開的activity中部分內(nèi)容,主要是為了看schema或者說uri的結(jié)構(gòu)的
if(getIntent() != null){
Uri uri = getIntent().getData();
//完整路徑
String url = uri.toString();
//authority
String authority = uri.getAuthority(); //host:port
//schema
String schema = uri.getScheme();
//host
String host = uri.getHost();
//port
int port = uri.getPort();
//path
String path = uri.getPath();
//query
String query = uri.getQuery(); //queryParameter=queryString
//param
String param = uri.getQueryParameter("goodsId");
//最后組裝
String finalPath = schema+"://"+host+":"+port+"/"+path+"?"+query;
tv_xxx.setText("由Schema打開的活動畫面\n"+
"url="+url+"\n"+
"finalPath="+finalPath+"\n");
}
-
如何使用schema去隱示啟動這些activity
方法一:只有:action.VIEW和category.DEFAULT設(shè)置的時候
/**
* 只有:action.VIEW和category.DEFAULT設(shè)置的時候
* */
private void openSchema1(){
Intent it = new Intent();
it.setAction(Intent.ACTION_VIEW);
it.setData(Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002"));
startActivity(it);
}
方法二:既有:action.VIEW和category.DEFAULT設(shè)置的時候条辟,又有:category.BROWSABLE
/**
* 既有:action.VIEW和category.DEFAULT設(shè)置的時候
* 又有:category.BROWSABLE
* */
private void openSchema2(){
webView.loadUrl("xl://goods:8888/goodsDetail?goodsId=10011002");
}
補(bǔ)充:詢問有沒有activity
/**
* 檢測某個應(yīng)用是否安裝
*
* @param context
* @param packageName
* @return
*/
public static boolean isAppInstalled(Context context, String packageName) {
try {
context.getPackageManager().getPackageInfo(packageName, 0);
return true;
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
/**
* 檢測某個應(yīng)用是否安裝
*
* @param context
* @param intent
* @return
*/
public static boolean isAppInstalled(Context context, Intent intent){
List acts = context.getPackageManager().
queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);
return (acts.size() > 0);
}
/**
* 檢測某個應(yīng)用是否安裝
*
* @param context
* @param intent
* @return
*/
public static boolean isAppInstalled2(Context context, Intent intent){
return (intent.resolveActivity(context.getPackageManager()) != null);
}
真的要過年啦~~~~~