美文网首页Android问题汇总(遥远的回忆过去)
linkedme - “一键跳转”到APP内的具体相应页面

linkedme - “一键跳转”到APP内的具体相应页面

作者: MonkeyLei | 来源:发表于2019-08-05 09:03 被阅读3次

    之前没怎么涉及到Wap端跳转打开App的操作。因为项目有需求就顺便记录下。 一开始我们都是常规的scheme_name配置,然后wap简单的弄个<ahref="scheme_name://www.heyclock.me/test?id=12587">gogog</a>

    这种方式相对比较简单,但是也有很多问题。 像微信、qq、某些渣渣浏览器可能会过滤掉这些scheme,不支持这种方式。 可能需要跟某些渣渣合作吧。。。fuck....

    看配置 - 在某个页面,一般是SplashActivity页面下面包含这个过滤器:

    <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="fucksb" />
    </
    intent-filter
    >

    当然Wap端通过fucksb这个scheme唤起时,你就可以启动并且接收一些参数 - 比如从头今日头条进入淘宝的某个商品页面(我们的隐私都被泄漏了,你看京东,淘宝等,基本上头条已经把你的浏览信息获取到了。可恶的某些购物app,非得把你的信息留存,然后提供给第三方app,然后给自己增加流量,同时给第三方带来广告收益),可恶呀!

    当启动页面时就可以获取一些scheme后面附带的参数了。 至于想获取啥,看你们规定传的参数信息了....

         String scheme = intent.getScheme();
            Uri uri = intent.getData();
            System.out.println("scheme:"+scheme);
            if (uri != null) {
                String host = uri.getHost();
                String dataString = intent.getDataString();
                String id = uri.getQueryParameter("id");
                String path = uri.getPath();
                String path1 = uri.getEncodedPath();
                String queryString = uri.getQuery();
                System.out.println("host:"+host);
                System.out.println("dataString:"+dataString);
                System.out.println("id:"+id);
                System.out.println("path:"+path);
                System.out.println("path1:"+path1);
                System.out.println("queryString:"+queryString);
            }
    
    

    到此简单的启动和参数基本没什么了。 试了五款手机浏览器,基本三款可以支持。 qq,微信貌似不行呀。。 So,我们要解决。好吧,懒得和tecent啥的打交道。。。直接第三方LinkedME。。。。

    LinkedME,企业级深度链接(Deep Linking)服务平台 打波广告,记得给我vip呀,终身免费呀。哈哈。。。。

    直接给个集成文档就行 Android SDK · LinkedME文档中心

    1. 前面一些步骤,没什么说的,自己照着整就行

    2.其中:

    2.1 若应用需要向前兼容到Android 4.0以下版本,请在基类(如:BaseActivity)中添加如下代码以便管理Session - 这个地方不管了,4.0就算了。

    2.2 添加深度链接(DeepLink)跳转逻辑

    其实它的思路是这样的:A> 配置了scheme的页面作为唤醒启动页面,这个和常规普通做法一样,只是多了很多linkme自定义的一些参数,加密什么的。。

    B> 然后启动页面后,比如启动的是SplashActivity页面,然后进入HomeActivity页面,由于我们在HomeActvity页面配置了如下,所以当进入主页后就会开启跳转功能 - 跳转到MiddleActvity页面进行逻辑处理和跳转

     在App首页(也称主页,例如:MainActivity)的onResume()方法中调用LinkedME.getInstance().setImmediate(true)方法,开启跳转功能。示例如下:
    
    @Override
    protected void onResume() {
        super.onResume();
        LinkedME.getInstance().setImmediate(true);
    }
    

    而MiddleActivity我们是配置在Application里面的

      //设置处理跳转逻辑的中转页,MiddleActivity详见后续配置
        LinkedME.getInstance().setHandleActivity(MiddleActivity.class.getName());
    

    所以自然而然这个linkme就可以记录这些信息,然后进行相应的自己处理。

    总结一下两种方式:

    1. Splash(配置了linkme的scheme)->Home->Middle->xxx页面;

    2. Splash(配置了linkme的scheme)->Home->null

    一个是继续跳转到指定页面, 一个是单纯的启动而已....看需求自己弄咯....

    其实了,官方文档是这样的:有一个单独的UriSchemeProcessActivity页面,这个页面用来配置scheme,也就是作为跳转启动页,类似splash页面。 通过这个页面做类似推送消息从通知栏跳转到置顶页面的功能,对啊,就是Splash了呀。

    所以,如果你有了相关的处理,你就直接配置到Splash下面就可以了。没必要再搞一个这个启动页面啥的。。。

    而这个里面的官方处理是唤起App自身,然后关闭当前页面。其实都可以啦。。看你自己怎么弄了。 反正了解了它的逻辑流程就行,别的自己修改就好。

    嗮下我的中间处理页面:

       package com.xxxxx.app.activity;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    
    import com.xxxxxx.app.bean.AppChildPageChangeBean;
    import com.xxxxxxxxx.app.bean.AppPageChangeBean;
    import com.microquation.linkedme.android.LinkedME;
    import com.microquation.linkedme.android.util.LinkProperties;
    
    import org.greenrobot.eventbus.EventBus;
    
    import java.util.HashMap;
    
    public class MiddleActivity extends AppCompatActivity {
    // ...
        /**
         * 解析深度链获取跳转参数,开发者自己实现参数相对应的页面内容
         * 通过LinkProperties对象调用getControlParams方法获取自定义参数的HashMap对象,
         * 通过创建的自定义key获取相应的值,用于数据处理。
         */
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (getIntent() != null) {
                //获取与深度链接相关的值
                LinkProperties linkProperties = getIntent().getParcelableExtra(LinkedME.LM_LINKPROPERTIES);
                if (linkProperties != null) {
                    Log.e("LinkedME-Demo", "Channel " + linkProperties.getChannel());
                    Log.e("LinkedME-Demo", "control params " + linkProperties.getControlParams());
                    Log.e("LinkedME-Demo", "link(深度链接) " + linkProperties.getLMLink());
                    Log.e("LinkedME-Demo", "是否为新安装 " + linkProperties.isLMNewUser());
                    //获取自定义参数封装成的hashmap对象,参数键值对由集成方定义
                    HashMap<String, String> hashMap = linkProperties.getControlParams();
                    //根据key获取传入的参数的值,该key关键字View可为任意值,由集成方规定,请与web端商议,一致即可
                    String type = hashMap.get("type");
                    if (type != null) {
                        //根据不同的参数进行页面跳转,detail代表具体跳转到哪个页面,此处语义指详情页
                        if (type.contains("archives")) {
                            //DetailActivity类不存在,此处语义指要跳转的详情页,参数也是由上面的HashMap对象指定
                            Intent intent = new Intent(MiddleActivity.this, InfoNewsDetailActivity.class);
                            intent.putExtra("id", Integer.parseInt(hashMap.get("id")));
                            intent.putExtra("html", "");
                            startActivity(intent);
                        }else if (type.contains("news")) {
                            ///< 切换到资讯页面
                            EventBus.getDefault().post(new AppPageChangeBean(AppChildPageChangeBean.INFO_FLASH_PAGE, ""));
                        }else if (type.contains("activity")) {
                            Intent intent = new Intent(MiddleActivity.this, ActivityDetailActivity.class);
                            intent.putExtra("id",Integer.parseInt(hashMap.get("id")));
                            intent.putExtra("from", "hezuo");
                            startActivity(intent);
                        }
                    }
                }
            }
            finish();
        }
    // ...
    }
    

    因为wap端有很多类型的详情都可以跳转到置顶页面,所以我做了一些处理。你也是根据项目需求来就行。。。

    记得主页里面配置LinkedME.getInstance().setImmediate(true); 如果不想进行跳转就行LinkedME.getInstance().setImmediate(false); 这样就可以单纯的做启动....

    项目做多了,接触多了,要补的知识就越来越少了 - It's me ....

    补充一下,关于启动页过滤器的配置 - 官方有两种方式,你可能会疑惑到底都配置还是选一种:只需要修改sheme和pathPrefix即可,别的不用动。文档也说了...

      <activity
                android:name=".activity.SplashActivity"
                android:screenOrientation="portrait"
                android:theme="@style/Theme.AppCompat.Light.NoActionBar">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
                <!--Wap打开App 采用LinkedME-->
                <!--<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="xxxxx" />-->
                <!--</intent-filter>-->
                <intent-filter>
                    <!-- 此处scheme值需要替换为后台设置中的scheme值 -->
                    <!-- host禁止更改!!! -->
                    <!-- 禁止配置其他属性 -->
                    <data
                        android:host="linkedme"
                        android:scheme="xxxxx" />
                    <action android:name="android.intent.action.VIEW" />
    
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                </intent-filter>
                <!-- APP Links方式,Android 23版本及以后支持 -->
                <intent-filter android:autoVerify="true">
                    <action android:name="android.intent.action.VIEW" />
    
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                    <!-- 以下pathPrefix值需要替换为后台设置中 App ID 的值-->
                    <!-- host中设置的lkme.cc不要更改!!!-->
                    <data
                        android:host="lkme.cc"
                        android:pathPrefix="/appid"
                        android:scheme="https" />
                    <data
                        android:host="lkme.cc"
                        android:pathPrefix="/appid"
                        android:scheme="http" />
                </intent-filter>
            </activity>
    

    相关文章

      网友评论

        本文标题:linkedme - “一键跳转”到APP内的具体相应页面

        本文链接:https://www.haomeiwen.com/subject/jzhpdctx.html