zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    webpack基础
    LeetCode232. 用栈实现队列做题笔记
    mysql 时间加减一个月
    leetcode 1381. 设计一个支持增量操作的栈 思路与算法
    LeetCode 141. 环形链表 做题笔记
    leetcode 707. 设计链表 做题笔记
    leetcode 876. 链表的中间结点 做题笔记
    leetcode 143. 重排链表 做题笔记
    leetcode 1365. 有多少小于当前数字的数字 做题笔记
    LeetCode1360. 日期之间隔几天 做题笔记
  • 原文地址:https://www.cnblogs.com/zhang-cb/p/9923581.html
Copyright © 2011-2022 走看看