Android实现登录注册功能封装
我们都知道Android应用软件基本上都会用到登录注册功能,那么对一个一个好的登录注册模块进行封装就势在必行了。这里给大家介绍一下我的第一个项目中所用到的登录注册功能的,已经对其进行封装,希望能对大家有帮助,如果有什么错误或者改进的话希望各位可以指出。
我们都知道登录注册系列功能的实现有以下几步:
- 注册账号
- 登录账号(第三方账号登录)
- 记住密码
- 自动登录
- 修改密码
大体的流程如下
对于需要获取用户登录状态的操作,先判断用户是否已经登录。
如果用户已经登录,则继续后面的操作,否则,跳转到登录页面进行登录。
如果已经有账号,则可以直接登录,或者可以直接选择第三方平台授权登录。
如果还没有账号,则需要先进行账号注册,注册成功后再登录;也可以不注册账号,通过第三方平台授权进行登录。
如果有账号,但忘记密码,可以重置密码,否则直接登录。
好了,一个登录注册系列的常用功能就是以上这五点了,大体流程也已经知道了,接下来让我们一个一个的实现它们。
注册功能的实现
注册时一般通过手机或者邮箱来注册,这里我选择利用手机号来注册;且注册时通常需要接收验证码,这里通过第三方的Mob平台的短信SDK来实现,第三方账号授权也是利用Mob的ShareSDK来实现的。注册完成后由客户端将注册信息提交至服务端进行注册,提交方式为HTTP的POST请求方式。
SignUpActivity.Java
packagecom.example.administrator.loginandregister.activity;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.text.TextUtils;
importandroid.util.Log;
importandroid.view.KeyEvent;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.view.inputmethod.EditorInfo;
importandroid.widget.Button;
importandroid.widget.TextView;
importandroid.widget.TextView.OnEditorActionListener;
importandroid.widget.Toast;
importcom.example.administrator.loginandregister.R;
importcom.example.administrator.loginandregister.utils.RegexUtils;
importcom.example.administrator.loginandregister.utils.ToastUtils;
importcom.example.administrator.loginandregister.utils.VerifyCodeManager;
importcom.example.administrator.loginandregister.views.CleanEditText;
importorg.json.JSONException;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.net.HttpURLConnection;
importjava.net.URL;
importjava.net.URLEncoder;
importjava.util.Timer;
importjava.util.TimerTask;
/**
*CreatedbyJimCharleson2016/11/27.
*/
publicclassSignUpActivityextendsActivityimplementsOnClickListener{
privatestaticfinalStringTAG="SignupActivity";
//界面控件
privateCleanEditTextphoneEdit;
privateCleanEditTextpasswordEdit;
privateCleanEditTextverifyCodeEdit;
privateCleanEditTextnicknameEdit;
privateButtongetVerifiCodeButton;
privateButtoncreateAccountButton;
privateVerifyCodeManagercodeManager;
Stringresult="";
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signup);
initViews();
codeManager=newVerifyCodeManager(this,phoneEdit,getVerifiCodeButton);
}
/**
*通过findViewById,减少重复的类型转换
*
*@paramid
*@return
*/
@SuppressWarnings("unchecked")
publicfinal<EextendsView>EgetView(intid){
try{
return(E)findViewById(id);
}catch(ClassCastExceptionex){
Log.e(TAG,"CouldnotcastViewtoconcreteclass.",ex);
throwex;
}
}
privatevoidinitViews(){
getVerifiCodeButton=getView(R.id.btn_send_verifi_code);
getVerifiCodeButton.setOnClickListener(this);
createAccountButton=getView(R.id.btn_create_account);
createAccountButton.setOnClickListener(this);
phoneEdit=getView(R.id.et_phone);
phoneEdit.setImeOptions(EditorInfo.IME_ACTION_NEXT);//下一步
verifyCodeEdit=getView(R.id.et_verifiCode);
verifyCodeEdit.setImeOptions(EditorInfo.IME_ACTION_NEXT);//下一步
nicknameEdit=getView(R.id.et_nickname);
nicknameEdit.setImeOptions(EditorInfo.IME_ACTION_NEXT);
passwordEdit=getView(R.id.et_password);
passwordEdit.setImeOptions(EditorInfo.IME_ACTION_DONE);
passwordEdit.setImeOptions(EditorInfo.IME_ACTION_GO);
passwordEdit.setOnEditorActionListener(newOnEditorActionListener(){
@Override
publicbooleanonEditorAction(TextViewv,intactionId,
KeyEventevent){
//点击虚拟键盘的done
if(actionId==EditorInfo.IME_ACTION_DONE
||actionId==EditorInfo.IME_ACTION_GO){
try{
commit();
}catch(IOException|JSONExceptione1){
e1.printStackTrace();
}
}
returnfalse;
}
});
}
privatevoidcommit()throwsIOException,JSONException{
Stringphone=phoneEdit.getText().toString().trim();
Stringpassword=passwordEdit.getText().toString().trim();
if(checkInput(phone,password)){
//TODO:请求服务端注册账号
createAccountButton.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewarg0){
//android4.0后的新的特性,网络数据请求时不能放在主线程中。
//使用线程执行访问服务器,获取返回信息后通知主线程更新UI或者提示信息。
finalHandlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
if(msg.what==1){
//提示读取结果
Toast.makeText(SignUpActivity.this,result,Toast.LENGTH_LONG).show();
if(result.contains("成")){
Toast.makeText(SignUpActivity.this,result,Toast.LENGTH_LONG).show();
ToastUtils.showShort(SignUpActivity.this,
"注册成功......");
}
else{
finalIntentit=newIntent(SignUpActivity.this,LoginActivity.class);//你要转向的Activity
Timertimer=newTimer();
TimerTasktask=newTimerTask(){
@Override
publicvoidrun(){
startActivity(it);//执行
}
};
timer.schedule(task,1000);//1秒后
}
}
}
};
//启动线程来执行任务
newThread(){
publicvoidrun(){
//请求网络
try{
Register(phoneEdit.getText().toString(),passwordEdit.getText().toString(),nicknameEdit.getText().toString());
}catch(IOException|JSONExceptione){
e.printStackTrace();
}
Messagem=newMessage();
m.what=1;
//发送消息到Handler
handler.sendMessage(m);
}
}.start();
}
});
}
}
privatebooleancheckInput(Stringphone,Stringpassword){
if(TextUtils.isEmpty(phone)){//电话号码为空
ToastUtils.showShort(this,R.string.tip_phone_can_not_be_empty);
}else{
if(!RegexUtils.checkMobile(phone)){//电话号码格式有误
ToastUtils.showShort(this,R.string.tip_phone_regex_not_right);
}elseif(password==null||password.trim().equals("")){
Toast.makeText(this,R.string.tip_password_can_not_be_empty,
Toast.LENGTH_LONG).show();
}elseif(password.length()<6||password.length()>32
||TextUtils.isEmpty(password)){//密码格式
ToastUtils.showShort(this,
R.string.tip_please_input_6_32_password);
}else{
returntrue;
}
}
returnfalse;
}
publicBooleanRegister(Stringaccount,StringpassWord,StringniceName)throwsIOException,JSONException{
try{
StringhttpUrl="http://cdz.ittun.cn/cdz/user_register.php";
URLurl=newURL(httpUrl);//创建一个URL
HttpURLConnectionconnection=(HttpURLConnection)url.openConnection();//通过该url获得与服务器的连接
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");//设置请求方式为post
connection.setConnectTimeout(3000);//设置超时为3秒
//设置传送类型
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
connection.setRequestProperty("Charset","utf-8");
//提交数据
Stringdata="&name="+URLEncoder.encode(niceName,"UTF-8")+"&cardid="
+"&passwd="+passWord+"&money=0"+"&number="+account;//传递的数据
connection.setRequestProperty("Content-Length",String.valueOf(data.getBytes().length));
ToastUtils.showShort(this,
"数据提交成功......");
//获取输出流
OutputStreamos=connection.getOutputStream();
os.write(data.getBytes());
os.flush();
//获取响应输入流对象
InputStreamReaderis=newInputStreamReader(connection.getInputStream());
BufferedReaderbufferedReader=newBufferedReader(is);
StringBufferstrBuffer=newStringBuffer();
Stringline=null;
//读取服务器返回信息
while((line=bufferedReader.readLine())!=null){
strBuffer.append(line);
}
result=strBuffer.toString();
is.close();
connection.disconnect();
}catch(Exceptione){
returntrue;
}
returnfalse;
}
@Override
publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.btn_send_verifi_code:
//TODO请求接口发送验证码
codeManager.getVerifyCode(VerifyCodeManager.REGISTER);
break;
caseR.id.btn_create_account:
try{
commit();
}catch(IOException|JSONExceptione){
e.printStackTrace();
}
break;
default:
break;
}
}
}
登录功能的实现
登录功能需要在完成注册以后才能进行,只要提交账号、密码等信息至服务器,请求登录即可,至于第三方登录功能利用Mob平台的ShareSDK来实现。
LoginActivity.java
packagecom.example.administrator.loginandregister.activity;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.text.TextUtils;
importandroid.text.method.HideReturnsTransformationMethod;
importandroid.text.method.PasswordTransformationMethod;
importandroid.view.KeyEvent;
importandroid.view.View;
importandroid.view.inputmethod.EditorInfo;
importandroid.widget.Button;
importandroid.widget.TextView;
importandroid.widget.Toast;
importcom.example.administrator.loginandregister.R;
importcom.example.administrator.loginandregister.global.AppConstants;
importcom.example.administrator.loginandregister.utils.LogUtils;
importcom.example.administrator.loginandregister.utils.ProgressDialogUtils;
importcom.example.administrator.loginandregister.utils.RegexUtils;
importcom.example.administrator.loginandregister.utils.ShareUtils;
importcom.example.administrator.loginandregister.utils.SpUtils;
importcom.example.administrator.loginandregister.utils.ToastUtils;
importcom.example.administrator.loginandregister.utils.UrlConstance;
importcom.example.administrator.loginandregister.utils.Utils;
importcom.example.administrator.loginandregister.views.CleanEditText;
importcom.umeng.socialize.bean.SHARE_MEDIA;
importcom.umeng.socialize.controller.UMServiceFactory;
importcom.umeng.socialize.controller.UMSocialService;
importcom.umeng.socialize.controller.listener.SocializeListeners.UMAuthListener;
importcom.umeng.socialize.controller.listener.SocializeListeners.UMDataListener;
importcom.umeng.socialize.exception.SocializeException;
importorg.json.JSONException;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.net.HttpURLConnection;
importjava.net.URL;
importjava.net.URLEncoder;
importjava.util.Map;
importjava.util.Timer;
importjava.util.TimerTask;
importstaticandroid.view.View.OnClickListener;
/**
*CreatedbyJimCharleson2016/11/27.
*/
publicclassLoginActivityextendsActivityimplementsOnClickListener,UrlConstance{
privatestaticfinalStringTAG="loginActivity";
privatestaticfinalintREQUEST_CODE_TO_REGISTER=0x001;
//界面控件
privateCleanEditTextaccountEdit;
privateCleanEditTextpasswordEdit;
privateButtonloginButton;
//第三方平台获取的访问token,有效时间,uid
privateStringaccessToken;
privateStringexpires_in;
privateStringuid;
privateStringsns;
Stringresult="";
//整个平台的Controller,负责管理整个SDK的配置、操作等处理
privateUMSocialServicemController=UMServiceFactory
.getUMSocialService(AppConstants.DESCRIPTOR);
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initViews();
//配置分享平台
ShareUtils.configPlatforms(this);
}
/**
*初始化视图
*/
privatevoidinitViews(){
loginButton=(Button)findViewById(R.id.btn_login);
loginButton.setOnClickListener(this);
accountEdit=(CleanEditText)this.findViewById(R.id.et_email_phone);
accountEdit.setImeOptions(EditorInfo.IME_ACTION_NEXT);
accountEdit.setTransformationMethod(HideReturnsTransformationMethod
.getInstance());
passwordEdit=(CleanEditText)this.findViewById(R.id.et_password);
passwordEdit.setImeOptions(EditorInfo.IME_ACTION_DONE);
passwordEdit.setImeOptions(EditorInfo.IME_ACTION_GO);
passwordEdit.setTransformationMethod(PasswordTransformationMethod
.getInstance());
passwordEdit.setOnEditorActionListener(newTextView.OnEditorActionListener(){
@Override
publicbooleanonEditorAction(TextViewv,intactionId,
KeyEventevent){
if(actionId==EditorInfo.IME_ACTION_DONE
||actionId==EditorInfo.IME_ACTION_GO){
clickLogin();
}
returnfalse;
}
});
}
privatevoidclickLogin(){
Stringaccount=accountEdit.getText().toString();
Stringpassword=passwordEdit.getText().toString();
if(checkInput(account,password)){
//TODO:请求服务器登录账号
//Login(account,password);
loginButton.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewarg0){
//android4.0后的新的特性,网络数据请求时不能放在主线程中。
//使用线程执行访问服务器,获取返回信息后通知主线程更新UI或者提示信息。
finalHandlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
if(msg.what==1){
//提示读取结果
Toast.makeText(LoginActivity.this,result,Toast.LENGTH_LONG).show();
ToastUtils.showShort(LoginActivity.this,
result);
if(result.contains("!")){
Toast.makeText(LoginActivity.this,result,Toast.LENGTH_LONG).show();
ToastUtils.showShort(LoginActivity.this,
"密码错误......");
}else{
finalIntentit=newIntent(LoginActivity.this,WelcomActivity.class);//你要转向的Activity
Timertimer=newTimer();
TimerTasktask=newTimerTask(){
@Override
publicvoidrun(){
startActivity(it);//执行
}
};
timer.schedule(task,1000);//1秒后
}
}
}
};
//启动线程来执行任务
newThread(){
publicvoidrun(){
//请求网络
try{
Login(accountEdit.getText().toString(),passwordEdit.getText().toString());
}catch(IOException|JSONExceptione){
e.printStackTrace();
}
Messagem=newMessage();
m.what=1;
//发送消息到Handler
handler.sendMessage(m);
}
}.start();
}
});
}
}
publicBooleanLogin(Stringaccount,StringpassWord)throwsIOException,JSONException{
try{
StringhttpUrl="http://cdz.ittun.cn/cdz/user_login.php";
URLurl=newURL(httpUrl);//创建一个URL
HttpURLConnectionconnection=(HttpURLConnection)url.openConnection();//通过该url获得与服务器的连接
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");//设置请求方式为post
connection.setConnectTimeout(3000);//设置超时为3秒
//设置传送类型
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
connection.setRequestProperty("Charset","utf-8");
//提交数据
Stringdata="&passwd="+URLEncoder.encode(passWord,"UTF-8")+"&number="+URLEncoder.encode(account,"UTF-8")+"&cardid=";//传递的数据
connection.setRequestProperty("Content-Length",String.valueOf(data.getBytes().length));
ToastUtils.showShort(this,
"数据提交成功......");
//获取输出流
OutputStreamos=connection.getOutputStream();
os.write(data.getBytes());
os.flush();
//获取响应输入流对象
InputStreamReaderis=newInputStreamReader(connection.getInputStream());
BufferedReaderbufferedReader=newBufferedReader(is);
StringBufferstrBuffer=newStringBuffer();
Stringline=null;
//读取服务器返回信息
while((line=bufferedReader.readLine())!=null){
strBuffer.append(line);
}
result=strBuffer.toString();
is.close();
connection.disconnect();
}catch(Exceptione){
returntrue;
}
returnfalse;
}
/**
*检查输入
*
*@paramaccount
*@parampassword
*@return
*/
publicbooleancheckInput(Stringaccount,Stringpassword){
//账号为空时提示
if(account==null||account.trim().equals("")){
Toast.makeText(this,R.string.tip_account_empty,Toast.LENGTH_LONG)
.show();
}else{
//账号不匹配手机号格式(11位数字且以1开头)
if(!RegexUtils.checkMobile(account)){
Toast.makeText(this,R.string.tip_account_regex_not_right,
Toast.LENGTH_LONG).show();
}elseif(password==null||password.trim().equals("")){
Toast.makeText(this,R.string.tip_password_can_not_be_empty,
Toast.LENGTH_LONG).show();
}else{
returntrue;
}
}
returnfalse;
}
@Override
publicvoidonClick(Viewv){
Intentintent=null;
switch(v.getId()){
caseR.id.iv_cancel:
finish();
break;
caseR.id.btn_login:
clickLogin();
break;
caseR.id.iv_wechat:
clickLoginWexin();
break;
caseR.id.iv_qq:
clickLoginQQ();
break;
caseR.id.iv_sina:
loginThirdPlatform(SHARE_MEDIA.SINA);
break;
caseR.id.tv_create_account:
enterRegister();
break;
caseR.id.tv_forget_password:
enterForgetPwd();
break;
default:
break;
}
}
/**
*点击使用QQ快速登录
*/
privatevoidclickLoginQQ(){
if(!Utils.isQQClientAvailable(this)){
ToastUtils.showShort(LoginActivity.this,
getString(R.string.no_install_qq));
}else{
loginThirdPlatform(SHARE_MEDIA.QZONE);
}
}
/**
*点击使用微信登录
*/
privatevoidclickLoginWexin(){
if(!Utils.isWeixinAvilible(this)){
ToastUtils.showShort(LoginActivity.this,
getString(R.string.no_install_wechat));
}else{
loginThirdPlatform(SHARE_MEDIA.WEIXIN);
}
}
/**
*跳转到忘记密码
*/
privatevoidenterForgetPwd(){
Intentintent=newIntent(this,ForgetPasswordActivity.class);
startActivity(intent);
}
/**
*跳转到注册页面
*/
privatevoidenterRegister(){
Intentintent=newIntent(this,SignUpActivity.class);
startActivityForResult(intent,REQUEST_CODE_TO_REGISTER);
}
/**
*授权。如果授权成功,则获取用户信息
*
*@paramplatform
*/
privatevoidloginThirdPlatform(finalSHARE_MEDIAplatform){
mController.doOauthVerify(LoginActivity.this,platform,
newUMAuthListener(){
@Override
publicvoidonStart(SHARE_MEDIAplatform){
LogUtils.i(TAG,"onStart------"
+Thread.currentThread().getId());
ProgressDialogUtils.getInstance().show(
LoginActivity.this,
getString(R.string.tip_begin_oauth));
}
@Override
publicvoidonError(SocializeExceptione,
SHARE_MEDIAplatform){
LogUtils.i(TAG,"onError------"
+Thread.currentThread().getId());
ToastUtils.showShort(LoginActivity.this,
getString(R.string.oauth_fail));
ProgressDialogUtils.getInstance().dismiss();
}
@Override
publicvoidonComplete(Bundlevalue,SHARE_MEDIAplatform){
LogUtils.i(TAG,"onComplete------"+value.toString());
if(platform==SHARE_MEDIA.SINA){
accessToken=value.getString("access_key");
}else{
accessToken=value.getString("access_token");
}
expires_in=value.getString("expires_in");
//获取uid
uid=value.getString(AppConstants.UID);
if(!TextUtils.isEmpty(uid)){
//uid不为空,获取用户信息
getUserInfo(platform);
}else{
ToastUtils.showShort(LoginActivity.this,
getString(R.string.oauth_fail));
}
}
@Override
publicvoidonCancel(SHARE_MEDIAplatform){
LogUtils.i(TAG,"onCancel------"
+Thread.currentThread().getId());
ToastUtils.showShort(LoginActivity.this,
getString(R.string.oauth_cancle));
ProgressDialogUtils.getInstance().dismiss();
}
});
}
/**
*获取用户信息
*
*@paramplatform
*/
privatevoidgetUserInfo(finalSHARE_MEDIAplatform){
mController.getPlatformInfo(LoginActivity.this,platform,
newUMDataListener(){
@Override
publicvoidonStart(){
//开始获取
LogUtils.i("getUserInfo","onStart------");
ProgressDialogUtils.getInstance().dismiss();
ProgressDialogUtils.getInstance().show(
LoginActivity.this,"正在请求...");
}
@Override
publicvoidonComplete(intstatus,Map<String,Object>info){
try{
Stringsns_id="";
Stringsns_avatar="";
Stringsns_loginname="";
if(info!=null&&info.size()!=0){
LogUtils.i("thirdlogin",info.toString());
if(platform==SHARE_MEDIA.SINA){//新浪微博
sns=AppConstants.SINA;
if(info.get(AppConstants.UID)!=null){
sns_id=info.get(AppConstants.UID)
.toString();
}
if(info.get(AppConstants.PROFILE_IMAGE_URL)!=null){
sns_avatar=info
.get(AppConstants.PROFILE_IMAGE_URL)
.toString();
}
if(info.get(AppConstants.SCREEN_NAME)!=null){
sns_loginname=info.get(
AppConstants.SCREEN_NAME)
.toString();
}
}elseif(platform==SHARE_MEDIA.QZONE){//QQ
sns=AppConstants.QQ;
if(info.get(AppConstants.UID)==null){
ToastUtils
.showShort(
LoginActivity.this,
getString(R.string.oauth_fail));
return;
}
sns_id=info.get(AppConstants.UID)
.toString();
sns_avatar=info.get(
AppConstants.PROFILE_IMAGE_URL)
.toString();
sns_loginname=info.get(
AppConstants.SCREEN_NAME)
.toString();
}elseif(platform==SHARE_MEDIA.WEIXIN){//微信
sns=AppConstants.WECHAT;
sns_id=info.get(AppConstants.OPENID)
.toString();
sns_avatar=info.get(
AppConstants.HEADIMG_URL)
.toString();
sns_loginname=info.get(
AppConstants.NICKNAME).toString();
}
//这里直接保存第三方返回来的用户信息
SpUtils.putBoolean(LoginActivity.this,
AppConstants.THIRD_LOGIN,true);
LogUtils.e("info",sns+","+sns_id+","
+sns_loginname);
//TODO:这里执行第三方连接(绑定服务器账号)
}
}catch(Exceptione){
e.printStackTrace();
}
}
});
}
}
忘记密码功能实现
到这一步其实大家都应该明白了,我用的都是最简单的方式去实现这些功能,就是通过提交数据给服务器,然后由服务器判断提交的数据是否正确,正确的话就返回注册信息,包含账号、密码等功能,然后对返回的数据进行操作,修改密码功能也是这样,修改返回数据中密码并重新提交给服务器,这个功能就完成了。
packagecom.example.administrator.loginandregister.activity;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.text.TextUtils;
importandroid.util.Log;
importandroid.view.KeyEvent;
importandroid.view.View;
importandroid.view.inputmethod.EditorInfo;
importandroid.widget.Button;
importandroid.widget.TextView;
importandroid.widget.Toast;
importcom.example.administrator.loginandregister.R;
importcom.example.administrator.loginandregister.utils.RegexUtils;
importcom.example.administrator.loginandregister.utils.ToastUtils;
importcom.example.administrator.loginandregister.utils.VerifyCodeManager;
importcom.example.administrator.loginandregister.views.CleanEditText;
importorg.json.JSONException;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.net.HttpURLConnection;
importjava.net.URL;
importjava.util.Timer;
importjava.util.TimerTask;
importstaticandroid.view.View.OnClickListener;
/**
*CreatedbyJimCharleson2016/11/27.
*/
publicclassForgetPasswordActivityextendsActivityimplementsOnClickListener{
privatestaticfinalStringTAG="SignupActivity";
//界面控件
privateCleanEditTextphoneEdit;
privateCleanEditTextpasswordEdit;
privateCleanEditTextverifyCodeEdit;
privateButtongetVerifiCodeButton;
privateButtonresetButton;
privateVerifyCodeManagercodeManager;
Stringresult="";
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frogetpwd);
initViews();
codeManager=newVerifyCodeManager(this,phoneEdit,getVerifiCodeButton);
}
/**
*通用findViewById,减少重复的类型转换
*
*@paramid
*@return
*/
@SuppressWarnings("unchecked")
publicfinal<EextendsView>EgetView(intid){
try{
return(E)findViewById(id);
}catch(ClassCastExceptionex){
Log.e(TAG,"CouldnotcastViewtoconcreteclass.",ex);
throwex;
}
}
privatevoidinitViews(){
resetButton=getView(R.id.btn_create_account);
resetButton.setOnClickListener(this);
getVerifiCodeButton=getView(R.id.btn_send_verifi_code);
getVerifiCodeButton.setOnClickListener(this);
phoneEdit=getView(R.id.et_phone);
phoneEdit.setImeOptions(EditorInfo.IME_ACTION_NEXT);//下一步
verifyCodeEdit=getView(R.id.et_verifiCode);
verifyCodeEdit.setImeOptions(EditorInfo.IME_ACTION_NEXT);//下一步
passwordEdit=getView(R.id.et_password);
passwordEdit.setImeOptions(EditorInfo.IME_ACTION_DONE);
passwordEdit.setImeOptions(EditorInfo.IME_ACTION_GO);
passwordEdit.setOnEditorActionListener(newTextView.OnEditorActionListener(){
@Override
publicbooleanonEditorAction(TextViewv,intactionId,
KeyEventevent){
//点击虚拟键盘的done
if(actionId==EditorInfo.IME_ACTION_DONE
||actionId==EditorInfo.IME_ACTION_GO){
try{
commit();
}catch(IOException|JSONExceptione){
e.printStackTrace();
}
}
returnfalse;
}
});
}
privatevoidcommit()throwsIOException,JSONException{
Stringphone=phoneEdit.getText().toString().trim();
Stringpassword=passwordEdit.getText().toString().trim();
if(checkInput(phone,password)){
//TODO:请求服务端注册账号
resetButton.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewarg0){
//android4.0后的新的特性,网络数据请求时不能放在主线程中。
//使用线程执行访问服务器,获取返回信息后通知主线程更新UI或者提示信息。
finalHandlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
if(msg.what==1){
//提示读取结果
Toast.makeText(ForgetPasswordActivity.this,result,Toast.LENGTH_LONG).show();
if(result.contains("成")){
Toast.makeText(ForgetPasswordActivity.this,result,Toast.LENGTH_LONG).show();
ToastUtils.showShort(ForgetPasswordActivity.this,
"注册成功......");
}
else{
finalIntentit=newIntent(ForgetPasswordActivity.this,LoginActivity.class);//你要转向的Activity
Timertimer=newTimer();
TimerTasktask=newTimerTask(){
@Override
publicvoidrun(){
startActivity(it);//执行
}
};
timer.schedule(task,1000);//1秒后
}
}
}
};
//启动线程来执行任务
newThread(){
publicvoidrun(){
//请求网络
try{
Register(phoneEdit.getText().toString(),passwordEdit.getText().toString());
}catch(IOException|JSONExceptione){
e.printStackTrace();
}
Messagem=newMessage();
m.what=1;
//发送消息到Handler
handler.sendMessage(m);
}
}.start();
}
});
}
}
privatebooleancheckInput(Stringphone,Stringpassword){
if(TextUtils.isEmpty(phone)){//电话号码为空
ToastUtils.showShort(this,R.string.tip_phone_can_not_be_empty);
}else{
if(!RegexUtils.checkMobile(phone)){//电话号码格式有误
ToastUtils.showShort(this,R.string.tip_phone_regex_not_right);
}elseif(password.length()<6||password.length()>32
||TextUtils.isEmpty(password)){//密码格式
ToastUtils.showShort(this,
R.string.tip_please_input_6_32_password);
}else{
returntrue;
}
}
returnfalse;
}
publicBooleanRegister(Stringaccount,StringpassWord)throwsIOException,JSONException{
try{
StringhttpUrl="http://cdz.ittun.cn/cdz/user_register.php";
URLurl=newURL(httpUrl);//创建一个URL
HttpURLConnectionconnection=(HttpURLConnection)url.openConnection();//通过该url获得与服务器的连接
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");//设置请求方式为post
connection.setConnectTimeout(3000);//设置超时为3秒
//设置传送类型
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
connection.setRequestProperty("Charset","utf-8");
//提交数据
Stringdata="&cardid="+"&passwd="+passWord+"&money=0"+"&number="+account;//传递的数据
connection.setRequestProperty("Content-Length",String.valueOf(data.getBytes().length));
ToastUtils.showShort(this,
"数据提交成功......");
//获取输出流
OutputStreamos=connection.getOutputStream();
os.write(data.getBytes());
os.flush();
//获取响应输入流对象
InputStreamReaderis=newInputStreamReader(connection.getInputStream());
BufferedReaderbufferedReader=newBufferedReader(is);
StringBufferstrBuffer=newStringBuffer();
Stringline=null;
//读取服务器返回信息
while((line=bufferedReader.readLine())!=null){
strBuffer.append(line);
}
result=strBuffer.toString();
is.close();
connection.disconnect();
}catch(Exceptione){
returntrue;
}
returnfalse;
}
@Override
publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.iv_cancel:
finish();
break;
caseR.id.btn_send_verifi_code:
//TODO请求接口发送验证码
codeManager.getVerifyCode(VerifyCodeManager.RESET_PWD);
break;
default:
break;
}
}
}
记住密码和自动登录功能的实现
记住密码和自动登录功能可以通过SharedPreferences来实现
调用Context.getSharePreferences(Stringname,intmode)方法来得到SharePreferences接口,该方法的第一个参数是文件名称,第二个参数是操作模式。
操作模式有三种:MODE_PRIVATE(私有),MODE_WORLD_READABLE(可读),MODE_WORLD_WRITEABLE(可写)
SharePreference提供了获得数据的方法,如getString(Stringkey,StringdefValue)等
调用SharePreferences的edit()方法返回SharePreferences.Editor内部接口,该接口提供了保存数据的方法如:putString(Stringkey,Stringvalue)等,调用该接口的commit()方法可以将数据保存。
这一部分还没有进行封装,简单的给大家介绍一下利用SharePreferences来实现记住密码和自动登陆
importandroid.content.Context;
importandroid.content.SharedPreferences;
publicclassUserInfo{
privateStringUSER_INFO="userInfo";
privateContextcontext;
publicUserInfo(){
}
publicUserInfo(Contextcontext){
this.context=context;
}
//存放字符串型的值
publicvoidsetUserInfo(Stringkey,Stringvalue){
SharedPreferencessp=context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
SharedPreferences.Editoreditor=sp.edit();
editor.remove(key);
editor.putString(key,value);
editor.commit();
}
//存放整形的值
publicvoidsetUserInfo(Stringkey,intvalue){
SharedPreferencessp=context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
SharedPreferences.Editoreditor=sp.edit();
editor.remove(key);
editor.putInt(key,value);
editor.commit();
}
//存放长整形值
publicvoidsetUserInfo(Stringkey,Longvalue){
SharedPreferencessp=context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
SharedPreferences.Editoreditor=sp.edit();
editor.remove(key);
editor.putLong(key,value);
editor.commit();
}
//存放布尔型值
publicvoidsetUserInfo(Stringkey,Booleanvalue){
SharedPreferencessp=context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
SharedPreferences.Editoreditor=sp.edit();
editor.remove(key);
editor.putBoolean(key,value);
editor.commit();
}
//清空记录
publicvoidclear(){
SharedPreferencessp=context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
SharedPreferences.Editoreditor=sp.edit();
editor.clear();
editor.commit();
}
//注销用户时清空用户名和密码
//publicvoidlogOut(){
//SharedPreferencessp=context.getSharedPreferences(USER_INFO,
//Context.MODE_PRIVATE);
//SharedPreferences.Editoreditor=sp.edit();
//editor.remove(ACCOUNT);
//editor.remove(PASSWORD);
//editor.commit();
//}
//获得用户信息中某项字符串型的值
publicStringgetStringInfo(Stringkey){
SharedPreferencessp=context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
returnsp.getString(key,"");
}
//获得用户息中某项整形参数的值
publicintgetIntInfo(Stringkey){
SharedPreferencessp=context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
returnsp.getInt(key,-1);
}
//获得用户信息中某项长整形参数的值
publicLonggetLongInfo(Stringkey){
SharedPreferencessp=context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
returnsp.getLong(key,-1);
}
//获得用户信息中某项布尔型参数的值
publicbooleangetBooleanInfo(Stringkey){
SharedPreferencessp=context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
returnsp.getBoolean(key,false);
}
}
publicclassMainActivityextendsActivity{
privateButtonlogin,cancel;
privateEditTextusernameEdit,passwordEdit;
privateCheckBoxCK_save,CK_auto;
privateUserInfouserInfo;
privatestaticfinalStringUSER_NAME="user_name";
privatestaticfinalStringPASSWORD="password";
privatestaticfinalStringISSAVEPASS="savePassWord";
privateStringusername;
privateStringpassword;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
userInfo=newUserInfo(this);
login=(Button)findViewById(R.id.login_btn);
cancel=(Button)findViewById(R.id.unlogin_btn);
usernameEdit=(EditText)findViewById(R.id.username);
passwordEdit=(EditText)findViewById(R.id.password);
CK_save=(CheckBox)findViewById(R.id.savePassword);
CK_auto=(CheckBox)findViewById(R.id.autoLogin);
//判断是否记住了密码的初始默认是要记住密码的
if(userInfo.getBooleanInfo(ISSAVEPASS)){
CK_save.setChecked(true);
usernameEdit.setText(userInfo.getStringInfo(USER_NAME));
passwordEdit.setText(userInfo.getStringInfo(PASSWORD));
//判断是否要自动登陆
if(userInfo.getBooleanInfo(AUTOLOGIN)){
//默认是要自动登陆的
CK_auto.setChecked(true);
Intenti=newIntent();
i.setClass(MainActivity.this,SecondActivity.class);
startActivity(i);
}
}
login.setOnClickListener(newButton.OnClickListener(){
@Override
publicvoidonClick(Viewv){
username=usernameEdit.getText().toString();
password=passwordEdit.getText().toString();
if(username.equals("liang")&&password.equals("123")){
if(CK_save.isChecked()){
userInfo.setUserInfo(USER_NAME,username);
userInfo.setUserInfo(PASSWORD,password);
userInfo.setUserInfo(ISSAVEPASS,true);
}
if(CK_auto.isChecked()){
userInfo.setUserInfo(AUTOLOGIN,true);
}
Intenti=newIntent();
i.setClass(MainActivity.this,SecondActivity.class);
startActivity(i);
}
}
});
}
}
可见要实现记住密码和自动登录功能并不难,只要在登陆的XML布局文件添加两个Checkbar并对其进行设置,然后在Activity中进行简单的处理,就可以实现了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。