Android如何从外部跳进App

博客出自:刘兆贤的博客_CSDN博客-Java高级,Android旅行,Android基础领域博主,转载注明出处! All Rights Reserved !

这个问题解决了两天时间,因为网上没有完整的解决方案,解决后分享一下给大家!

原理:路由。

通过配置scheme、host和path等信息即Filter,告诉项目自己可以处理哪些信息,并且将参数带过去处理的一种思路。

解决这个问题有两个作用:

1、不用打开App直接进入某页面

2、实现App分享到外部,同时由外部进入App的闭环。

这个话题可以分两方面来讲,一方面是从微信进入App,另一方面是从网页进入App。

咱们拿更新:通过浏览器直接打开Android应用程序 - Cundong's log - OSCHINA - 中文开源技术交流社区当例子来讲一下

主要通过scheme、host、path、pathPrefix等data信息来区分

两个方案都需要给跳转到的Activity加入intent-filter信息,例如

<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="cundong" android:host="splash"/>

</intent-filter>

首先我们来讲微信端进入App,场景:从App分享内容到微信,再从微信直接打开App。

第一步,注册微信公众平台,相关企业信息,下载链接,Logo等 都填写完毕

第二步,分享时使用WXAppExtendObject,把链接url赋值给extInfo

    /**
     * 创建微信分享消息体
     *
     * @return
     */
    private SendMessageToWX.Req buildWXBody() {
        WXAppExtendObject webObj = new WXAppExtendObject();
        webObj.extInfo = mShareUrl;
        // 用WXTextObject对象初始化一个WXMediaMessage对象
        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = webObj;
        msg.title = buildTitle(mShareTitle);
        // 发送文本类型的消息时,title字段不起作用
        // msg.title = "Will be ignored";
        msg.description = buildShareText(false, mShareContent);
        if (mShareBgPic == null) {
            mShareBgPic = ImageUtils.drawBg4Bitmap(Color.WHITE, mSharePic);
        }
        int size = ImageUtils.getBitmapSize(mShareBgPic);
        if (size > 1024 * 32) {//添加对大图片的处理
            mShareBgPic = ImageUtils.compress(mShareBgPic, 25);
        }
        msg.setThumbImage(mShareBgPic);
        // 构造一个Req
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = buildTransaction("weixin"); // transaction字段用于唯一标识一个请求
        req.message = msg;
        return req;
    }

第三步,在IWXAPIEventHandler接口的onReq方法的req.getType()=ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX时,发起你的跳转

第四步,跳转时需要数据,数据从哪里来,从WXEntryActivity类中onCreate方法的getIntent对象里来

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 接收自微信的Intent
        intent = getIntent();
        try {
            if (intent != null) {
                api = WXAPIFactory.createWXAPI(this,WX_APP_ID, true);
                // 注册处理函数
                api.handleIntent(intent, this);
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
    // 微信发送请求到第三方应用时,会回调到该方法
    @Override
    public void onReq(BaseReq req) {
        switch (req.getType()) {
            case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
                break;
            case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
                Intent intentWeb = new Intent(this, MainActivity.class);
                try {
                    //有可能微信没传过来相关值
                    if (intent.hasExtra("_wxappextendobject_extInfo")) {
                        Bundle bundle = intent.getExtras();
                        String url = bundle.getString("_wxappextendobject_extInfo");
                        String title = bundle.getString("_wxobject_title");
                        if (!TextUtils.isEmpty(url)) {
                            intentWeb = new Intent(this, WebActivity.class);
                            intentWeb.putExtra(ILXConstants.KEY_INTENT_TITLE, title);
                            intentWeb.putExtra(ILXConstants.KEY_INTENT_URL, url);
                            intentWeb.putExtra(ILXConstants.KEY_INTENT_FROM, "wx");
                        }
                    }
                } catch (Exception e) {
                    // TODO: handle exception
                }
                startActivity(intentWeb);
                finish();
                break;
            default:
                break;
        }
    }

从微信进入App就这样结束了。

-------------------我是分割线------------------------

接着来讲网页端,由于webView的限制,如微信、微博等都采用这个控件,所以只能分享到网页,再进入App。

原理如下:

<div>
            <a id="J-call-app" href="javascript:;" class="label">立即打开&gt;&gt;</a>
            <input id="J-download-app" type="hidden" name="storeurl" value="http://apk.hiapk.com/appinfo/com.tmall.wireless">
        </div>
 
        <script>
            (function(){
                var ua = navigator.userAgent.toLowerCase();
           
                var t;
                var url=document.location;
                var config = {
                    /*scheme:必须*/
                    scheme_IOS: 'cundong://',
                    scheme_Adr: 'cundong://splash',
                    download_url: document.getElementById('J-download-app').value,
                    timeout: 600
                };
 
                function openclient() {
                    var startTime = Date.now();
 
                    var ifr = document.createElement('iframe');
 
                    //alert(config.scheme_Adr);
                    ifr.src = ua.indexOf('os') > 0 ? config.scheme_IOS : config.scheme_Adr;
                    ifr.style.display = 'none';
                    document.body.appendChild(ifr);
 
                    var t = setTimeout(function() {
                        var endTime = Date.now();
 
                        if (!startTime || endTime - startTime < config.timeout -200) { 
                            window.location = config.download_url;
                        } else {
                                   window.location.href=ifr.src.replace("http://","cundong://");;
                        }
                    }, config.timeout);


 
                    window.onblur = function() {
                        clearTimeout(t);
                    }
                }
                window.addEventListener("DOMContentLoaded", function(){
                    document.getElementById("J-call-app").addEventListener('click',openclient,false);
 
                }, false);
            })()
        </script>

点击打开四个字后,执行一个js,在限制时间内,如果可以打开App则打开,否则进入下载页

解决这个问题的基本思路就是这样,欢迎大家交流探讨!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘兆贤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值