Android 從 Web 喚起 APP

来源:https://www.cnblogs.com/WuXiaolong/archive/2018/04/07/8735226.html
-Advertisement-
Play Games

前言 知乎在手機瀏覽器打開,會有個 App 內打開的按鈕,點擊直接打開且跳轉到該詳情頁,是不是有點神奇,是如何做到的呢? 效果預覽 Uri Scheme 配置 intent filter AndroidManifest.xml 測試網頁 main 下新建 assets 文件,寫了簡單的 Html 網 ...


前言


知乎在手機瀏覽器打開,會有個 App 內打開的按鈕,點擊直接打開且跳轉到該詳情頁,是不是有點神奇,是如何做到的呢?

效果預覽

Uri Scheme

配置 intent-filter

AndroidManifest.xml

<activity android:name=".MainActivity">
    <!-- 需要添加下麵的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:host="myhost"
            android:path="/main"
            android:port="1024"
            android:scheme="myscheme" />
    </intent-filter>
</activity>

測試網頁

main 下新建 assets 文件,寫了簡單的 Html 網頁用於 WebView 展示,來進行測試。

index.html:

<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
<h1>這是一個 WebView</h1>

<a href="market://details?id=com.tencent.mm">open app with market</a>
<br/>
<br/>

<a href="myscheme://myhost:1024/main?key1=value1&key2=value2">open app with Uri Scheme</a>

<br/>
<br/>


</body>
</html>

Web View 載入:

webView.loadUrl("file:///android_asset/index.html");

目標頁面

接受參數,做相應的處理。

Intent intent = getIntent();
if (null != intent && null != intent.getData()) {
    // uri 就相當於 web 頁面中的鏈接
    Uri uri = intent.getData();
    Log.e(TAG, "uri=" +uri);
    String scheme = uri.getScheme();
    String host = uri.getHost();
    int port = uri.getPort();
    String path = uri.getPath();
    String key1 = uri.getQueryParameter("key1");
    String key2 = uri.getQueryParameter("key2");
    Log.e(TAG, "scheme=" + scheme + ",host=" + host
            + ",port=" + port + ",path=" + path
            + ",query=" + uri.getQuery()
            + ",key1=" + key1 + ",key2=" + key2);
}

列印消息如下:

uri=myscheme://myhost:1024/main?key1=value1&key2=value2
scheme=myscheme,host=myhost,port=1024,path=/main,query=key1=value1&key2=value2,key1=value1,key2=value2

原理

myscheme://myhost:1024/main?key1=value1&key2=value2,通過一個鏈接,為什麼能啟動相應的 APP 呢?Web 喚起 Android app 的實現及原理,一文說到關鍵代碼在 Android 6.0 的原生瀏覽器的 shouldOverrideUrlLoading 方法,核心實現在 UrlHandler 這個類中。代碼如下:

final static String SCHEME_WTAI = "wtai://wp/";
final static String SCHEME_WTAI_MC = "wtai://wp/mc;";
boolean shouldOverrideUrlLoading(Tab tab, WebView view, String url) {
    if (view.isPrivateBrowsingEnabled()) {
        // Don't allow urls to leave the browser app when in
        // private browsing mode
        return false;
    }
    if (url.startsWith(SCHEME_WTAI)) {
        // wtai://wp/mc;number
        // number=string(phone-number)
        if (url.startsWith(SCHEME_WTAI_MC)) {
            Intent intent = new Intent(Intent.ACTION_VIEW,
                    Uri.parse(WebView.SCHEME_TEL +
                            url.substring(SCHEME_WTAI_MC.length())));
            mActivity.startActivity(intent);
            // before leaving BrowserActivity, close the empty child tab.
            // If a new tab is created through JavaScript open to load this
            // url, we would like to close it as we will load this url in a
            // different Activity.
            mController.closeEmptyTab();
            return true;
        }
        //……
    }

源碼

公眾號「吳小龍同學」回覆「SchemeSample」,獲取這次練習的完整示例。

Deep Links

如圖,在 Android M 之前,如果點擊一個鏈接有多個 APP 符合,會彈出一個對話框,詢問用戶使用哪個應用打開 - 包括瀏覽器應用。谷歌在Android M 上實現了一個自動認證(auto-verify)機制,讓開發者可以避開這個彈出框,使用戶不必去選擇一個列表,直接跳轉到他們的 APP。

創建

Android M的App Links實現詳解

Android M App Links: 實現, 缺陷以及解決辦法

我沒有驗證,因為我玩不起來,有條件更新下 Deep Links 這塊內容,可以自己搭個本地伺服器。

弊端

需要 Android M

需要 Android 6.0(minSdkVersion 級別23)及更高版本上的才能使用。

.well-known/assetlinks.json

開發者必須維護一個與app相關聯的網站,通過在以下位置托管數字資產鏈接 JSON 文件來聲明您的網站與您的意圖過濾器之間的關係:

https://domain.name/.well-known/assetlinks.json

參考

Android 使用Scheme實現從網頁啟動APP

Deep Link是什麼

Android移動開發者必須知道的Deep Linking技術

Handling Android App Links

公眾號

我的公眾號:吳小龍同學,歡迎交流~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 需求:和老婆一起玩雙人同屏游戲(以撒的結合:抗生),但需要帶上藍牙耳機玩。 設備:2個藍牙耳機、1個藍牙接收器、1台Win10系統電腦。 通過關鍵字搜索出一個解決方案(Output audio to multiple devices in Windows 10) 在我電腦上測試無法實現。 但順著思路 ...
  • 《unix環境高級編程·第三版》源代碼編譯及使用 《unix環境高級編程》中有很多示例代碼需要包含作者自定義的頭文件,如"apue.h"。這些代碼可以從以下網址下載 http://apuebook.com/code3e.html 1. 解壓文件 2. 安裝 ,否則編譯會報錯不通過,會提示編譯thre ...
  • 1、DHT11和DHT21感測器 這兩種感測器都是奧松公司的產品,具體的感測器說明書在其官網上有(www.aosong.com)。 DHT11 數字溫濕度感測器是一款含有已校準數字信號輸出的溫濕度複合感測器。它應用專用的數 字模塊採集技術和溫濕度感測技術,確保產品具有枀高的可靠性與卓越的長期穩定性。 ...
  • [20180408]那些函數索引適合欄位的查詢.txt--//一般不主張建立函數索引,往往是開發的無知,使用trunc等函數,實際上一些函數也可以用於欄位的查詢.--//以前零碎的寫過一些,放假看了https://blog.pythian.com/tackling-time-troubles-use ...
  • 一、 準備材料 伺服器 IP address 操作系統 位數 Redis 版本 CNT06CAH05 192.168.3.47 CentOS 6.5 x64 Redis-3.2.6 sentinel 001::28339 sentinel 002:28349 sentinel 003:28359 C ...
  • 本文內容: mysql客戶端連接服務端 斷開連接 首發日期:2018-04-07 mysql客戶端連接服務端: 連接服務端的命令基本語法是: 上面的"[]"選項跟參數是一組的,“-h host”,"-u user",這些都是可選項,如果沒有-h 那麼也應當沒有-h的選項參數host host是服務端 ...
  • 經典SQL語句大全(絕對的經典) 一、基礎 經典SQL語句大全(絕對的經典) 一、基礎 經典SQL語句大全(絕對的經典) 一、基礎 經典SQL語句大全(絕對的經典) 一、基礎 1、說明:創建資料庫 CREATE DATABASE database-name 2、說明:刪除資料庫 drop datab ...
  • iOS應用在運行時經常要創建一些文件,不過這些文件要如何存放呢?有沒有什麼要求呢? 由於手機資源空間有限而且考慮到Apple推出的iCloud,我們確實要對創建出的文件按照作用的不同,分出幾種類別出來,並設置文件備份屬性attribute(需iOS5.0.1及以上),從而讓iOS系統更好地管理和對待 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...