Android通过Scheme协议打开APP界面
轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/123238777
本文出自【趙彥軍的博客】
文章目錄
- 瀏覽器為什么能喚起App的頁面
- URI、URL
- 二、URL的組成
- Scheme
- 注意點
- 舉例
- encode
- h5如何通過scheme喚起app
- 通過另一個APP打開
- 編碼、解碼
瀏覽器為什么能喚起App的頁面
瀏覽器為什么能喚起App的頁面
URI、URL
- URI=Uniform Resource Identifier:統一資源標志符,在某一個規則下能把一個資源獨一無二的標識出來。比如你的身份證號。
- URL=Uniform Resource Locator :統一資源定位符,可以提供找到該資源的路徑,是URI的子集,是用定位方式實現的URI。
在www上,每一個信息資源都有統一的且在網上唯一的地址,該地址就叫URL,就是指網絡地址。
二、URL的組成
URL的一般語法格式為(帶方括號[]的為可選項)
protocol://hostname[:port]/path/[;parameters][?query]#fragment 協議://域名:端口號/目錄/文件名.文件后綴?參數=值#標志https://www.testurl.com:8080/path/subpath;parms=test_parms?uid=123&gid=45#fragment=009&fragment- protocol 協議,常用的協議是http
- hostname 主機地址,可以是域名,也可以是IP地址
- port 端口 http協議默認端口是:80端口,如果不寫默認就是:80端口
- path 路徑 網絡資源在服務器中的指定路徑
- parameter 參數 如果要向服務器傳入參數,在這部分輸入
- query 查詢字符串 如果需要從服務器那里查詢內容,在這里編輯
- fragment 片段 網頁中可能會分為不同的片段,如果想訪問網頁后直接到達指定位置,可以在這部分設置
Scheme
英文含義:方案、格式、策略
就是自定義的protocol,非標準,在許多情況下,scheme就是protocol的名稱,定義了如何獲取資源。
注意點
- 編碼,query要編碼,否則使用系統方法直接解析會失敗
舉例
val url = "taobao://app/path?version=1.0&name=zhaoyanjun&open=true" val uri = Uri.parse(url) val scheme = uri.scheme val host = uri.host val path = uri.path val version = uri.getQueryParameter("version") val name = uri.getQueryParameter("name") val open = uri.getBooleanQueryParameter("open", false)Log.d("yu--", "scheme:$scheme") Log.d("yu--", "host:$host") Log.d("yu--", "path:$path") Log.d("yu--", "version:$version name:$name") Log.d("yu--", "open:$open")日志:
D/yu--: scheme:taobao D/yu--: host:app D/yu--: path:/path D/yu--: version:1.0 name:zhaoyanjun D/yu--: open:trueencode
在線 encode: http://www.jsons.cn/urlencode/
query要編碼,否則使用系統方法直接解析會失敗。
為什么要編碼,舉個例子,我有兩個參數:
- 參數1:h5=https://baidu.com/step?_bid=11&version=1
- 參數2:version=1234
完整的 scheme 如下:
taobao://app/path?h5=https://baidu.com/step?_bid=11&version=1&&version=1234下面獲取分別獲取參數 h5、version
val h5 = uri.getQueryParameter("h5") val version = uri.getQueryParameter("version")結果: h5:https://baidu.com/step?_bid=11 version:1顯然獲取的值,不是我們想要的正確的值,下面我們將 整個 query 參數編碼,在看看效果。編碼后的 scheme 如下:
參數一編碼前:https://baidu.com/step?_bid=11&version=1參數一編碼后:https%3A%2F%2Fbaidu.com%2Fstep%3F_bid%3D11%26version%3D1參數二編碼前:1234 參數二編碼后:1234把兩個參數組合起來,完整的 scheme 如下:
taobao://app/path?h5=https%3A%2F%2Fbaidu.com%2Fstep%3F_bid%3D11%26version%3D1&version=1234后去相關參數如下:
D/yu--: scheme:taobao D/yu--: host:app D/yu--: path:/path D/yu--: h5:https://baidu.com/step?_bid=11&version=1 D/yu--: version:1234h5如何通過scheme喚起app
在 Activity 里添加 scheme 值
<activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><!-- scheme 開始 --><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><category android:name="android.intent.category.APP_BROWSER" /><dataandroid:host="app"android:path="/path"android:scheme="taobao" /></intent-filter><!-- scheme 結束 --></activity>WEB 端通過調用 taobao://app/path?query1=1&query2=true 便能打開這個Activity。其中 scheme 和 host 是必須的,另外的看需求。
通過WEB端打開
<!DOCTYPE html> <html> <head><title>test</title> </head> <body><a href="taobao://app/path?query1=1&query2=true">打開APP</a> </body> <html>核心就是一段 Schema 協議的 URL,scheme、host 是打開APP頁面所必須的。傳遞的參數都可以在APP頁面中獲取到。
通過另一個APP打開
val intent = Intent(Intent.ACTION_VIEW,Uri.parse("taobao://app/path?query1=1&query2=true")) startActivity(intent)獲取 scheme 值
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val uri = intent.dataif (uri != null) {val scheme = uri.schemeval host = uri.hostval path = uri.pathval query1 = uri.getQueryParameter("query1")val query2 = uri.getQueryParameter("query2")Log.d("yu--", "scheme:$scheme")Log.d("yu--", "host:$host")Log.d("yu--", "path:$path")Log.d("yu--", "query1:$query1")Log.d("yu--", "query2:$query2")}}}編碼、解碼
- 字符串編碼、解碼
- scheme 解碼
總結
以上是生活随笔為你收集整理的Android通过Scheme协议打开APP界面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android gradle自定义钉钉群
- 下一篇: Android骨架屏实现方案