Android 通过 Intent Filter 和 scheme 实现与js交互,也称为 deep-link
达到点击网页按钮打开App效果
参考链接
接下来结合具体的代码进行解析
按照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来设置的。
<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声明周期中进行的处理
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
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