1. 程式人生 > >如何通過超連結開啟Activity並傳入引數

如何通過超連結開啟Activity並傳入引數

通常如果我們在程式中要開啟一個url,一般是藉助於瀏覽器來開啟,但使用者手機上會安裝多個瀏覽器,Android做的比較智慧,把選擇權讓給了使用者,讓使用者選擇用哪個瀏覽器來開啟
程式程式碼通常如下,指明瞭action、category和data uri
             Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
             intent.addCategory(Intent. CATEGORY_BROWSABLE);
             intent.addCategory(Intent. CATEGORY_DEFAULT);
             startActivity(intent);

瀏覽器應用要想處理這個請求動作的話,那麼它的Activity可能要做如下一些配置
            <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="http" />
                <data android:scheme="https" />
            </intent-filter>

上面是一些最基本的配置,說明了它能夠處理VIEW action,BROWSABLE和DEFAULT類別,uri scheme為http和https的Intent,我們可以定義自己的uri scheme以便能處理除常規外一些特定的data uri scheme
            <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="http" />
                <data android:scheme="https" />
                <data android:scheme="myscheme" />
            </intent-filter>

程式碼中的Intent編寫為
             Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("myscheme://www.baidu.com"));
             intent.addCategory(Intent. CATEGORY_BROWSABLE);
             intent.addCategory(Intent. CATEGORY_DEFAULT);
             startActivity(intent);

基於前面的一些介紹,我們知道在程式碼中我們肯定是可以通過我們自己的scheme來開啟一個Activity的,那通過一個超連結是否也能做到呢,讓人欣喜的是Android系統提供了這種功能
Activity <intent-filter>配置如下
             <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="my.special.scheme" />
            </intent-filter>

下面是一個html頁面,通過uri(scheme為我們自定義的scheme:my.special.scheme)往Activity傳入了兩個引數
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>default</title>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<meta name="viewport" content="width=320" />
</head>

<body>
<div id="header">
     <a href="my.special.scheme://192.168.2.126/param1/param2">link open app</a>
</div>
</body>
</html>

當點選超連結時,相應的Activity就能獲取到data uri了
             Uri data = getIntent().getData();
             String scheme = data.getScheme();
             String host = data.getHost();
             List<String> params = data.getPathSegments();
             String first = params.get(0);
             String second = params.get(1);
             LogUtil. i("INFO", "param1 : " + first + "   param2 : " + second + "   scheme : " + scheme + "   host : " + host);

Activity中列印資料如下
05-10 16:00:27.090: I/INFO(2798): param1 : param1   param2 : param2   scheme : my.special.scheme   host : 192.168.2.126