Android 微信分享后留在微信,没有回调的问题解决方案

网上有很多关于微信分享后没有回调的问题,大多数讲的都是一些配置不对、WXEntryActivity类的包名不对等所引起的错误。但我今天要讲的问题不是因为这些集成不当引起的问题,而是微信分享SDK本身存在的问题(或者这并不是微信SDK的bug,而是微信本身就是这样设计的)。这个问题就是,当我们分享成功后,微信会弹出一个弹窗,让用户选择“留在微信”或者“返回app”。

如果用户选择“留在微信”,那么我们的app将不会收到分享成功的回调,只有选择“返回app”时,app的WXEntryActivity类才会收到分享成功的回调。如果我们需要明确知道用户是否分享成功,并给予分享成功的用户一些奖励(如积分等),那么这个问题将是一个很大的bug。

最近我就遇到这样的需求:app引导用户分享一篇推文到微信,分享成功后奖励用户一张优惠券。但是如果用户分享成功后留在微信,app就无法接收到分享成功的回调,无法确定是否分享成功。这显然是一个很严重、不得不解决的问题。那么如何去解决这个问题呢?

我们不妨先分析一下问题的原因:用户分享成功后有两个选择,“留在微信”和“返回app”。如果用户选择“返回app”,我们这样正常接收到回调。如果用户“留在微信”,我们就无法就到回调。所以只要能检测到用户调起分享后留在了微信,就可以认为用户分享成功了。因为分享失败或者取消分享到情况下,用户是不能留在微信的,我们也是可以正常接收到失败或取消的回调的。

那么我们如何确定用户留在了微信呢?让我们看一下当用户点击“返回app”和点击“留在微信”时,当前Activity的生命周期会有什么不同,从中找出端倪。
注:当前Activity指的是调起微信分享的Activity,而不是接收微信分享回调的WXEntryActivity。
当调起微信分享时,会启动一个微信分享的页面,把当前Activity覆盖,当前Activity的生命周期会回调onPause()->onStop()。

当分享成功,点击“返回app”时,会关闭分享页面,回到当前Activity。当前Activity的生命周期会回调onRestart() ->onStart()->onResume()。

当分享成功,点击“留在微信”时,会关闭分享页面,但是不会回到当前Activity。当前Activity的生命周期会回调onRestart() ->onStart()->onStop(),不会回调onResume()。

这是因为点击“留在微信”,关闭分享页面时会让当前Activity重新启动(onRestart),但同时又启动了微信,当前Activity还没来得及显示(onResume),就被微信覆盖了(onStop)。所以不会调用它的onResume方法。

由上面生命周期回调的区别可以发现,“返回app”时会同时回调onRestart() 和onResume(),而“留在微信”时只会回调onRestart()不会回调onResume()。那么我们是否就可以认为,如果Activity回调了onRestart(),但是没有回调onResume(),就是用户留在微信的情况,也就是说用户已经分享成功了(只有分享成功的情况下才有可能留住微信)。
下面我们用代码测试一下这种想法是否可行。

private boolean isSharing;  //是否调起了分享。如果调起分享,这个值为true。
    private boolean isResume;  //Activity是否处于前台。

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("TAG", "onRestart");
        if (isSharing) {
            isSharing = false;
            //这里要延时0.2秒在判断是否回调了onResume,因为onRestart在onResume之前执行。
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    // 如果0.2秒后没有调用onResume,则认为是分享成功并且留着微信。
                    if (!isResume) {
                        Log.i("TAG", "分享成功,留在微信");
                    }
                }
            }, 200);
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("TAG", "onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("TAG", "onResume");
        isSharing = false;
        isResume = true;
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("TAG", "onPause");
        isResume = false;
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("TAG", "onStop");
    }

分享成功,点击“留在微信”后,log如下:

我们成功的检查到了用户分享成功并留在微信。证明了我们的这种方法是可行。
不过如果用户既没有点击“返回app”,也没有点击“留在微信”,而是用其他的方式退出(比如按了Home键),那么上面的方法就不可行了,我们依然无法知道用户是否分享成功。不过这种情况是极少数的。
---------------------
原文:https://blog.csdn.net/u010177022/article/details/80315499

原文地址:https://www.cnblogs.com/zhang-cb/p/9923581.html

时间: 2024-11-08 20:48:29

Android 微信分享后留在微信,没有回调的问题解决方案的相关文章

微信分享技巧、微信分享简单化、微信分享配置技巧

当前项目使用的是SpringMVC.JSP解析器 这里假定大家都用过微信分享了,所以具体使用细节就不讲解了,只分享如何快速.简洁的完成微信分享配置 一.微信分享常规的流程 比如分享一个 index.do 页面,一般步骤 1.写一个公共方法,用来生成微信分享配置参数. /** * 微信分享所需参数 */ public static Map<String, Object> getWeixinShareParams(String ticket, String appid, String url) {

android 项目 分享图片到微信

慕课网学习项目 AlertDialog 对话框设置 http://www.cnblogs.com/tyks/p/5202812.html .9.png的编辑及使用 sdk->tools->draw9patch.bat 微信API的调用 package com.dongni.wxshare; import com.tencent.mm.sdk.modelmsg.SendMessageToWX; import com.tencent.mm.sdk.modelmsg.WXImageObject; i

Android实现分享内容到微信朋友圈

原文地址:http://yanwushu.sinaapp.com/android_wechat_share/ 由于需求,要实现在应用中实现分享文字+图片到微信朋友圈.在网上找了一些资料,总结如下: 思路 1.使用android的intent实现应用程序之间的通信,将信息通过intent传递给微信(文章后面资源链接中有案例).这种方式的局限性在于 a.只能发送图片,而不是(文字或者图片+文字). b.设备必须安装微信才能实现分享. 2.使用微信的官方sdk包,实现发送文字+图片发送到朋友圈.这种方

微信分享后跳回项目,为何不执行onResp

我是把分享的代码写在ShareViewController.m中的,不是像DEMO中通过委托让AppDelegate.m中来执行的.现在分享都可以了,也能跳回自己都项目,就是onResp执行不了. 放在AppDelegate里 在 [WXApi handleOpenURL:url delegate:self] 这个self 换成 ShareViewController的实例 - (BOOL)application:(UIApplication *)application handleOpenUR

java 微信授权后获取微信用户信息昵称乱码问题 解决

String getUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+"&openid="+openid+"&lang=zh_CN";URL url1 = new URL(getUserInfoUrl);HttpURLConnection urlConnection = (HttpURLConnection)url1.

微信分享功能不可用+不能产生回调

之前微信分享一直正常可用,可最近报出微信分享后不能按规定的图片描述链接分享,而且不能产生回调导致不能通过分享增加用户参与活动次数,老代码如下: document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() { window.shareData = { "imgUrl": "{$shareimg}", "timeLineLink": "{$shareli

[转] Android:微信授权登录与微信分享全解析

https://wohugb.gitbooks.io/wechat/content/qrconnent/refresh_token.html http://blog.csdn.net/xiong_it/article/details/48317527 PS: access_token是微信认证成功和微信平台做交互用的,access_token有2小时有效期.如果access_token过期后,使用refresh_token获得新的access_token.refresh_token的有效期为30

Android:微信授权登录与微信分享全解析

前言 在移动互联网浪潮中,联网APP已经把单机拍死在沙滩上,很多公司都希望自家应用能够有一套帐号系统,可是许多用户却并不一定买账:我凭啥注册你家应用的帐号?微博,微信,QQ几乎成了每个人手机中的必装应用,于是微信,微博,QQ说了:来来来,你们都可以用我家的帐号登录你家应用,只要你遵循OAuth2.0协议标准就行.于是第三方社交帐号登陆成为了许多新兴应用的选择,由于腾讯官方微信开放平台的在线文档相对最新的SDK有些出入,并且登录相关的文档结构次序有些紊乱,今天就把我的一些经验记录在此,对微信开放平

Android集成微信分享的要点及源码示例

如今,社会化分享成了App必不可少的一个功能,而其中最重要的莫过于微信分享,由于微信庞大的用户群及活跃度,因此我们的App往往都需要集成微信分享,微信开放平台也提供了相应的分享SDK.鉴于看到很多人说调不起微信分享,下面就来分享下自己的经验以及在集成微信分享过程中需要注意的地方,最终会提供自己封装好的微信分享源码示例. 其实集成的步骤在微信开放平台的文档指南中已经写的很清楚了: 1.申请AppID.这一步需要在微信开放平台注册你的App就可以了,注意的是需要使用正式的keystore签名你的Ap