1. 程式人生 > >android採用Chrome Intent方式實現從瀏覽器啟動應用

android採用Chrome Intent方式實現從瀏覽器啟動應用

在很多應用中需要我們從瀏覽器中直接啟動應用,而網上大多數採用的是scheme的方式,即在啟動activity的mainfest檔案中配置如下欄位:
<activity android:name=”com.example.MainActivity”>
  <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=”example” android:host=”test” />
  </intent-filter>
</activity>

然後在網頁的連線設定為example://test/… 來啟動應用,但是如果手機中沒有應用,該url會跳轉到一個錯誤的介面。

google官方在chrome中推出了一種Android Intents的方式來實現應用啟動,通過在iframe中設定src為

intent:HOST/URI-path // Optional host
#Intent;
package=[string];
action=[string];
category=[string];
component=[string]; 
scheme=[string];
end;

的方式,具體示例如下。

我們定義一個a標籤為

<pre name="code" class="html"><pre name="code" class="html"><a href="intent://whatever/#Intent;scheme=myapp;package=com.what.ever.myapp;end">Do Whatever</a>
然後在mainfest檔案中定義要啟動的activity
<activity android:name=".TestUrlScheme" >
            <intent-filter>
                <action android:name="android.intent.action.VIEW" /><!-- 顯示資料 -->
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" /><!-- 定義成瀏覽器型別,有URL需要處理時會過濾 -->
                <data android:scheme="myapp" android:host="whatever" android:path="/" /><!-- 開啟以whatever協議的URL,這個自己隨便定義。 -->
            </intent-filter>
</activity>
然後在瀏覽器中點選a標籤,就可以啟動應用程式的對應activity了,如果手機中沒有相應的應用,那麼是否會跳轉到錯誤頁面呢,將a標籤設定為
<a href="intent://whatever/#Intent;scheme=myapp;package=com.what.ever.myapp;S.browser_fallback_url=http%3A%2F%2Fzxing.org;end">Do Whatever</a>

這樣如果沒有對應應用,該連結就會跳轉到S.browser_fallback_url指定的url上。

如果我們還需要對在a標籤中對指定activity進行傳值呢?那也有辦法,參考stackoverflow上面的一個回答點選開啟連結,將a標籤設定為

<a href="intent://whatever/#Intent;scheme=myapp;package=com.what.ever.myapp;S.name=Perico%20de%20los%20Palotes;I.age=35;end">Do Whatever</a>
其中引數的型別如下
String => 'S'
Boolean =>'B'
Byte => 'b'
Character => 'c'
Double => 'd'
Float => 'f'
Integer => 'i'
Long => 'l'
Short => 's'

然後在啟動activity的onCreate函式中利用bundle接收引數就行了
Bundle parametros = getIntent().getExtras();
if (extras != null){
    String name = extras.getString("name");
    Integer age = extras.getInt("age");

    if (name!=null && age!=null)
    {
       //do whatever you have to
       //...
    }
}else{
     //no extras, get over it!!
}

至此,通過瀏覽器啟動app就大功告成了,但是需要注意的是,很多第三方瀏覽器會攔截掉chrome intent啟動應用的請求,像uc,微信內建瀏覽器,QQ瀏覽器等,在這些頁面要做一個提示,讓使用者跳轉到源生的瀏覽器上才能開啟應用。