如何讓我們的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 }
