项目需求:支付密码修改,只可以通过手机修改支付密码,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中执行。