簡介:android
首先聲明本篇文章所屬並非一個常見問題,而是多個問題綜合纔會出現,頗有可能你出現的問題並不適於本片文章且本片文章也不會解決您的問題.git
使用過度享的同窗們 都知道,在分享成功或取消以後,你的應用程序 也會知道分享的結果,可是這個結果是如何傳遞到,你們所定義的回調中的,可能你們就不太清楚了微信
今天我所碰到的問題,就和 這個機制有關app
這個機制就是 Android 的 Intent 測試
好吧雖然同是 Intent 可是所說的並非咱們經常使用的 Intent 跳轉,可是其實咱們天天都能見到他this
他就是 intent-filter ,在咱們寫一個app的時候也必定會加入一個 intent-filter那就是spa
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
已知在開發app時全部的 Activity,都須要在AndroidManifest.xml中聲明和配置.net
當前咱們加入的Intent-filter 既是在咱們啓動應用的時候,標識應用的啓動頁debug
而我如今碰到的問題既是由於某一個Intent 跳轉被錯誤的攔截了, 而具體是什麼問題還要從結果提及code
一.錯誤結果:
首先是未出錯狀態,這個頁面是錯誤入口界面,其中有5個不一樣的分享按鈕
而後是出錯時的效果這個錯誤只有在 執行微博分享的時候纔會出現(全部分享走的都是相同的封裝方法)
而朋友圈,微信,QQ,QQ空間都沒有出現這個錯誤
首先先來看一下兩種打開方式的結果:
左:
解釋:左邊的選擇結果 從界面上看來彷佛沒有什麼區別,可是仔細看會發現這和一開始選擇的界面並不同;
左邊爲一個分享選擇的 Dialog,而其實當時這個類中並無任何關於這個Dialog 的代碼.
右:
解釋:簡單明瞭如圖所示,一個空的Activity,一開始覺得是由於報錯崩潰致使的白屏,後證明並非,並不會自動跳轉且對返回鍵有正常的響應
二.錯誤環境:
1.使用友盟SDK集成分享.
2.正在進行SDK更新,從5.x版本,更新至 6.x+
3.只有新浪微博的分享出現錯誤
4.debug模式,沒法經過Key校驗,故沒彈出分享界面(其中通過測試,問題與此無關,且錯誤出現與是否分享或成功與否無關)
5.並未正確的回調分享回調
三.錯誤分析:
通過部分測試以後發現出現問題的時間點和方式和回調很是類似,故而開始排查分享回調的配置,通過排查和與文檔對照後並未發現錯誤
且同一個方法中的微信和QQ都沒有出現此問題
繼而從錯誤結果入手,分析兩種打開方式出現的緣由,當研究了友盟SDK中的回調機制後發現右側方式中彈出的Activity
頗有可能就是友盟用來接收微博分享回調結果的 WBShareCallBackActivity
查看源碼發如今源碼中onCreate方法中接收了傳入的Intent,並在處理後,在相同方法中進行了 finish操做
源碼:
protected void onCreate(Bundle var1) { super.onCreate(var1); Log.um("WBShareCallBackActivity"); UMShareAPI var2 = UMShareAPI.get(this.getApplicationContext()); this.a = (SinaSimplyHandler)var2.getHandler(SHARE_MEDIA.SINA); Log.e(this.b, "handleid=" + this.a); this.a.onCreate(this, PlatformConfig.getPlatform(SHARE_MEDIA.SINA)); if(this.getIntent() != null) { this.a(this.getIntent()); } } public void a(BaseResponse var1) { if(this.a != null) { this.a.onResponse(var1); } this.finish(); }
在思考了友盟回調邏輯後發現了這個錯誤出現的關鍵問題,也是這裏要說的重點 ,上文所說的 intent-filter
在這裏多提一嘴友盟的大體的分享流程
首先在代碼中肯定分享的參數等(略)
第二步調用SDK中的方法,喚起對應分享的供應商(新浪微博app)
通過分享邏輯後(略),由供應商頁面 發起隱式Intent跳轉
當前項目中註冊的 用於接收跳轉的Activity 會接收到此Intent
當Activity接收Intent後會打開,但在上述源碼中的Create方法中,會在處理後finish掉Activity 因此在界面上只要處理速度正常是看不到頁面打開的
當接收回調數據的 Activity被關閉後,應爲此Activity 在項目中,且在接收回調上層,故會執行發起分享頁面中的 onActivityResult方法
在onActivityResult 中的SDK方法會將參數等傳給並調用分享回調(代碼中所註冊的回調),完成回調效果
<activity android:name="com.xxx.xxx.WBShareActivity" android:configChanges="keyboardHidden|orientation" android:screenOrientation="portrait"> <intent-filter> <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
上述代碼中的action name: com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY 既是用來接收Intent的標識
這也是官方SDK中給出的寫法
這裏附上一個對intent-filter的大體解釋 http://blog.csdn.net/cnnumen/...
其實這裏基本能夠定位錯誤所在了,既是在分享結果返回跳轉時,有多個可接受此Action 的組件註冊在項目中的 AndroidManifest.xml中
並最終致使打開方式彈窗的出現,不過此處選擇正確的Activity,並不能觸發相應的代碼,不知爲什麼
4.解決問題:
以ACTION_SDK_REQ_ACTIVITY爲條件檢索整個manifest發現:
<!-- 分享選擇頁面 --> <activity android:name="com.xxx.xxx.dialog.ShareDialog" android:screenOrientation="portrait" android:theme="@style/shareDialog"> <intent-filter> <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
此項中的intent-filter與上述代碼中的 intent-filter如出一轍,就是這兩個如出一轍的 intent-filter致使隱式跳轉有多個選擇
而此項中所配置的內容既是上面圖片中的 dialog 這是以dialog 模式彈出的Activity
這樣也就解釋了爲什麼左側按鈕會彈出一個 頁面代碼中徹底沒有的 dialog
將錯誤的 intent-filter 移除以後問題解決.
5.問題溯源:
使用git配合Source 的溯源功能發現此代碼的第一次添加即在,一年前此app第一次集成友盟分享
而我這一記洛陽鏟,也挖出了從項目建立之初就埋藏的大BUG
如今從結果來看,當時爲什麼會在dialog 中添加 intent-filter 已經不得而知
不過能夠肯定的是 這一年以來 新浪的分享回調,並無被正確的執行
當時開發的同志也確實給後面開發的同窗 留下了不小的麻煩
6.尾聲
這篇文章基本到這裏也就結束了,而集成友盟分享開發中遇到的其餘問題也不在這裏繼續闡述 謝謝你們的閱讀,文中的一些邏輯與觀點,也大可能是本人的 分析與猜想,確定存在很多錯誤,歡迎留言指出,與討論 謝謝~