最近项目要求实现微博,微信,QQ的分享功能,并且要求有分享回调,提示用户分享成功还是失败.当用户从三方应用点击分享的连接的时候,通过h5页面可以下载安装app或者直接进入app的对应页面.
关于QQ分享的配置,官方文档或者博客上都有,需要调用Tencent的方法public void shareToQQ(Activity var1, Bundle var2, IUiListener var3).第三个参数就是我们的回调监听.当我们再次回到详情页面的时候就会走onActivityResult()方法.我们通过判断requestCode是否是QQ分享的请求码就可以.如果是我们就调用这个方法Tencent.onActivityResultData(requestCode, resultCode, data, iUiListener);其他的事就不用我们关心了.但是结果调用方法进行判断的时候总是和QQ的内部逻辑不一致,当时找了好久也没有发现问题.浪费了好多时间,后来发现QQid不是最新的.因为同时进行的还有一个三方登录,QQ的id换了,结果配置文件里面的没有改.注意,ID前要拼接tencent.之所以可以分享成功是因为分享时用的id是最新的,调用的是本地的常量,但是配置文件里面不是,所以回调就会有问题.
刚开始我弹出框使用的DialogFragment实现的,而微博回调要求activity的启动类型是singleTask,这样再次进入的时候就会走onNewIntent方法,通过微博分享实例IWeiboShareAPI的handleWeiboResponse(Intent,Response).这个response要继承IWeiboHandler.Response并实现这些回调方法
@Override public void onResponse(BaseResponse baseResponse) {
if (baseResponse != null) {
switch (baseResponse.errCode) {
case WBConstants.ErrorCode.ERR_OK:
//分享成功
break;
case WBConstants.ErrorCode.ERR_CANCEL:
//分享取消
break;
case WBConstants.ErrorCode.ERR_FAIL:
//分享失败
break;
}
}
}
开始我在所有的调用分享的类里面都实现了这个方法,结果会先弹出4种选项的弹框,应该是因为我有四处写回调的原因,因为这四个activityactivity的启动方式是singleTask,都有微博的回调,这样就出问题了.所以,弹窗不能用dialogfragment实现,必须用activity实现.这样,所有的回调我们就可以再弹窗的activity上实现了,只用一处就搞定.
一开始是进来直接崩溃,原因是在onNewIntent方法中调用了微博分享对象的方法,但是这个方法只有在点击微博之后才初始化,所以加了一个标记,记录是否是点击了微博分享.
@Override protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (isWeiBo) {//判断是否点击了微博
//初始化微博
HNAHelper.thirdPard().weibo().getWeiboShareObj().handleWeiboResponse(intent, this);
}
}
解决了这个问题就出现了下个问题.
这个问题的详细描述就是我从QQ分享的页面点击进入我的详情页时,再点击分享,这个页面就会消失,又出现一个同样的详情页,再点击分享按钮时就没有问题.这个问题也看了好久,断点都跟踪不到.最后根据现象分析了一下,消失的那个详情页时三方进入是创建的,后面出来的那个详情页时分享前的那个.为什么会出现这种情况呢?原因是微博要求在配置文件中设置启动模式是singleTask.关于四种启动方式,我之前的博客有过总结,可以参考一下.回顾基础知识–第一章:Activity的生命周期和启动模式所以当我点击分享时,调用分享弹框就会把我从QQ进来是新压入栈的HomeActivity和详情页全部弹出去,展示之前的.针对这个问题,我把HomeActivity的启动模式也设置成了singleTask,这样每次调用HomeActivity都相当于重新进入这个项目,不会再有之前的activity,也不会在出现三方进来时还有回调的情况,弹吐司的情况.
这个问题是因为桌面过来的意图,虽然requestCode是分享码没错,但是resultCode却变了,并且data变成了null,所以才会分享失败的.我添加了对data是否为null的判断,问题解决了.
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 官方文档没这句代码, 但是很很很重要, 不然不会回调!
if (requestCode == Constants.REQUEST_QQ_SHARE && data != null) {
Tencent.onActivityResultData(requestCode, resultCode, data, iUiListener);
}
}
关键是一定要使用一个activity来做分享的dialog,否则就前功尽弃了.