Android實(shí)現(xiàn)登錄注冊(cè)功能封裝
我們都知道Android應(yīng)用軟件基本上都會(huì)用到登錄注冊(cè)功能,那么對(duì)一個(gè)一個(gè)好的登錄注冊(cè)模塊進(jìn)行封裝就勢(shì)在必行了。這里給大家介紹一下我的第一個(gè)項(xiàng)目中所用到的登錄注冊(cè)功能的,已經(jīng)對(duì)其進(jìn)行封裝,希望能對(duì)大家有幫助,如果有什么錯(cuò)誤或者改進(jìn)的話希望各位可以指出。
我們都知道登錄注冊(cè)系列功能的實(shí)現(xiàn)有以下幾步:
- 注冊(cè)賬號(hào)
- 登錄賬號(hào) (第三方賬號(hào)登錄)
- 記住密碼
- 自動(dòng)登錄
- 修改密碼
大體的流程如下
對(duì)于需要獲取用戶登錄狀態(tài)的操作,先判斷用戶是否已經(jīng)登錄。
如果用戶已經(jīng)登錄,則繼續(xù)后面的操作,否則,跳轉(zhuǎn)到登錄頁面進(jìn)行登錄。
如果已經(jīng)有賬號(hào),則可以直接登錄,或者可以直接選擇第三方平臺(tái)授權(quán)登錄。
如果還沒有賬號(hào),則需要先進(jìn)行賬號(hào)注冊(cè),注冊(cè)成功后再登錄;也可以不注冊(cè)賬號(hào),通過第三方平臺(tái)授權(quán)進(jìn)行登錄。
如果有賬號(hào),但忘記密碼,可以重置密碼,否則直接登錄。
好了,一個(gè)登錄注冊(cè)系列的常用功能就是以上這五點(diǎn)了,大體流程也已經(jīng)知道了,接下來讓我們一個(gè)一個(gè)的實(shí)現(xiàn)它們。
注冊(cè)功能的實(shí)現(xiàn)
注冊(cè)時(shí)一般通過手機(jī)或者郵箱來注冊(cè),這里我選擇利用手機(jī)號(hào)來注冊(cè);且注冊(cè)時(shí)通常需要接收驗(yàn)證碼,這里通過第三方的Mob平臺(tái)的短信SDK來實(shí)現(xiàn),第三方賬號(hào)授權(quán)也是利用Mob的ShareSDK來實(shí)現(xiàn)的。注冊(cè)完成后由客戶端將注冊(cè)信息提交至服務(wù)端進(jìn)行注冊(cè),提交方式為HTTP的POST請(qǐng)求方式。
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;
/**
* Created by JimCharles on 2016/11/27.
*/
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);
}
/**
* 通過findViewById,減少重復(fù)的類型轉(zhuǎn)換
*
* @param id
* @return
*/
@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) {
// 點(diǎn)擊虛擬鍵盤的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:請(qǐng)求服務(wù)端注冊(cè)賬號(hào)
createAccountButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//android4.0后的新的特性,網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求時(shí)不能放在主線程中。
//使用線程執(zhí)行訪問服務(wù)器,獲取返回信息后通知主線程更新UI或者提示信息。
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1) {
//提示讀取結(jié)果
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,
"注冊(cè)成功......");
}
else{
final Intent it = new Intent(SignUpActivity.this, LoginActivity.class); //你要轉(zhuǎn)向的Activity
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
startActivity(it); //執(zhí)行
}
};
timer.schedule(task, 1000); //1秒后
}
}
}
};
// 啟動(dòng)線程來執(zhí)行任務(wù)
new Thread() {
public void run() {
//請(qǐng)求網(wǎng)絡(luò)
try {
Register(phoneEdit.getText().toString(),passwordEdit.getText().toString(),nicknameEdit.getText().toString());
} catch (IOException | JSONException e) {
e.printStackTrace();
}
Message m = new Message();
m.what = 1;
// 發(fā)送消息到Handler
handler.sendMessage(m);
}
}.start();
}
});
}
}
private boolean checkInput(String phone, String password) {
if (TextUtils.isEmpty(phone)) { // 電話號(hào)碼為空
ToastUtils.showShort(this, R.string.tip_phone_can_not_be_empty);
} else {
if (!RegexUtils.checkMobile(phone)) { // 電話號(hào)碼格式有誤
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);//創(chuàng)建一個(gè)URL
HttpURLConnection connection = (HttpURLConnection)url.openConnection();//通過該url獲得與服務(wù)器的連接
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");//設(shè)置請(qǐng)求方式為post
connection.setConnectTimeout(3000);//設(shè)置超時(shí)為3秒
//設(shè)置傳送類型
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Charset", "utf-8");
//提交數(shù)據(jù)
String data = "&name=" + URLEncoder.encode(niceName, "UTF-8")+"&cardid="
+ "&passwd=" +passWord+ "&money=0"+ "&number=" + account;//傳遞的數(shù)據(jù)
connection.setRequestProperty("Content-Length",String.valueOf(data.getBytes().length));
ToastUtils.showShort(this,
"數(shù)據(jù)提交成功......");
//獲取輸出流
OutputStream os = connection.getOutputStream();
os.write(data.getBytes());
os.flush();
//獲取響應(yīng)輸入流對(duì)象
InputStreamReader is = new InputStreamReader(connection.getInputStream());
BufferedReader bufferedReader = new BufferedReader(is);
StringBuffer strBuffer = new StringBuffer();
String line = null;
//讀取服務(wù)器返回信息
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 請(qǐng)求接口發(fā)送驗(yàn)證碼
codeManager.getVerifyCode(VerifyCodeManager.REGISTER);
break;
case R.id.btn_create_account:
try {
commit();
} catch (IOException | JSONException e) {
e.printStackTrace();
}
break;
default:
break;
}
}
}
登錄功能的實(shí)現(xiàn)
登錄功能需要在完成注冊(cè)以后才能進(jìn)行,只要提交賬號(hào)、密碼等信息至服務(wù)器,請(qǐng)求登錄即可,至于第三方登錄功能利用Mob平臺(tái)的ShareSDK來實(shí)現(xiàn)。
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;
/**
* Created by JimCharles on 2016/11/27.
*/
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;
// 第三方平臺(tái)獲取的訪問token,有效時(shí)間,uid
private String accessToken;
private String expires_in;
private String uid;
private String sns;
String result = "";
// 整個(gè)平臺(tái)的Controller,負(fù)責(zé)管理整個(gè)SDK的配置、操作等處理
private UMSocialService mController = UMServiceFactory
.getUMSocialService(AppConstants.DESCRIPTOR);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initViews();
// 配置分享平臺(tái)
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: 請(qǐng)求服務(wù)器登錄賬號(hào)
// Login(account,password);
loginButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//android4.0后的新的特性,網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求時(shí)不能放在主線程中。
//使用線程執(zhí)行訪問服務(wù)器,獲取返回信息后通知主線程更新UI或者提示信息。
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1) {
//提示讀取結(jié)果
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,
"密碼錯(cuò)誤......");
} else {
final Intent it = new Intent(LoginActivity.this, WelcomActivity.class); //你要轉(zhuǎn)向的Activity
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
startActivity(it); //執(zhí)行
}
};
timer.schedule(task, 1000); //1秒后
}
}
}
};
// 啟動(dòng)線程來執(zhí)行任務(wù)
new Thread() {
public void run() {
//請(qǐng)求網(wǎng)絡(luò)
try {
Login(accountEdit.getText().toString(),passwordEdit.getText().toString());
} catch (IOException | JSONException e) {
e.printStackTrace();
}
Message m = new Message();
m.what = 1;
// 發(fā)送消息到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);//創(chuàng)建一個(gè)URL
HttpURLConnection connection = (HttpURLConnection)url.openConnection();//通過該url獲得與服務(wù)器的連接
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");//設(shè)置請(qǐng)求方式為post
connection.setConnectTimeout(3000);//設(shè)置超時(shí)為3秒
//設(shè)置傳送類型
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Charset", "utf-8");
//提交數(shù)據(jù)
String data = "&passwd=" + URLEncoder.encode(passWord, "UTF-8")+ "&number=" + URLEncoder.encode(account, "UTF-8")+ "&cardid=";//傳遞的數(shù)據(jù)
connection.setRequestProperty("Content-Length",String.valueOf(data.getBytes().length));
ToastUtils.showShort(this,
"數(shù)據(jù)提交成功......");
//獲取輸出流
OutputStream os = connection.getOutputStream();
os.write(data.getBytes());
os.flush();
//獲取響應(yīng)輸入流對(duì)象
InputStreamReader is = new InputStreamReader(connection.getInputStream());
BufferedReader bufferedReader = new BufferedReader(is);
StringBuffer strBuffer = new StringBuffer();
String line = null;
//讀取服務(wù)器返回信息
while ((line = bufferedReader.readLine()) != null){
strBuffer.append(line);
}
result = strBuffer.toString();
is.close();
connection.disconnect();
} catch (Exception e) {
return true;
}
return false;
}
/**
* 檢查輸入
*
* @param account
* @param password
* @return
*/
public boolean checkInput(String account, String password) {
// 賬號(hào)為空時(shí)提示
if (account == null || account.trim().equals("")) {
Toast.makeText(this, R.string.tip_account_empty, Toast.LENGTH_LONG)
.show();
} else {
// 賬號(hào)不匹配手機(jī)號(hào)格式(11位數(shù)字且以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;
}
}
/**
* 點(diǎn)擊使用QQ快速登錄
*/
private void clickLoginQQ() {
if (!Utils.isQQClientAvailable(this)) {
ToastUtils.showShort(LoginActivity.this,
getString(R.string.no_install_qq));
} else {
loginThirdPlatform(SHARE_MEDIA.QZONE);
}
}
/**
* 點(diǎn)擊使用微信登錄
*/
private void clickLoginWexin() {
if (!Utils.isWeixinAvilible(this)) {
ToastUtils.showShort(LoginActivity.this,
getString(R.string.no_install_wechat));
} else {
loginThirdPlatform(SHARE_MEDIA.WEIXIN);
}
}
/**
* 跳轉(zhuǎn)到忘記密碼
*/
private void enterForgetPwd() {
Intent intent = new Intent(this, ForgetPasswordActivity.class);
startActivity(intent);
}
/**
* 跳轉(zhuǎn)到注冊(cè)頁面
*/
private void enterRegister() {
Intent intent = new Intent(this, SignUpActivity.class);
startActivityForResult(intent, REQUEST_CODE_TO_REGISTER);
}
/**
* 授權(quán)。如果授權(quán)成功,則獲取用戶信息
*
* @param platform
*/
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();
}
});
}
/**
* 獲取用戶信息
*
* @param platform
*/
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, "正在請(qǐng)求...");
}
@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: 這里執(zhí)行第三方連接(綁定服務(wù)器賬號(hào))
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
忘記密碼功能實(shí)現(xiàn)
到這一步其實(shí)大家都應(yīng)該明白了,我用的都是最簡(jiǎn)單的方式去實(shí)現(xiàn)這些功能,就是通過提交數(shù)據(jù)給服務(wù)器,然后由服務(wù)器判斷提交的數(shù)據(jù)是否正確,正確的話就返回注冊(cè)信息,包含賬號(hào)、密碼等功能,然后對(duì)返回的數(shù)據(jù)進(jìn)行操作,修改密碼功能也是這樣,修改返回?cái)?shù)據(jù)中密碼并重新提交給服務(wù)器,這個(gè)功能就完成了。
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;
/**
* Created by JimCharles on 2016/11/27.
*/
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);
}
/**
* 通用findViewById,減少重復(fù)的類型轉(zhuǎn)換
*
* @param id
* @return
*/
@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) {
// 點(diǎn)擊虛擬鍵盤的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:請(qǐng)求服務(wù)端注冊(cè)賬號(hào)
resetButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//android4.0后的新的特性,網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求時(shí)不能放在主線程中。
//使用線程執(zhí)行訪問服務(wù)器,獲取返回信息后通知主線程更新UI或者提示信息。
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1) {
//提示讀取結(jié)果
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,
"注冊(cè)成功......");
}
else{
final Intent it = new Intent(ForgetPasswordActivity.this, LoginActivity.class); //你要轉(zhuǎn)向的Activity
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
startActivity(it); //執(zhí)行
}
};
timer.schedule(task, 1000); //1秒后
}
}
}
};
// 啟動(dòng)線程來執(zhí)行任務(wù)
new Thread() {
public void run() {
//請(qǐng)求網(wǎng)絡(luò)
try {
Register(phoneEdit.getText().toString(),passwordEdit.getText().toString());
} catch (IOException | JSONException e) {
e.printStackTrace();
}
Message m = new Message();
m.what = 1;
// 發(fā)送消息到Handler
handler.sendMessage(m);
}
}.start();
}
});
}
}
private boolean checkInput(String phone, String password) {
if (TextUtils.isEmpty(phone)) { // 電話號(hào)碼為空
ToastUtils.showShort(this, R.string.tip_phone_can_not_be_empty);
} else {
if (!RegexUtils.checkMobile(phone)) { // 電話號(hào)碼格式有誤
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);//創(chuàng)建一個(gè)URL
HttpURLConnection connection = (HttpURLConnection)url.openConnection();//通過該url獲得與服務(wù)器的連接
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");//設(shè)置請(qǐng)求方式為post
connection.setConnectTimeout(3000);//設(shè)置超時(shí)為3秒
//設(shè)置傳送類型
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Charset", "utf-8");
//提交數(shù)據(jù)
String data = "&cardid=" + "&passwd=" +passWord+ "&money=0"+ "&number=" + account;//傳遞的數(shù)據(jù)
connection.setRequestProperty("Content-Length",String.valueOf(data.getBytes().length));
ToastUtils.showShort(this,
"數(shù)據(jù)提交成功......");
//獲取輸出流
OutputStream os = connection.getOutputStream();
os.write(data.getBytes());
os.flush();
//獲取響應(yīng)輸入流對(duì)象
InputStreamReader is = new InputStreamReader(connection.getInputStream());
BufferedReader bufferedReader = new BufferedReader(is);
StringBuffer strBuffer = new StringBuffer();
String line = null;
//讀取服務(wù)器返回信息
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 請(qǐng)求接口發(fā)送驗(yàn)證碼
codeManager.getVerifyCode(VerifyCodeManager.RESET_PWD);
break;
default:
break;
}
}
}
記住密碼和自動(dòng)登錄功能的實(shí)現(xiàn)
記住密碼和自動(dòng)登錄功能可以通過SharedPreferences來實(shí)現(xiàn)
調(diào)用Context.getSharePreferences(String name, int mode)方法來得到SharePreferences接口,該方法的第一個(gè)參數(shù)是文件名稱,第二個(gè)參數(shù)是操作模式。
操作模式有三種:MODE_PRIVATE(私有) ,MODE_WORLD_READABLE(可讀),MODE_WORLD_WRITEABLE(可寫)
SharePreference提供了獲得數(shù)據(jù)的方法,如getString(String key,String defValue)等
調(diào)用SharePreferences的edit()方法返回 SharePreferences.Editor內(nèi)部接口,該接口提供了保存數(shù)據(jù)的方法如: putString(String key,String value)等,調(diào)用該接口的commit()方法可以將數(shù)據(jù)保存。
這一部分還沒有進(jìn)行封裝,簡(jiǎn)單的給大家介紹一下利用SharePreferences來實(shí)現(xiàn)記住密碼和自動(dòng)登陸
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();
}
// 注銷用戶時(shí)清空用戶名和密碼
// 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();
// }
// 獲得用戶信息中某項(xiàng)字符串型的值
public String getStringInfo(String key) {
SharedPreferences sp = context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
return sp.getString(key, "");
}
// 獲得用戶息中某項(xiàng)整形參數(shù)的值
public int getIntInfo(String key) {
SharedPreferences sp = context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
return sp.getInt(key, -1);
}
// 獲得用戶信息中某項(xiàng)長整形參數(shù)的值
public Long getLongInfo(String key) {
SharedPreferences sp = context.getSharedPreferences(USER_INFO,
Context.MODE_PRIVATE);
return sp.getLong(key, -1);
}
// 獲得用戶信息中某項(xiàng)布爾型參數(shù)的值
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);
// 判斷是否記住了密碼的 初始默認(rèn)是要記住密碼的
if (userInfo.getBooleanInfo(ISSAVEPASS)) {
CK_save.setChecked(true);
usernameEdit.setText(userInfo.getStringInfo(USER_NAME));
passwordEdit.setText(userInfo.getStringInfo(PASSWORD));
// 判斷是否要自動(dòng)登陸
if (userInfo.getBooleanInfo(AUTOLOGIN)) {
// 默認(rèn)是要自動(dòng)登陸的
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);
}
}
});
}
}
可見要實(shí)現(xiàn)記住密碼和自動(dòng)登錄功能并不難,只要在登陸的XML布局文件添加兩個(gè)Checkbar并對(duì)其進(jìn)行設(shè)置,然后在Activity中進(jìn)行簡(jiǎn)單的處理,就可以實(shí)現(xiàn)了。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)注冊(cè)登錄界面的實(shí)例代碼
- Android設(shè)計(jì)登錄界面、找回密碼、注冊(cè)功能
- Android客戶端實(shí)現(xiàn)注冊(cè)、登錄詳解(1)
- Android登錄注冊(cè)功能 數(shù)據(jù)庫SQLite驗(yàn)證
- Android Studio連接SQLite數(shù)據(jù)庫的登錄注冊(cè)實(shí)現(xiàn)
- Android客戶端實(shí)現(xiàn)注冊(cè)、登錄詳解(2)
- Android開發(fā)之注冊(cè)登錄方法示例
- Android Studio連接MySql實(shí)現(xiàn)登錄注冊(cè)(附源代碼)
- Android實(shí)現(xiàn)閃屏及注冊(cè)和登錄界面之間的切換效果
- android實(shí)現(xiàn)注冊(cè)登錄程序
相關(guān)文章
詳解Android的MVVM框架 - 數(shù)據(jù)綁定
這篇文章主要介紹了詳解Android的MVVM框架 - 數(shù)據(jù)綁定,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
Android studio實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器
這篇文章主要為大家詳細(xì)介紹了Android studio實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
Android MPAndroidChart開源圖表庫之餅狀圖的代碼
MPAndroidChart是一款基于Android的開源圖表庫,MPAndroidChart不僅可以在Android設(shè)備上繪制各種統(tǒng)計(jì)圖表,而且可以對(duì)圖表進(jìn)行拖動(dòng)和縮放操作,應(yīng)用起來非常靈活2018-05-05
Android如何實(shí)現(xiàn)壓縮和解壓縮文件
這篇文章主要介紹了Android實(shí)現(xiàn)壓縮和解壓文件的實(shí)例代碼,涉及到批量壓縮文件夾,解壓縮一個(gè)文件等方面的知識(shí)點(diǎn),本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧2016-05-05
Android 獲取手機(jī)聯(lián)系人實(shí)例代碼詳解
最近做了個(gè)項(xiàng)目,其中有項(xiàng)目需求是這樣的,需要獲取手機(jī)聯(lián)系人,下面小編把代碼分享給大家,供大家參考2015-12-12
MobLink Android端業(yè)務(wù)場(chǎng)景簡(jiǎn)單說明
這篇文章主要介紹了MobLink Android端業(yè)務(wù)場(chǎng)景簡(jiǎn)單說明,MobLink的功能實(shí)現(xiàn)就是在分享前會(huì)將鏈接的參數(shù)信息保存到服務(wù)器,更多相關(guān)內(nèi)容需要的朋友可以參考一下2022-09-09
Compose?for?Desktop?鼠標(biāo)事件示例demo
這篇文章主要為大家介紹了Compose?for?Desktop?鼠標(biāo)事件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
android仿華為手機(jī)懸浮窗設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了android仿華為手機(jī)懸浮窗設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
用Android Location獲取當(dāng)前地理位置的方法
本篇文章小編為大家介紹,用Android Location獲取當(dāng)前地理位置的方法。需要的朋友參考下2013-04-04

