如何让我们的App接收到微信的反馈?
1. 在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity,并在manifest文件里面加上exported属性,设置为true,允许该Activity被其他应用调用,这句话很重要。
<activity android:name="你的APP包名.wxapi.WXEntryActivity" android:launchMode="singleTop" android:exported="true" android:theme="@style/comment_activity"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="sdksample"/> intent-filter> activity>
2. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法。
3. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法。当微信发送请求到你的应用,将通过IWXAPIEventHandler接口的onReq方法进行回调,类似的,应用请求微信的响应结果将通过onResp回调。
其中,必须要新建WXEntryActivity类,实现IWXAPIEventHandler接口,同时该文件必须在${yourAppPackageName}.wxapi包下,回调才有作用
在程序中我们并不需要自己主动的去启动WXEntryActivity,只需要把回调后的逻辑处理代码在onResq()这个回调接口中实现,处理完逻辑后将该Activity finish()掉就可以了.
在WXEntryActivity中一定要参考官方的文档,实现onNewIntent(Intent intent)方法,这个方法为微信客户端分享成功后回调我们应用中的WXEntryActivity类,通过newintent(Intent intent)来启动WXEntryActivity类,并在newIntent方法中通过IWXAPI接口中的handleIntent方法,注册监听
下面普及newIntent()方法的解释:
Android onNewIntent的应用
onCreate是用来创建一个Activity也就是创建一个窗体,但一个Activty处于任务栈的顶端,若再次调用startActivity去创建它,则不会再次创建。若你想利用已有的Acivity去处理别的Intent时,你就可以利用onNewIntent来处理。在onNewIntent里面就会获得新的Intent.
如果IntentActivity处于任务栈的顶端,也就是说之前打开过的Activity,现在处于onPause onStop状态的话,其他应用再发送Intent的话,执行顺序为:
onNewIntent -> onRestart -> onStart -> onResume
onNewIntent(Intent intent) 是Activity类的方法.它被调用发几种情况如下:
1. 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了。
示例代码:
public class WXEntryActivity extends Activity implements IWXAPIEventHandler { private static CreditManager.KGainCreditType gainCreditType; private static long dataShareId; private IWXAPI api; public static void setTypeAndDataShareId(CreditManager.KGainCreditType type, long srcId) { gainCreditType = type; dataShareId = srcId; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.wx_entry_activity); initData(); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); initData(); } private void initData() { api = OpenUtils.instance().getIWXAPI(); api.handleIntent(getIntent(), this); } @Override public void onReq(BaseReq req) { } @Override public void onResp(BaseResp resp) { String result = null; switch (resp.errCode) { case BaseResp.ErrCode.ERR_OK: { CreditManager creditManager = ShuiDi.instance().getCreditManager(); creditManager.submitGainCreditEventToServer(gainCreditType, dataShareId); result = "分享成功"; } break; case BaseResp.ErrCode.ERR_USER_CANCEL: result = "分享取消"; break; case BaseResp.ErrCode.ERR_AUTH_DENIED: result = "分享被拒绝"; break; default: result = "分享返回"; break; } Toast.makeText(this, result, Toast.LENGTH_LONG).show(); this.finish(); } }
1 public class EntryActivity extends Activity implements IWXAPIEventHandler { 2 3 @Override 4 public void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 7 if (Wechat.instance.getWxAPI() == null) { 8 startMainActivity(); 9 } else { 10 Wechat.instance.getWxAPI().handleIntent(getIntent(), this); 11 } 12 } 13 14 @Override 15 protected void onNewIntent(Intent intent) { 16 super.onNewIntent(intent); 17 18 setIntent(intent); 19 20 if (Wechat.instance.getWxAPI() == null) { 21 startMainActivity(); 22 } else { 23 Wechat.instance.getWxAPI().handleIntent(intent, this); 24 } 25 } 26 27 @Override 28 public void onResp(BaseResp resp) { 29 XYMLogUtil.d(Wechat.TAG, resp.toString()); 30 31 if (Wechat.instance.getCurrentCallbackContext() == null) { 32 startMainActivity(); 33 return ; 34 } 35 36 switch (resp.errCode) { 37 case BaseResp.ErrCode.ERR_OK: 38 switch (resp.getType()) { 39 case ConstantsAPI.COMMAND_SENDAUTH: 40 auth(resp); 41 break; 42 43 case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX: // 分享给好友、朋友圈 44 case ConstantsAPI.COMMAND_PAY_BY_WX: 45 default: 46 Wechat.instance.getCurrentCallbackContext().success(); 47 break; 48 } 49 break; 50 case BaseResp.ErrCode.ERR_USER_CANCEL: 51 Wechat.instance.getCurrentCallbackContext().error(Wechat.ERROR_WECHAT_RESPONSE_USER_CANCEL); 52 break; 53 case BaseResp.ErrCode.ERR_AUTH_DENIED: 54 Wechat.instance.getCurrentCallbackContext().error(Wechat.ERROR_WECHAT_RESPONSE_AUTH_DENIED); 55 break; 56 case BaseResp.ErrCode.ERR_SENT_FAILED: 57 Wechat.instance.getCurrentCallbackContext().error(Wechat.ERROR_WECHAT_RESPONSE_SENT_FAILED); 58 break; 59 case BaseResp.ErrCode.ERR_UNSUPPORT: 60 Wechat.instance.getCurrentCallbackContext().error(Wechat.ERROR_WECHAT_RESPONSE_UNSUPPORT); 61 break; 62 case BaseResp.ErrCode.ERR_COMM: 63 Wechat.instance.getCurrentCallbackContext().error(Wechat.ERROR_WECHAT_RESPONSE_COMMON); 64 break; 65 default: 66 Wechat.instance.getCurrentCallbackContext().error(Wechat.ERROR_WECHAT_RESPONSE_UNKNOWN); 67 break; 68 } 69 70 finish(); 71 } 72 73 @Override 74 public void onReq(BaseReq req) { 75 finish(); 76 } 77 78 protected void startMainActivity() { 79 Intent intent = new Intent(); 80 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 81 intent.setPackage(getApplicationContext().getPackageName()); 82 getApplicationContext().startActivity(intent); 83 } 84 85 protected void auth(BaseResp resp) { 86 SendAuth.Resp res = ((SendAuth.Resp) resp); 87 88 XYMLogUtil.d(Wechat.TAG, res.toString()); 89 90 JSONObject response = new JSONObject(); 91 try { 92 response.put("code", res.code); 93 response.put("state", res.state); 94 response.put("country", res.country); 95 response.put("lang", res.lang); 96 } catch (JSONException e) { 97 XYMLogUtil.e(Wechat.TAG, e.getMessage()); 98 } 99 100 Wechat.instance.getCurrentCallbackContext().success(response); 101 } 102 }