Android中通过scheme实现网页打开App(deep-link)
Android 通过 Intent Filter 和 scheme 实现与js交互,也称为 deep-link
达到点击网页按钮打开App效果
参考
参考链接
实现
接下来结合具体的代码进行解析
首先来看 网页端 js的实现
按照stackoverflow上的说法,js中应该有一个类似于下面的结构
来看一下js的代码
其中可以看到这种结构,
scheme为shopal-c
host为 www.ushopal.com
path为product/detail
,campaign/detail
,discount/detail
等。
parameter为post_id
,post_type
,post_link
等。
这是js这边要进行的操作,而Android本地是通过Intent Filter来设置的。
Android本地代码
<activity android:name=".activity.MainActivity" android:launchMode="singleTask" android:screenOrientation="portrait"> <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:scheme="shopal-c" /> intent-filter> activity>
其中可以看到这个配置与js中的scheme是对应的。
这样就可以根据scheme在js中唤起app。
注意
唤起app之后首先就会进入配置了 配置了对应Intent Filter的Activity,这里需要注意一点:Activity的启动方式。
这里的目标Activity是singleTask
模式,是不能重复创建的。
首先看一下 在Activity声明周期中进行的处理
onCreate
Intent intent = getIntent(); String action = intent.getAction(); schemeOperate = new SchemeOperate(); if (Intent.ACTION_VIEW.equals(action)) { String url = intent.getDataString(); if (url != null) { schemeOperate.operate(this, url, new MainSearchBean()); } }
如果用户是点击应用图标进入的Activity,而不是通过scheme跳转的,那么intent.getAction的值是null,所以这里需要判断一下。
如果目标Activity处于任务栈的栈顶,那么通过scheme跳转过来的时候执行的生命周期也是onCreate
生命周期:
onCreate
onStart
onResume
onNewIntent
String action = intent.getAction(); if (Intent.ACTION_VIEW.equals(action)) { String url = intent.getDataString(); if (url != null) { schemeOperate.operate(this, url, new MainSearchBean()); } }
因为目标Activity是singleTask
,所以当目标Activity (1)已经被创建,(2)不是在栈顶,那么通过scheme跳转到目标Activity是不会执行onCreate
方法的,而是执行onNewIntent
生命周期。
生命周期:
onNewIntent
onRestart
onStart
onResume
更多相关文章
- 10个Android项目
- android http post请求
- Android日期时间格式国际化的实现代码
- Android通过代码获取ROOT权限
- Android(安卓)WIFI模块解析
- Android原生webview打开支付宝
- Android开机自启动服务的实现方法
- Android(安卓)系统自动实现开机启动
- Android(安卓)Studio系列教程三--快捷键