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