Android中通过scheme实现网页打开App(deep-link)

Android 通过 Intent Filter 和 scheme 实现与js交互,也称为 deep-link

达到点击网页按钮打开App效果

参考

参考链接

这里写图片描述

实现

接下来结合具体的代码进行解析

首先来看 网页端 js的实现

按照stackoverflow上的说法,js中应该有一个类似于下面的结构

<a href="my.special.scheme://other/parameters/here">

来看一下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>

其中可以看到<data android:scheme="shopal-c" />这个配置与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

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页