網上有不少關於微信分享後沒有回調的問題,大多數講的都是一些配置不對、WXEntryActivity類的包名不對等所引發的錯誤。但我今天要講的問題不是由於這些集成不當引發的問題,而是微信分享SDK自己存在的問題(或者這並非微信SDK的bug,而是微信自己就是這樣設計的)。這個問題就是,當咱們分享成功後,微信會彈出一個彈窗,讓用戶選擇「留在微信」或者「返回app」。
若是用戶選擇「留在微信」,那麼咱們的app將不會收到分享成功的回調,只有選擇「返回app」時,app的WXEntryActivity類纔會收到分享成功的回調。若是咱們須要明確知道用戶是否分享成功,並給予分享成功的用戶一些獎勵(如積分等),那麼這個問題將是一個很大的bug。微信
最近我就遇到這樣的需求:app引導用戶分享一篇推文到微信,分享成功後獎勵用戶一張優惠券。可是若是用戶分享成功後留在微信,app就沒法接收到分享成功的回調,沒法肯定是否分享成功。這顯然是一個很嚴重、不得不解決的問題。那麼如何去解決這個問題呢?app
咱們不妨先分析一下問題的緣由:用戶分享成功後有兩個選擇,「留在微信」和「返回app」。若是用戶選擇「返回app」,咱們這樣正常接收到回調。若是用戶「留在微信」,咱們就沒法就到回調。因此只要能檢測到用戶調起分享後留在了微信,就能夠認爲用戶分享成功了。由於分享失敗或者取消分享到狀況下,用戶是不能留在微信的,咱們也是能夠正常接收到失敗或取消的回調的。ide
那麼咱們如何肯定用戶留在了微信呢?讓咱們看一下當用戶點擊「返回app」和點擊「留在微信」時,當前Activity的生命週期會有什麼不一樣,從中找出端倪。
注:當前Activity指的是調起微信分享的Activity,而不是接收微信分享回調的WXEntryActivity。
當調起微信分享時,會啓動一個微信分享的頁面,把當前Activity覆蓋,當前Activity的生命週期會回調onPause()->onStop()。
post
當分享成功,點擊「返回app」時,會關閉分享頁面,回到當前Activity。當前Activity的生命週期會回調onRestart() ->onStart()->onResume()。
測試
當分享成功,點擊「留在微信」時,會關閉分享頁面,可是不會回到當前Activity。當前Activity的生命週期會回調onRestart() ->onStart()->onStop(),不會回調onResume()。
spa
這是由於點擊「留在微信」,關閉分享頁面時會讓當前Activity從新啓動(onRestart),但同時又啓動了微信,當前Activity還沒來得及顯示(onResume),就被微信覆蓋了(onStop)。因此不會調用它的onResume方法。.net
由上面生命週期回調的區別能夠發現,「返回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以下:
code
咱們成功的檢查到了用戶分享成功並留在微信。證實了咱們的這種方法是可行。
不過若是用戶既沒有點擊「返回app」,也沒有點擊「留在微信」,而是用其餘的方式退出(好比按了Home鍵),那麼上面的方法就不可行了,咱們依然沒法知道用戶是否分享成功。不過這種狀況是極少數的。
---------------------
原文:https://blog.csdn.net/u010177022/article/details/80315499 blog