umeng社交分享最新版5.0的跨進程使用崩潰的問題及解法-Android

先簡單介紹下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


進一步分析日誌,發現入口是
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

相關文章
相關標籤/搜索