最近前端同僚問了我一個問題,如何讓網頁連結實作啟動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版由我已經完全實作這一功能。希望其他的浏覽器也可以實作一下這個功能。