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中进行简单的处理,就可以实现了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。