Android Schema的妙用
引用
1、 ofollow,noindex">Android業務元件化之URL Scheme使用
定義
1、android中的scheme是一種頁面內跳轉協議,是一種非常好的實現機制,通過定義自己的scheme協議,可以非常方便跳轉app中的各個頁面;通過scheme協議,伺服器可以定製化告訴App跳轉那個頁面,可以通過通知欄訊息定製化跳轉頁面,可以通過H5頁面跳轉頁面等。
2、schema也是【隱示啟動】中的一種,在data屬性下的,其他內容檢視 Android Intent的隱示啟動(啟動其他APP介面並傳遞資料)
使用場景
- 伺服器下發跳轉路徑,客戶端根據伺服器下發跳轉路徑跳轉相應的頁面
- H5頁面點選錨點,根據錨點具體跳轉路徑APP端跳轉具體的頁面,如果沒有的話跳轉下載等
- APP端收到伺服器端下發的PUSH通知欄訊息,根據訊息的點選跳轉路徑跳轉相關頁面
- APP根據URL跳轉到另外一個APP指定頁面
- 各種二維碼掃碼跳轉
規則
-
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必須設定--> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <!--如果需要瀏覽器支援開啟,則category.BROWSABLE--> <category android:name="android.intent.category.BROWSABLE"/> <!--schema的協議型別:隨便設定,只要按照統一規則,前後端一致就行--> <data android:scheme="xl" android:host="goods" android:port="8888" android:path="/goodsDetail" /> </intent-filter> </activity>
-
被開啟的activity中部分內容,主要是為了看schema或者說uri的結構的
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設定的時候
/** * 只有:action.VIEW和category.DEFAULT設定的時候 * */ 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設定的時候,又有:category.BROWSABLE
/** * 既有:action.VIEW和category.DEFAULT設定的時候 * 又有:category.BROWSABLE * */ private void openSchema2(){ webView.loadUrl("xl://goods:8888/goodsDetail?goodsId=10011002"); }
補充:詢問有沒有activity
/** * 檢測某個應用是否安裝 * * @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; } } /** * 檢測某個應用是否安裝 * * @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); } /** * 檢測某個應用是否安裝 * * @param context * @param intent * @return */ public static boolean isAppInstalled2(Context context, Intent intent){ return (intent.resolveActivity(context.getPackageManager()) != null); }
真的要過年啦~~~~~