Android问题汇总(遥远的回忆过去)

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

2019-08-05  本文已影响3人  MonkeyLei

之前没怎么涉及到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>
上一篇下一篇

猜你喜欢

热点阅读