项目需求:支付密码修改,只可以通过手机修改支付密码,1没有绑定手机的先绑定手机2,绑定手机了可以直接修改密码。(次要)
主要问题就在绑定手机上,如果绑定了手机想要更换要先解绑原来的手机,解绑后可以绑定新手机。
最主要的问题在与先解绑手机A,然后再绑定新手机B,设为A界面与B界面。
好了废话不多说了,进入正题。
解绑手机,与绑定新手机都要初始化短信sdk(也可以不指初始化一个,但是在要求B界面中收到验证码又要对B中的控件进行setEnable操作,所以不适合只在A中初始化sdk),我选择的是在两个页面都初始化了sdk。两个界面都复写了ondestory()函数,如下:
@Override protected void onDestroy() { // TODO Auto-generated method stub SMSSDK.unregisterAllEventHandler(); Log.d("TAG", "UserSecuritySecondMobileSecond-->onDestroy"); super.onDestroy(); }
在新开的页面会初始化SMSSDK,代码如下:
private void initMobileSdk() { SMSSDK.initSDK(this, "523e80460f6c", "6763340f06586f22eaa128dbc2c2c0cd"); EventHandler eh = new EventHandler() { @Override public void afterEvent(int event, int result, Object data) { Message msg = new Message(); msg.arg1 = event; msg.arg2 = result; msg.obj = data; handler.sendMessage(msg); } }; SMSSDK.registerEventHandler(eh); }
与他配套的Handler:
Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); int event = msg.arg1; int result = msg.arg2; Object data = msg.obj; if (result == SMSSDK.RESULT_COMPLETE) { // 短信注册成功后,返回MainActivity,然后提示新好友 if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {// 提交验证码成功 updateMobilecode(str_phone, str_code); // 先将验证码上传到服务器中,然后在handleMessage里上传手机及验证码 } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { mBindPhone.setEnabled(true); mEt_phone.setEnabled(false); UIHelper.ToastMessage(UserSecuritySecondMobileThird.this, "验证码已经发送"); } } else { ((Throwable) data).printStackTrace(); UIHelper.ToastMessage(UserSecuritySecondMobileThird.this, "验证码错误,请重试"); } } };
顺便写下,发送短信与发送验证码验证的函数:
发送短信:
SMSSDK.getVerificationCode("86", str_phone2);
发送验证码验证的函数:
SMSSDK.submitVerificationCode("86", str_phone, str_code);
问题来了,在解绑手机A中执行onDestroy()函数时,SMSSDK.unregisterAllEventHandler();里面是新开一个线程,将所有的事件Handler删除,这其中要花费多久我们无法得知,因为我们有不清楚具体的实现是什么样子的。如何在新开的线程完成执行完了SMSSDK.unregisterAllEventHandler();函数,在初始化新的SMSSDK(如果先初始化,unregisterAllEventHandler可能会把初始化的内容干掉),而且不影响用户体验。我的方法是这样的:
在新开的Activity B中,新开一个线程,sleep一段时间(1秒,因为用户1秒钟不可能输好了手机号码,点击发送,就算点击了发送,我们还要判断手机是不是正确,所以没必要担心)然后执行initMobileSdk的操作,如下:
/**
* 处理延迟初始化initMobileSdk(),为什么延迟,因为要等待前面一个Activity中短信注册中 * SMSSDK.unregisterAllEventHandler()完全结束了,才能初始化,不然初始化的就被 * 这个函数给回收了 */Handler handler1 = new Handler(); Runnable mRunnable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { Thread.sleep(1000); handler1.post(runnableui); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; Runnable runnableui = new Runnable() { @Override public void run() { // TODO Auto-generated method stub initMobileSdk(); } };
注意处理发送短消息结果的Handler我们可以不采用延迟手段,也可以在runnableui中执行。