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 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM