日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Android通过Scheme协议打开APP界面

發布時間:2024/9/30 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:true

encode

在線 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:1234

h5如何通過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")}}}

編碼、解碼

  • 字符串編碼、解碼
/*** 編碼*/private fun encode(url: String): String {return URLEncoder.encode(url, "UTF-8")}/*** 解碼*/private fun decode(url: String): String {return URLDecoder.decode(url, "UTF-8")}
  • scheme 解碼
/*** 獲取解碼后的參數*/private fun getDecodeParams(uri: Uri, key: String): String? {runCatching {return URLDecoder.decode(getParams(uri, key), "UTF-8")}return null}/*** 獲取參數*/private fun getParams(uri: Uri, key: String): String? {runCatching {return uri.getQueryParameter(key)}return null}

總結

以上是生活随笔為你收集整理的Android通过Scheme协议打开APP界面的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。