天天看點

點選網頁連結調用Android程式

最近前端同僚問了我一個問題,如何讓網頁連結實作啟動Android的應用,網上有說重寫WebView相關的shouldOverrideUrlLoading方法,但是這種理論上能實作,因為你的網頁不是僅僅被你自己的webview來浏覽,你需要做的是讓市面上的浏覽器支援才行。

這裡利用零碎的時間整理一下。主要涉及到的問題就是關于Intent在字元串形式和Intent對象之間的轉換。如果你是一位前端工程師,請讓你的Anroid開發小夥伴來看這篇文章,一同解決問題。

兩種表現形式

Intent是Android開發中常見的API。在處理Android元件中,有着必不可少的作用。Intent可以以兩種方式存在。

  • Intent對象。用于在程式中處理,在處理Android元件時使用。
  • 字元串形式的URI。 用于在非程式代碼中,如網頁中進行使用等。

而這裡我們解決我們上面問題的就是後者,字元串形式的Intent。

Intent對象轉成字元串URI

Intent提供了兩種将對象轉換成字元串URI,一個是推薦的

public String toUri (int flags)

, 在API 4加入,将Intent對象轉換成字元串形式的URI。字元串形式的URI可以包含Intent的data,action,categories, type, flags, package, component和extras。

1

2

3

4

Intent intent = new Intent();

ComponentName comp = new ComponentName("com.mx.app.mxhaha", "com.mx.app.MxMainActivity");

intent.setComponent(comp);

Log.i(LOGTAG, "intent.uri=" + intent.toUri(Intent.URI_INTENT_SCHEME));

生成的字元串URI為

1 intent:#Intent;component=com.mx.app.mxhaha/com.mx.app.MxMainActivity;end

另一個方法是

public String toURI ()

, 這是一個棄用的方法,因為它生成的字元串以#開頭,放在連結上會被當成錨點。不建議使用使用這個方法。

上面的Intent對象使用toUri轉換成

1 #Intent;component=com.mx.app.mxhaha/com.mx.app.MxMainActivity;end

字元串URI轉成Intent對象

getIntent(String uri)

這個方法隻适用于處理以#開頭的URI,而且在其方法内部實際上是調用的

parseUri(uri, 0)

來實作的。這個方法已經被比較為棄用,不推薦使用。

getIntentOld(String uri)

getIntentOld既可以支援#開頭的URI轉換成Intent對象,如果uri不是Intent的字元串形式,那麼也會傳回一個Intent,隻是其data部分為uri,action為android.intent.action.VIEW。

parseUri(String uri, int flags)

這個是最完整的轉換方法。接收uri和flag作為參數。支援将字元串形式的URI轉成Intent對象.

以下為一個既可以解析intent:開頭的URI也可以解析#Intent開頭的URI的方法。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

public static Intent parseIntent(String url) {

Intent intent = null;

// Parse intent URI into Intent Object

int flags = 0;

boolean isIntentUri = false;

if (url.startsWith("intent:")) {

isIntentUri = true;

flags = Intent.URI_INTENT_SCHEME;

} else if (url.startsWith("#Intent;")) {

isIntentUri = true;

}

if (isIntentUri) {

try {

intent = Intent.parseUri(url, flags);

} catch (URISyntaxException e) {

e.printStackTrace();

}

}

return intent;

}

多說一下

對于Intent字元串形式URI在網頁連結中的應用,不同的浏覽器實作程度不一緻。目前傲遊浏覽器Android版由我已經完全實作這一功能。希望其他的浏覽器也可以實作一下這個功能。