1. 程式人生 > >Android中通過scheme實現網頁開啟App(deep-link)

Android中通過scheme實現網頁開啟App(deep-link)

Android 通過 Intent Filter 和 scheme 實現與js互動,也稱為 deep-link

達到點選網頁按鈕開啟App效果

參考

參考連結

這裡寫圖片描述

實現

接下來結合具體的程式碼進行解析

首先來看 網頁端 js的實現

按照stackoverflow上的說法,js中應該有一個類似於下面的結構

<a href="my.special.scheme://other/parameters/here">

來看一下js的程式碼

這裡寫圖片描述

其中可以看到這種結構,
scheme為shopal-c
host為 www.ushopal.com
path為product/detail

,campaign/detail,discount/detail等。
parameter為post_id,post_type,post_link等。

這是js這邊要進行的操作,而Android本地是通過Intent Filter來設定的。

Android原生代碼


          <activity
            android:name=".activity.MainActivity"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
>
<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data
android:scheme="shopal-c" />
</intent-filter> </activity>

其中可以看到<data android:scheme="shopal-c" />這個配置與js中的scheme是對應的。

這樣就可以根據scheme在js中喚起app。

注意

喚起app之後首先就會進入配置了 配置了對應Intent Filter的Activity,這裡需要注意一點:Activity的啟動方式。

這裡的目標Activity是singleTask模式,是不能重複建立的。

首先看一下 在Activity宣告週期中進行的處理

onCreate

        Intent intent = getIntent();
        String action = intent.getAction();
        schemeOperate = new SchemeOperate();
        if (Intent.ACTION_VIEW.equals(action)) {
            String url = intent.getDataString();
            if (url != null) {
                schemeOperate.operate(this, url, new MainSearchBean());
            }
        }

如果使用者是點選應用圖示進入的Activity,而不是通過scheme跳轉的,那麼intent.getAction的值是null,所以這裡需要判斷一下。

如果目標Activity處於任務棧的棧頂,那麼通過scheme跳轉過來的時候執行的生命週期也是onCreate

生命週期:
onCreate
onStart
onResume

onNewIntent


        String action = intent.getAction();
        if (Intent.ACTION_VIEW.equals(action)) {
            String url = intent.getDataString();
            if (url != null) {
                schemeOperate.operate(this, url, new MainSearchBean());
            }
        }

因為目標Activity是singleTask,所以當目標Activity (1)已經被建立,(2)不是在棧頂,那麼通過scheme跳轉到目標Activity是不會執行onCreate方法的,而是執行onNewIntent生命週期。

生命週期:
onNewIntent
onRestart
onStart
onResume