先簡單介紹下5.0版的變化。5.0最大的特點是調用簡單,採用了鏈式語法,形如:java
new ShareAction(context).setPlatform(share_media) .withText(content).withTitle(title) .withMedia(icon) .withTargetUrl(url) .share();
其次,API更加靈活,支持分享按鈕的點擊回調;
最後,採用了最新的sdk(新浪微博原生體驗更好、支持易信)。android
可是有一個很大的問題,那就是當分享代碼不在默認的進程(如下稱main進程)裏時,回調會報空指針異常。api
好比在AndroidManifest.xml新開了一個進程用來打開h5頁面,點了微信分享,而後點取消,從微信返回APP的時候就報空指針異常崩潰了(別和我說你不知道新開進程的好處和意義,看我微信朋友圈1月4日分享的《微信客戶端架構演進之路》吧)。AndroidManifest.xml的配置以下,關鍵是紅色代碼部分新開了一個叫tools的進程:微信
<activity
android:name=".ACWebview"
android:process=":tools"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="makai" />
</intent-filter>
</activity>
崩潰日誌以下:架構
java.lang.RuntimeException:Unable to start activity ComponentInfo{com.xxx/com.xxx.wxapi.WXEntryActivity}: java.lang.NullPointerException android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2189) ...... cause by: java.lang.NullPointerException: com.umeng.socialize.handler.UMWXHandler.onShareCallback(UMWXHandler.java:462) com.umeng.socialize.handler.UMWXHandler$5.onResp(UMWXHandler.java:487) com.umeng.socialize.weixin.view.WXCallbackActivity.onResp(WXCallbackActivity.java:52) com.tencent.mm.sdk.openapi.WXApiImplV10.handleIntent(Unknown Source) com.umeng.socialize.weixin.view.WXCallbackActivity.onCreate(WXCallbackActivity.java:30) android.app.Activity.performCreate(Activity.java:5251) android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2153) android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2238) android.app.ActivityThread.access$800(ActivityThread.java:138) android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201) android.os.Handler.dispatchMessage(Handler.java:102) android.os.Looper.loop(Looper.java:136) android.app.ActivityThread.main(ActivityThread.java:5016) java.lang.reflect.Method.invokeNative(Native Method) java.lang.reflect.Method.invoke(Method.java:515) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608) dalvik.system.NativeStart.main(Native Method)
根據上面的日誌,空指針異常的緣由是UMWXHandler.java的回調umShareListener爲null(以下圖,至於爲何是null,由於sdk不是咱們寫的,沒法從sdk層面去解決故沒有去深究,但咱們要從應用層面去解決問題):app
![](http://static.javashuo.com/static/loading.gif)
進一步分析日誌,發現入口是
com.umeng.socialize.weixin.view.WXCallbackActivity.onCreate(WXCallbackActivity.java:30)
想起咱們工程裏有一個叫WXEntryActivity.java的繼承了它,既然是onCreate報的異常,那能夠try catch捕捉這個異常以防止崩潰。說幹就幹,代碼以下:ide
import android.os.Bundle; import com.umeng.socialize.weixin.view.WXCallbackActivity; public class WXEntryActivity extends WXCallbackActivity { @Override protected void onCreate(Bundle savedInstanceState) { try { super.onCreate(savedInstanceState); }catch (Exception e){ finish(); } } }
由此跨進程調用分享取消時崩潰的問題解決了。oop
同理微博的那個WBShareActivity.java也相似處理了吧。url