umeng社交分享最新版5.0的跨进程使用崩溃的问题及解法-Android
2023-09-27 14:27:19 时间
先简单介绍下5.0版的变化。5.0最大的特色是调用简单,采用了链式语法,形如:
new ShareAction(context).setPlatform(share_media)
.withText(content).withTitle(title)
.withMedia(icon)
.withTargetUrl(url)
.share();
其次,API更加灵活,支持分享按钮的点击回调;
最后,采用了最新的sdk(新浪微博原生体验更好、支持易信)。
但是有一个很大的问题,那就是当分享代码不在默认的进程(以下称main进程)里时,回调会报空指针异常。
比如在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层面去解决故没有去深究,但我们要从应用层面去解决问题):
进一步分析日志,发现入口是
com.umeng.socialize.weixin.view.WXCallbackActivity.onCreate(WXCallbackActivity.java:30)
想起我们工程里有一个叫WXEntryActivity.java的继承了它,既然是onCreate报的异常,那可以try catch捕捉这个异常以防止崩溃。说干就干,代码如下:
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();
}
}
}
由此跨进程调用分享取消时崩溃的问题解决了。
同理微博的那个WBShareActivity.java也类似处理了吧。
相关文章
- Android存储访问及目录
- Android简易“吹一吹实现”以及录音和播放示例
- Android 进程回收之LowMemoryKiller原理篇
- 深入理解Android渲染机制
- android内存管理,Android跨进程通信导论,面试必会
- 系统更新不及时 87%的Android设备易受攻击
- 转: android app进程保活的文章列表
- 随笔之Android平台上的进程调度探讨
- Android Parcel对象详解
- 看大师解说Android高速开发框架EasyAndroid
- android的操作系统 根据进程的优先级 把进程分为了若干个等级
- 如何设置Android Studio绘制布局时的视图
- Android Binder,AIDL跨进程通讯详解与实现,看一遍就懂
- 线程和进程的区别【Android面试送命题】
- Android Input子系统:Input进程的创建,监听线程的启动
- 自定义Android菜单背景
- android EditText 设置密码锁源码
- HermesEventBus-饿了么开源的Android跨进程事件分发框架
- Android系统启动流程—— init进程zygote进程SystemServer进程启动流程
- 【Android 进程保活】应用进程拉活 ( 双进程守护 + JobScheduler 保活 | 成功率最高 | 推荐使用 )
- 【Android 进程保活】应用进程拉活 ( 双进程守护保活 )
- 【Android 进程保活】应用进程拉活 ( 账户同步拉活 | 账户同步 | 源码资源 )
- 【Android 进程保活】应用进程拉活 ( 账户同步拉活 | 账号添加 | 源码资源 )
- 【Android 进程保活】应用进程拉活 ( 系统 Service 机制拉活 | Service 组件 onStartCommand 方法分析 | 源码资源 )
- 【Android 进程保活】Low Memory Killer 机制
- 【我的Android进阶之旅】Realm数据库学习资料汇总(持续更新)