广告
返回顶部
首页 > 资讯 > 移动开发 >Android实现登录注册功能封装
  • 890
分享到

Android实现登录注册功能封装

封装Android 2022-06-06 04:06:00 890人浏览 八月长安
摘要

我们都知道Android应用软件基本上都会用到登录注册功能,那么对一个一个好的登录注册模块进行封装就势在必行了。这里给大家介绍一下我的第一个项目中所用到的登录注册功能的,已经对

我们都知道Android应用软件基本上都会用到登录注册功能,那么对一个一个好的登录注册模块进行封装就势在必行了。这里给大家介绍一下我的第一个项目中所用到的登录注册功能的,已经对其进行封装,希望能对大家有帮助,如果有什么错误或者改进的话希望各位可以指出。

我们都知道登录注册系列功能的实现有以下几步:

注册账号 登录账号 (第三方账号登录) 记住密码 自动登录 修改密码

大体的流程如下

对于需要获取用户登录状态的操作,先判断用户是否已经登录。

如果用户已经登录,则继续后面的操作,否则,跳转到登录页面进行登录。

如果已经有账号,则可以直接登录,或者可以直接选择第三方平台授权登录。

如果还没有账号,则需要先进行账号注册,注册成功后再登录;也可以不注册账号,通过第三方平台授权进行登录。

如果有账号,但忘记密码,可以重置密码,否则直接登录。

好了,一个登录注册系列的常用功能就是以上这五点了,大体流程也已经知道了,接下来让我们一个一个的实现它们。

注册功能的实现

注册时一般通过手机或者邮箱来注册,这里我选择利用手机号来注册;且注册时通常需要接收验证码,这里通过第三方的Mob平台的短信SDK来实现,第三方账号授权也是利用Mob的ShareSDK来实现的。注册完成后由客户端将注册信息提交至服务端进行注册,提交方式为Http的POST请求方式。

SignUpActivity.Java


package com.example.administrator.loginandreGISter.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.widget.Toast;
import com.example.administrator.loginandregister.R;
import com.example.administrator.loginandregister.utils.RegexUtils;
import com.example.administrator.loginandregister.utils.ToastUtils;
import com.example.administrator.loginandregister.utils.VerifyCodeManager;
import com.example.administrator.loginandregister.views.CleanEditText;
import org.JSON.jsONException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Timer;
import java.util.TimerTask;

public class SignUpActivity extends Activity implements OnClickListener {
  private static final String TAG = "SignupActivity";
  // 界面控件
  private CleanEditText phoneEdit;
  private CleanEditText passWordEdit;
  private CleanEditText verifyCodeEdit;
  private CleanEditText nicknameEdit;
  private Button getVerifiCodeButton;
  private Button createAccountButton;
  private VerifyCodeManager codeManager;
  String result = "";
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_signup);
    initViews();
    codeManager = new VerifyCodeManager(this, phoneEdit, getVerifiCodeButton);
  }
  
  @SuppressWarnings("unchecked")
  public final <E extends View> E getView(int id) {
    try {
      return (E) findViewById(id);
    } catch (ClassCastException ex) {
      Log.e(TAG, "Could not cast View to concrete class.", ex);
      throw ex;
    }
  }
  private void initViews() {
    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(new OnEditorActionListener() {
      @Override
      public boolean onEditorAction(TextView v, int actionId,
                     KeyEvent event) {
        // 点击虚拟键盘的done
        if (actionId == EditorInfo.IME_ACTION_DONE
            || actionId == EditorInfo.IME_ACTION_GO) {
          try {
            commit();
          } catch (IOException | JSONException e1) {
            e1.printStackTrace();
          }
        }
        return false;
      }
    });
  }
  private void commit() throws IOException, JSONException {
    String phone = phoneEdit.getText().toString().trim();
    String password = passwordEdit.getText().toString().trim();
    if (checkInput(phone, password)) {
      // TODO:请求服务端注册账号
      createAccountButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
          //android4.0后的新的特性,网络数据请求时不能放在主线程中。
          //使用线程执行访问服务器,获取返回信息后通知主线程更新UI或者提示信息。
          final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
              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{
                  final Intent it = new Intent(SignUpActivity.this, LoginActivity.class); //你要转向的Activity
                  Timer timer = new Timer();
                  TimerTask task = new TimerTask() {
                    @Override
                    public void run() {
                      startActivity(it); //执行
                    }
                  };
                  timer.schedule(task, 1000); //1秒后
                }
              }
            }
          };
          // 启动线程来执行任务
          new Thread() {
            public void run() {
              //请求网络
              try {
                Register(phoneEdit.getText().toString(),passwordEdit.getText().toString(),nicknameEdit.getText().toString());
              } catch (IOException | JSONException e) {
                e.printStackTrace();
              }
              Message m = new Message();
              m.what = 1;
              // 发送消息到Handler
              handler.sendMessage(m);
            }
          }.start();
        }
      });
    }
  }
  private boolean checkInput(String phone, String password) {
    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);
      } else if (password == null || password.trim().equals("")) {
        Toast.makeText(this, R.string.tip_password_can_not_be_empty,
            Toast.LENGTH_LONG).show();
      }else if (password.length() < 6 || password.length() > 32
          || TextUtils.isEmpty(password)) { // 密码格式
        ToastUtils.showShort(this,
            R.string.tip_please_input_6_32_password);
      } else {
        return true;
      }
    }
    return false;
  }
  public Boolean Register(String account, String passWord, String niceName) throws IOException, JSONException {
    try {
      String httpUrl="http://cdz.ittun.cn/cdz/user_register.PHP";
      URL url = new URL(httpUrl);//创建一个URL
      HttpURLConnection connection = (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");
      //提交数据
      String data = "&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,
          "数据提交成功......");
      //获取输出流
      OutputStream os = connection.getOutputStream();
      os.write(data.getBytes());
      os.flush();
      //获取响应输入流对象
      InputStreamReader is = new InputStreamReader(connection.getInputStream());
      BufferedReader bufferedReader = new BufferedReader(is);
      StringBuffer strBuffer = new StringBuffer();
      String line = null;
      //读取服务器返回信息
      while ((line = bufferedReader.readLine()) != null){
        strBuffer.append(line);
      }
      result = strBuffer.toString();
      is.close();
      connection.disconnect();
    } catch (Exception e) {
      return true;
    }
    return false;
  }
  @Override
  public void onClick(View v) {
    switch (v.getId()) {
      case R.id.btn_send_verifi_code:
        // TODO 请求接口发送验证码
        codeManager.getVerifyCode(VerifyCodeManager.REGISTER);
        break;
      case R.id.btn_create_account:
        try {
          commit();
          } catch (IOException | JSONException e) {
          e.printStackTrace();
        }
        break;
      default:
        break;
    }
  }
}

登录功能的实现

登录功能需要在完成注册以后才能进行,只要提交账号、密码等信息至服务器,请求登录即可,至于第三方登录功能利用Mob平台的ShareSDK来实现。

LoginActivity.java


package com.example.administrator.loginandregister.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.example.administrator.loginandregister.R;
import com.example.administrator.loginandregister.global.AppConstants;
import com.example.administrator.loginandregister.utils.LogUtils;
import com.example.administrator.loginandregister.utils.ProgressDialogUtils;
import com.example.administrator.loginandregister.utils.RegexUtils;
import com.example.administrator.loginandregister.utils.ShareUtils;
import com.example.administrator.loginandregister.utils.SpUtils;
import com.example.administrator.loginandregister.utils.ToastUtils;
import com.example.administrator.loginandregister.utils.UrlConstance;
import com.example.administrator.loginandregister.utils.Utils;
import com.example.administrator.loginandregister.views.CleanEditText;
import com.umeng.socialize.bean.SHARE_MEDIA;
import com.umeng.socialize.controller.UMServiceFactory;
import com.umeng.socialize.controller.UMSocialService;
import com.umeng.socialize.controller.listener.SocializeListeners.UMAuthListener;
import com.umeng.socialize.controller.listener.SocializeListeners.UMDataListener;
import com.umeng.socialize.exception.SocializeException;
import org.json.JSONException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import static android.view.View.OnClickListener;

public class LoginActivity extends Activity implements OnClickListener,UrlConstance {
  private static final String TAG = "loginActivity";
  private static final int REQUEST_CODE_TO_REGISTER = 0x001;
  // 界面控件
  private CleanEditText accountEdit;
  private CleanEditText passwordEdit;
  private Button loginButton;
  // 第三方平台获取的访问token,有效时间,uid
  private String accessToken;
  private String expires_in;
  private String uid;
  private String sns;
  String result = "";
  // 整个平台的Controller,负责管理整个SDK的配置、操作等处理
  private UMSocialService mController = UMServiceFactory
      .getUMSocialService(AppConstants.DESCRIPTOR);
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    initViews();
    // 配置分享平台
    ShareUtils.configPlatforms(this);
  }
  
  private void initViews() {
    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(new TextView.OnEditorActionListener() {
      @Override
      public boolean onEditorAction(TextView v, int actionId,
                     KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE
            || actionId == EditorInfo.IME_ACTION_GO) {
          clickLogin();
        }
        return false;
      }
    });
  }
  private void clickLogin() {
    String account = accountEdit.getText().toString();
    String password = passwordEdit.getText().toString();
    if (checkInput(account, password)) {
      // TODO: 请求服务器登录账号
//        Login(account,password);
      loginButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
          //android4.0后的新的特性,网络数据请求时不能放在主线程中。
          //使用线程执行访问服务器,获取返回信息后通知主线程更新UI或者提示信息。
          final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
              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 {
                  final Intent it = new Intent(LoginActivity.this, WelcoMactivity.class); //你要转向的Activity
                  Timer timer = new Timer();
                  TimerTask task = new TimerTask() {
                    @Override
                    public void run() {
                      startActivity(it); //执行
                    }
                  };
                  timer.schedule(task, 1000); //1秒后
                }
              }
            }
          };
          // 启动线程来执行任务
          new Thread() {
            public void run() {
              //请求网络
              try {
                Login(accountEdit.getText().toString(),passwordEdit.getText().toString());
              } catch (IOException | JSONException e) {
                e.printStackTrace();
              }
              Message m = new Message();
              m.what = 1;
              // 发送消息到Handler
              handler.sendMessage(m);
            }
          }.start();
        }
      });
      }
  }
  public Boolean Login(String account, String passWord) throws IOException, JSONException {
    try {
      String httpUrl="http://cdz.ittun.cn/cdz/user_login.php";
      URL url = new URL(httpUrl);//创建一个URL
      HttpURLConnection connection = (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");
      //提交数据
      String data = "&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,
          "数据提交成功......");
      //获取输出流
      OutputStream os = connection.getOutputStream();
      os.write(data.getBytes());
      os.flush();
      //获取响应输入流对象
      InputStreamReader is = new InputStreamReader(connection.getInputStream());
      BufferedReader bufferedReader = new BufferedReader(is);
      StringBuffer strBuffer = new StringBuffer();
      String line = null;
      //读取服务器返回信息
      while ((line = bufferedReader.readLine()) != null){
        strBuffer.append(line);
      }
      result = strBuffer.toString();
      is.close();
      connection.disconnect();
    } catch (Exception e) {
      return true;
    }
    return false;
  }
  
  public boolean checkInput(String account, String password) {
    // 账号为空时提示
    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();
      } else if (password == null || password.trim().equals("")) {
        Toast.makeText(this, R.string.tip_password_can_not_be_empty,
            Toast.LENGTH_LONG).show();
      } else {
        return true;
      }
    }
    return false;
  }
  @Override
  public void onClick(View v) {
    Intent intent = null;
    switch (v.getId()) {
      case R.id.iv_cancel:
        finish();
        break;
      case R.id.btn_login:
        clickLogin();
        break;
      case R.id.iv_wechat:
        clickLoginWexin();
        break;
      case R.id.iv_qq:
        clickLoginQQ();
        break;
      case R.id.iv_sina:
        loginThirdPlatform(SHARE_MEDIA.SINA);
        break;
      case R.id.tv_create_account:
        enterRegister();
        break;
      case R.id.tv_forget_password:
        enterForgetPwd();
        break;
      default:
        break;
    }
  }
  
  private void clickLoginQQ() {
    if (!Utils.isQQClientAvailable(this)) {
      ToastUtils.showShort(LoginActivity.this,
          getString(R.string.no_install_qq));
    } else {
      loginThirdPlatform(SHARE_MEDIA.QZONE);
    }
  }
  
  private void clickLoginWexin() {
    if (!Utils.isWeixinAvilible(this)) {
      ToastUtils.showShort(LoginActivity.this,
          getString(R.string.no_install_wechat));
    } else {
      loginThirdPlatform(SHARE_MEDIA.WEIXIN);
    }
  }
  
  private void enterForgetPwd() {
    Intent intent = new Intent(this, ForgetPasswordActivity.class);
    startActivity(intent);
  }
  
  private void enterRegister() {
    Intent intent = new Intent(this, SignUpActivity.class);
    startActivityForResult(intent, REQUEST_CODE_TO_REGISTER);
  }
  
  private void loginThirdPlatform(final SHARE_MEDIA platform) {
    mController.doOauthVerify(LoginActivity.this, platform,
        new UMAuthListener() {
          @Override
          public void onStart(SHARE_MEDIA platform) {
            LogUtils.i(TAG, "onStart------"
                + Thread.currentThread().getId());
            ProgressDialogUtils.getInstance().show(
                LoginActivity.this,
                getString(R.string.tip_begin_oauth));
          }
          @Override
          public void onError(SocializeException e,
                    SHARE_MEDIA platform) {
            LogUtils.i(TAG, "onError------"
                + Thread.currentThread().getId());
            ToastUtils.showShort(LoginActivity.this,
                getString(R.string.oauth_fail));
            ProgressDialogUtils.getInstance().dismiss();
          }
          @Override
          public void onComplete(Bundle value, SHARE_MEDIA platform) {
            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
          public void onCancel(SHARE_MEDIA platform) {
            LogUtils.i(TAG, "onCancel------"
                + Thread.currentThread().getId());
            ToastUtils.showShort(LoginActivity.this,
                getString(R.string.oauth_cancle));
            ProgressDialogUtils.getInstance().dismiss();
          }
        });
  }
  
  private void getUserInfo(final SHARE_MEDIA platform) {
    mController.getPlatformInfo(LoginActivity.this, platform,
        new UMDataListener() {
          @Override
          public void onStart() {
            // 开始获取
            LogUtils.i("getUserInfo", "onStart------");
            ProgressDialogUtils.getInstance().dismiss();
            ProgressDialogUtils.getInstance().show(
                LoginActivity.this, "正在请求...");
          }
          @Override
          public void onComplete(int status, Map<String, Object> info) {
            try {
              String sns_id = "";
              String sns_avatar = "";
              String sns_loginname = "";
              if (info != null && info.size() != 0) {
                LogUtils.i("third login", 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();
                  }
                } else if (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();
                } else if (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 (Exception e) {
              e.printStackTrace();
            }
          }
        });
  }
}

忘记密码功能实现

到这一步其实大家都应该明白了,我用的都是最简单的方式去实现这些功能,就是通过提交数据给服务器,然后由服务器判断提交的数据是否正确,正确的话就返回注册信息,包含账号、密码等功能,然后对返回的数据进行操作,修改密码功能也是这样,修改返回数据中密码并重新提交给服务器,这个功能就完成了。


package com.example.administrator.loginandregister.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.example.administrator.loginandregister.R;
import com.example.administrator.loginandregister.utils.RegexUtils;
import com.example.administrator.loginandregister.utils.ToastUtils;
import com.example.administrator.loginandregister.utils.VerifyCodeManager;
import com.example.administrator.loginandregister.views.CleanEditText;
import org.json.JSONException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Timer;
import java.util.TimerTask;
import static android.view.View.OnClickListener;

public class ForgetPasswordActivity extends Activity implements OnClickListener {
  private static final String TAG = "SignupActivity";
  // 界面控件
  private CleanEditText phoneEdit;
  private CleanEditText passwordEdit;
  private CleanEditText verifyCodeEdit;
  private Button getVerifiCodeButton;
  private Button resetButton;
  private VerifyCodeManager codeManager;
  String result = "";
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_frogetpwd);
    initViews();
    codeManager = new VerifyCodeManager(this, phoneEdit, getVerifiCodeButton);
  }
  
  @SuppressWarnings("unchecked")
  public final <E extends View> E getView(int id) {
    try {
      return (E) findViewById(id);
    } catch (ClassCastException ex) {
      Log.e(TAG, "Could not cast View to concrete class.", ex);
      throw ex;
    }
  }
  private void initViews() {
    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(new TextView.OnEditorActionListener() {
      @Override
      public boolean onEditorAction(TextView v, int actionId,
                     KeyEvent event) {
        // 点击虚拟键盘的done
        if (actionId == EditorInfo.IME_ACTION_DONE
            || actionId == EditorInfo.IME_ACTION_GO) {
          try {
            commit();
          } catch (IOException | JSONException e) {
            e.printStackTrace();
          }
        }
        return false;
      }
    });
  }
  private void commit() throws IOException, JSONException {
    String phone = phoneEdit.getText().toString().trim();
    String password = passwordEdit.getText().toString().trim();
    if (checkInput(phone, password)) {
      // TODO:请求服务端注册账号
      resetButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
          //android4.0后的新的特性,网络数据请求时不能放在主线程中。
          //使用线程执行访问服务器,获取返回信息后通知主线程更新UI或者提示信息。
          final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
              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{
                  final Intent it = new Intent(ForgetPasswordActivity.this, LoginActivity.class); //你要转向的Activity
                  Timer timer = new Timer();
                  TimerTask task = new TimerTask() {
                    @Override
                    public void run() {
                      startActivity(it); //执行
                    }
                  };
                  timer.schedule(task, 1000); //1秒后
                }
              }
            }
          };
          // 启动线程来执行任务
          new Thread() {
            public void run() {
              //请求网络
              try {
                Register(phoneEdit.getText().toString(),passwordEdit.getText().toString());
              } catch (IOException | JSONException e) {
                e.printStackTrace();
              }
              Message m = new Message();
              m.what = 1;
              // 发送消息到Handler
              handler.sendMessage(m);
            }
          }.start();
        }
      });
    }
  }
  private boolean checkInput(String phone, String password) {
    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);
      } else if (password.length() < 6 || password.length() > 32
          || TextUtils.isEmpty(password)) { // 密码格式
        ToastUtils.showShort(this,
            R.string.tip_please_input_6_32_password);
      } else {
        return true;
      }
    }
    return false;
  }
  public Boolean Register(String account, String passWord) throws IOException, JSONException {
    try {
      String httpUrl="http://cdz.ittun.cn/cdz/user_register.php";
      URL url = new URL(httpUrl);//创建一个URL
      HttpURLConnection connection = (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");
      //提交数据
      String data = "&cardid=" + "&passwd=" +passWord+ "&money=0"+ "&number=" + account;//传递的数据
      connection.setRequestProperty("Content-Length",String.valueOf(data.getBytes().length));
      ToastUtils.showShort(this,
          "数据提交成功......");
      //获取输出流
      OutputStream os = connection.getOutputStream();
      os.write(data.getBytes());
      os.flush();
      //获取响应输入流对象
      InputStreamReader is = new InputStreamReader(connection.getInputStream());
      BufferedReader bufferedReader = new BufferedReader(is);
      StringBuffer strBuffer = new StringBuffer();
      String line = null;
      //读取服务器返回信息
      while ((line = bufferedReader.readLine()) != null){
        strBuffer.append(line);
      }
      result = strBuffer.toString();
      is.close();
      connection.disconnect();
    } catch (Exception e) {
      return true;
    }
    return false;
  }
  @Override
  public void onClick(View v) {
    switch (v.getId()) {
      case R.id.iv_cancel:
        finish();
        break;
      case R.id.btn_send_verifi_code:
        // TODO 请求接口发送验证码
        codeManager.getVerifyCode(VerifyCodeManager.RESET_PWD);
        break;
      default:
        break;
    }
  }
}

记住密码和自动登录功能的实现

记住密码和自动登录功能可以通过SharedPreferences来实现

调用Context.getSharePreferences(String name, int mode)方法来得到SharePreferences接口,该方法的第一个参数是文件名称,第二个参数是操作模式。

操作模式有三种:MODE_PRIVATE(私有) ,MODE_WORLD_READABLE(可读),MODE_WORLD_WRITEABLE(可写)

SharePreference提供了获得数据的方法,如getString(String key,String defValue)等

调用SharePreferences的edit()方法返回 SharePreferences.Editor内部接口,该接口提供了保存数据的方法如: putString(String key,String value)等,调用该接口的commit()方法可以将数据保存。

这一部分还没有进行封装,简单的给大家介绍一下利用SharePreferences来实现记住密码和自动登陆


import android.content.Context;
import android.content.SharedPreferences;
 public class UserInfo {
   private String USER_INFO = "userInfo";
  private Context context;
   public UserInfo() {
   }
   public UserInfo(Context context) {
     this.context = context;
   }
   // 存放字符串型的值
   public void setUserInfo(String key, String value) {
     SharedPreferences sp = context.getSharedPreferences(USER_INFO,
         Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();
     editor.remove(key);
     editor.putString(key, value);
     editor.commit();
   }
   // 存放整形的值
   public void setUserInfo(String key, int value) {
     SharedPreferences sp = context.getSharedPreferences(USER_INFO,
         Context.MODE_PRIVATE);
     SharedPreferences.Editor editor = sp.edit();
     editor.remove(key);
     editor.putInt(key, value);
     editor.commit();
  }
   // 存放长整形值
   public void setUserInfo(String key, Long value) {
     SharedPreferences sp = context.getSharedPreferences(USER_INFO,
         Context.MODE_PRIVATE);
     SharedPreferences.Editor editor = sp.edit();
     editor.remove(key);
     editor.putLong(key, value);
     editor.commit();
   }
   // 存放布尔型值
   public void setUserInfo(String key, Boolean value) {
     SharedPreferences sp = context.getSharedPreferences(USER_INFO,
         Context.MODE_PRIVATE);
     SharedPreferences.Editor editor = sp.edit();
     editor.remove(key);
     editor.putBoolean(key, value);
     editor.commit();
   }
  // 清空记录
   public void clear() {
     SharedPreferences sp = context.getSharedPreferences(USER_INFO,
         Context.MODE_PRIVATE);
     SharedPreferences.Editor editor = sp.edit();
     editor.clear();
     editor.commit();
   }
   // 注销用户时清空用户名和密码
   // public void logOut() {
   // SharedPreferences sp = context.getSharedPreferences(USER_INFO,
   // Context.MODE_PRIVATE);
   // SharedPreferences.Editor editor = sp.edit();
   // editor.remove(ACCOUNT);
   // editor.remove(PASSWORD);
   // editor.commit();
   // }
   // 获得用户信息中某项字符串型的值
   public String getStringInfo(String key) {
     SharedPreferences sp = context.getSharedPreferences(USER_INFO,
         Context.MODE_PRIVATE);
     return sp.getString(key, "");
   }
   // 获得用户息中某项整形参数的值
   public int getIntInfo(String key) {
     SharedPreferences sp = context.getSharedPreferences(USER_INFO,
         Context.MODE_PRIVATE);
     return sp.getInt(key, -1);
  }
   // 获得用户信息中某项长整形参数的值
   public Long getLongInfo(String key) {
     SharedPreferences sp = context.getSharedPreferences(USER_INFO,
         Context.MODE_PRIVATE);
     return sp.getLong(key, -1);
   }
   // 获得用户信息中某项布尔型参数的值
   public boolean getBooleanInfo(String key) {
     SharedPreferences sp = context.getSharedPreferences(USER_INFO,
         Context.MODE_PRIVATE);
     return sp.getBoolean(key, false);
   }
 }
public class MainActivity extends Activity {
   private Button login, cancel;
  private EditText usernameEdit, passwordEdit;
  private CheckBox CK_save, CK_auto;
  private UserInfo userInfo;
  private static final String USER_NAME = "user_name";
  private static final String PASSWORD = "password";
  private static final String ISSAVEPASS = "savePassWord";
  private String username;
  private String password;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     userInfo = new UserInfo(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);
         Intent i = new Intent();
         i.setClass(MainActivity.this, SecondActivity.class);
        startActivity(i);
       }
     }
     login.setOnClickListener(new Button.OnClickListener() {
       @Override
       public void onClick(View v) {
         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);
           }
           Intent i = new Intent();
           i.setClass(MainActivity.this, SecondActivity.class);
           startActivity(i);
         }
       }
     });
   }
 }

可见要实现记住密码和自动登录功能并不难,只要在登陆的XML布局文件添加两个Checkbar并对其进行设置,然后在Activity中进行简单的处理,就可以实现了。

您可能感兴趣的文章:Android登录注册功能 数据库sqlite验证Android手机注册登录时获取验证码之后倒计时功能(知识点总结)Android客户端实现注册、登录详解(2)Android实现闪屏及注册和登录界面之间的切换效果Android客户端实现注册、登录详解(1)Android注册登录实时自动获取短信验证码Android设计登录界面、找回密码、注册功能Android开发之注册登录方法示例Android封装MVP实现登录注册功能


--结束END--

本文标题: Android实现登录注册功能封装

本文链接: https://www.lsjlt.com/news/22646.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android实现登录注册功能封装
    我们都知道Android应用软件基本上都会用到登录注册功能,那么对一个一个好的登录注册模块进行封装就势在必行了。这里给大家介绍一下我的第一个项目中所用到的登录注册功能的,已经对...
    99+
    2022-06-06
    封装 Android
  • Android实现登录注册功能
    本文实例为大家分享了Android实现登录注册功能的具体代码,供大家参考,具体内容如下 运行环境 Android Studio 总体效果图 一、 设计注册页面的布局 二、完成注册...
    99+
    2022-11-13
  • android登录注册功能如何实现
    要实现Android的登录注册功能,你可以按照以下步骤进行操作:1. 创建一个布局文件来设计登录和注册界面。可以使用EditText...
    99+
    2023-10-20
    android
  • Android用SharedPreferences实现登录注册注销功能
    Android用SharedPreferences实现登录注册注销功能 前言 本文用SharedPreferences本地缓存账号信息来实现登录注册功能,以及退出注销功能。 一、本文...
    99+
    2022-11-13
  • Android使用http实现注册登录功能
    在项目中实现注册登录有很多种方式,一般对于初学者来说,不使用框架,采用http的post和get请求后台服务器,是一种更好理解底层源码的方式。使用框架实现注册登录虽然比自己封装pos...
    99+
    2022-11-13
  • Android实现登录界面的注册功能
    本文实例为大家分享了Android登录界面的注册实现代码,供大家参考,具体内容如下 注册一个登录界面在控制台将输入的信息文本选框展示出来 xml界面设计(前面已发) <xml ...
    99+
    2022-11-13
  • Android基于Sqlite实现注册和登录功能
    Android中基于Sqlite实现注册和登录功能,供大家参考,具体内容如下 前言 写这篇博客主要是为了巩固一下学的Sqlite知识以及梳理一下这个项目的逻辑 实现逻辑 项目的图片...
    99+
    2022-11-13
  • Python实现注册登录功能
    用Python写个注册登录功能,供大家参考,具体内容如下 本文是用Python写一个注册登录功能,难度不大,很适合练手主要就是用列表和字典,以及逻辑判断用到的第3方库模块是time模...
    99+
    2022-11-13
  • Node.js实现登录注册功能
    本文实例为大家分享了Node.js实现登录注册功能的具体代码,供大家参考,具体内容如下 目录结构 注册页面: reg.html <!DOCTYPE html> <...
    99+
    2022-11-13
  • Android用SharedPreferences怎么实现登录注册注销功能
    这篇“Android用SharedPreferences怎么实现登录注册注销功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2023-06-30
  • Android如何实现登录界面的注册功能
    今天小编给大家分享一下Android如何实现登录界面的注册功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。注册一个登录界面...
    99+
    2023-06-30
  • python实现登录与注册功能
    本文实例为大家分享了python实现登录与注册的具体代码,供大家参考,具体内容如下 1. 案例介绍 本例设计一个用户登录和注册模块,使用 Tkinter 框架构建界面,主要用到画布、...
    99+
    2022-11-12
  • NodeJs+MySQL实现注册登录功能
    本文实例为大家分享了NodeJs+MySQL实现注册登录功能的具体代码,供大家参考,具体内容如下 之前写过一个没有连接数据库的注册与登陆的实现,这次加上了数据库 刚刚接触后端,很多不...
    99+
    2022-11-13
  • Android基于Sqlite怎么实现注册和登录功能
    本篇内容主要讲解“Android基于Sqlite怎么实现注册和登录功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android基于Sqlite怎么实现注册和登录功能”吧!实现逻辑项目的图片结...
    99+
    2023-06-30
  • Android中怎么利用MVP实现登录注册功能
    这篇文章给大家介绍Android中怎么利用MVP实现登录注册功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。model包:import com.bwei.mvps.bean.UserBean;public&...
    99+
    2023-05-30
    android mvp
  • Android中怎么利用OKhttp3实现登录注册功能
    这期内容当中小编将会给大家带来有关Android中怎么利用OKhttp3实现登录注册功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、Android前端实现新建一个login的项目,主要的几个文件在这...
    99+
    2023-06-20
  • Spring MVC+mybatis实现注册登录功能
    本文实例为大家分享了Spring MVC mybatis实现注册登录功能的具体代码,供大家参考,具体内容如下前期准备: 如下图所示,准备好所需要的包 新建工程,导入所需要的包,在web.xml中配置好所需要的,如下<...
    99+
    2023-05-31
    spring mvc mybatis
  • java+mysql实现登录和注册功能
    初学JAVA  EE,老师留下一小作业,用JAVA实现与服务器端交互,实现登录和注册功能,初学一种专业课很多老师都会留下一种让学生实现登录和注册的作业。 下面是记录的实现步...
    99+
    2022-11-13
  • 基于Spring5实现登录注册功能
    本文实例为大家分享了Spring5实现登录注册功能的具体代码,供大家参考,具体内容如下 准备: 根据分析用户注册登录都需要的信息为①username(String)②userid(I...
    99+
    2022-11-13
  • node.js实现简单登录注册功能
    本文实例为大家分享了node.js实现简单登录注册的具体代码,供大家参考,具体内容如下 1、首先需要一个sever模块用于引入路由,引入连接数据库的模块,监听服务器2、要有model...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作