Android Schema的妙用

引用

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)機制,通過定義自己的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.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");
    }

補充:詢問有沒有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);
    }

真的要過年啦~~~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容