微信分享成功后回调问题

如何让我们的App接收到微信的反馈?

1. 在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity,并在manifest文件里面加上exported属性,设置为true。 

2. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法。

3. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法。当微信发送请求到你的应用,将通过IWXAPIEventHandler接口的onReq方法进行回调,类似的,应用请求微信的响应结果将通过onResp回调。

其中,必须要新建WXEntryActivity类,实现IWXAPIEventHandler接口,同时该文件必须在xxx.xxx.xxx.wxapi包下,回调才有作用

下面说下我分享回调成功后的心得:

1:微信分享成功之后回调的实现是如此的坑爹。

2:在程序中我们并不需要自己主动的去启动WXEntryActivity,只需要把回调后的逻辑处理代码在onResq()这个回调接口中实现,处理完逻辑后将该Activity finish()掉就可以了,为了避免用户发现回调成功后出的toast是在一个新的Activity中,我们可以设置WXEntryActivity的主题为透明样式,设置无动画,这样用户就不会察觉到回调成功后是启动了一个新的Activity。

3:在WXEntryActivity中一定要参考官方的文档,实现onNewIntent(Intent intent)方法,这个方法为微信客户端分享成功后回调我们应用中的WXEntryActivity类,通过newintent(Intent intent)来启动WXEntryActivity类,并在newIntent方法中通过IWXAPI接口中的handleIntent方法,注册监听,下面给出示例代码。

4:在AndroidManifase中作如下配置:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <activity  
  2.                 android:name="cn.ishuidi.shuidi.wxapi.WXEntryActivity"  
  3.                 android:launchMode="singleTop"  
  4.                 android:exported="true"  
  5.                 android:theme="@style/comment_activity">  
  6.             <intent-filter>  
  7.                 <action android:name="android.intent.action.VIEW"/>  
  8.                 <category android:name="android.intent.category.DEFAULT"/>  
  9.                 <data android:scheme="sdksample"/>  
  10.             </intent-filter>  
  11.         </activity>  


这是参考微信官方的demo进行copy的,其中android:exported="true"的意思为允许该Activity被其他应用调用,这句话很重要。


下面普及newIntent()方法的解释:

Android onNewIntent的应用

onCreate是用来创建一个Activity也就是创建一个窗体,但一个Activty处于任务栈的顶端,若再次调用startActivity去创建它,则不会再次创建。若你想利用已有的Acivity去处理别的Intent时,你就可以利用onNewIntent来处理。在onNewIntent里面就会获得新的Intent.

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @Override    
  2.         protected void onNewIntent(Intent intent) {    
  3.                 // TODO Auto-generated method stub    
  4.                 super.onNewIntent(intent);    
  5.                     
  6.         }   

如果IntentActivity处于任务栈的顶端,也就是说之前打开过的Activity,现在处于
onPause
onStop 状态的话
其他应用再发送Intent的话,执行顺序为:
onNewIntent
onRestart
onStart

onResume

1.onNewIntent(Intent intent) 是Activity类的方法.它被调用发几种情况如下:
<activity android:name=".NewIntentDemo" android:label="@string/app_name" android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
 android:launchMode="singleTask" 配置在 Mainifest 中,它保证了栈中此Activity总是只有一个,无论你启动它多少次;
Activiy配置成android:launchMode="singleTask" ,在点Home键退出Activity而再次启动新的Intent进来时onNewIntent(Intent intent) 方法会被调用到;

2.利用已有的Acivity去处理别的Intent时,你就可以利用onNewIntent来处理,通常被用在有搜索请求的activity,而其该activity有好几个intent-filter,该方法被调用的前提
a、该activity设置如下属性 android:launchMode="singleTop"。
b、该activity已经处在栈的顶端,通过其他的方法又重新启动该acitvity时被调用,如搜索,这时oncreate()方法不调用。

看完onnewIntent()方法的介绍后,大家应该明白一点了,我们就是将WXEntryActivity设置成singleTop了。

下面给出我在项目中实现的示例代码,代码量很少,读者可以稍作修改就可以使用,框架是正确的。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package cn.ishuidi.shuidi.wxapi;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.widget.Toast;  
  7. import cn.ishuidi.openutils.OpenUtils;  
  8. import cn.ishuidi.shuidi.R;  
  9. import cn.ishuidi.shuidi.background.ShuiDi;  
  10. import cn.ishuidi.shuidi.background.data.credit.CreditManager;  
  11. import com.tencent.mm.sdk.openapi.BaseReq;  
  12. import com.tencent.mm.sdk.openapi.BaseResp;  
  13. import com.tencent.mm.sdk.openapi.IWXAPI;  
  14. import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;  
  15.   
  16. public class WXEntryActivity extends Activity implements IWXAPIEventHandler {  
  17.     private static CreditManager.KGainCreditType gainCreditType;  
  18.     private static long dataShareId;  
  19.     private IWXAPI api;  
  20.   
  21.     public static void setTypeAndDataShareId(CreditManager.KGainCreditType type, long srcId) {  
  22.         gainCreditType = type;  
  23.         dataShareId = srcId;  
  24.     }  
  25.   
  26.     @Override  
  27.     public void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.wx_entry_activity);  
  30.         initData();  
  31.     }  
  32.   
  33.     @Override  
  34.     protected void onNewIntent(Intent intent) {  
  35.         super.onNewIntent(intent);  
  36.         setIntent(intent);  
  37.         initData();  
  38.     }  
  39.   
  40.     private void initData() {  
  41.         api = OpenUtils.instance().getIWXAPI();  
  42.         api.handleIntent(getIntent(), this);  
  43.     }  
  44.   
  45.     @Override  
  46.     public void onReq(BaseReq req) {  
  47.     }  
  48.   
  49.     @Override  
  50.     public void onResp(BaseResp resp) {  
  51.         String result = null;  
  52.         switch (resp.errCode) {  
  53.             case BaseResp.ErrCode.ERR_OK: {  
  54.                 CreditManager creditManager = ShuiDi.instance().getCreditManager();  
  55.                 creditManager.submitGainCreditEventToServer(gainCreditType, dataShareId);  
  56.                 result = "分享成功";  
  57.             }  
  58.             break;  
  59.             case BaseResp.ErrCode.ERR_USER_CANCEL:  
  60.                 result = "分享取消";  
  61.                 break;  
  62.             case BaseResp.ErrCode.ERR_AUTH_DENIED:  
  63.                 result = "分享被拒绝";  
  64.                 break;  
  65.             default:  
  66.                 result = "分享返回";  
  67.                 break;  
  68.         }  
  69.   
  70.         Toast.makeText(this, result, Toast.LENGTH_LONG).show();  
  71.         this.finish();  
  72.     }  
  73. }  

好了,就说这么多了。
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页