最近在项目中遇到 web 唤起 Android app 的需求,实现很简单,简单记录下实现方式与背后原理。
实现
先不管唤起的原理,用一个简单的例子描述它的实现:
首先需要在 AndroidManifest.xml 中定义 scheme,scheme 不能和 http、https、ftp、sms、mailto 等已使用的相同。
|
|
下面是测试网页:
|
|
上面的链接中有 name 和 title 两个参数,app 也能接收到,所以在唤起 app 时也能传一些数据
|
|
原理
my.scheme://my.host?name=xxx&title=xxx
其实也是一个链接,为什么点击这个链接浏览器就会启动相应的 app 呢?
其实关键在 WebView 的 WebViewClient 的 shouldOverrideUrlLoading 方法,基本上所有的浏览器都会有类似的实现,下面分析 Android 浏览器的源码。
Android 6.0 的原生浏览器的 shouldOverrideUrlLoading 方法的核心实现在 UrlHandler 这个类中。
|
|
从上面第 5 行代码中可以看到 scheme 也不能为 about
,这是原生浏览器内部用的,唤起 app 的关键在第 10 行的 startActivityForUrl 方法。
|
|
上面 22 行intent.addCategory(Intent.CATEGORY_BROWSABLE);
也可以看出我们之前在 <category android:name="android.intent.category.BROWSABLE" />
的原因。
而如果第三方的浏览器在这个地方对 scheme 屏蔽,就可以让 web 唤起 app 实效,微信中网页不能唤起应用就是这个原因。