一、创建Activity
public class LoginActivity extends AppCompatActivity implements View.OnClickListener {
//我用的androidx,所以各种View用了AppcompayView,用啥都一样
private AppCompatEditText uname_EditText,upwd_EditText;//用户名及密码EditText
private AppCompatButton login_Button;//登录按钮
private AppCompatCheckBox rem_CheckBox,auto_CheckBox;//checkbox
private PopupWindow popupWindow;//用来显示登录中的动画
private static int isBack=0;//登录后,有时需要退出到登录页面,如果不设置就会一直自动登录,无法更换用户(一退出就自动登录了)
private String rem_isCheck="REM_ISCHECK";
private String auto_isCheck="AUTO_ISCHECK";
private String[] permissions={Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE};//检查权限,也可以在其他页面检查
/**
* 然后就是Handler,这个看个人需求了,就是各种操作最终都会通过Handler来处理(具体看下面的解释msg.what代表什么)
*/
@SuppressLint("HandlerLeak")
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
SharedPreferences sharedPreferences=getSharedPreferences("userInfo",MODE_PRIVATE);
SharedPreferences.Editor editor=sharedPreferences.edit();
/**
* msg.what:各值的含义
* 0:代表用户名输入长度有误
* 1:代表登录时没有响应
* 2:代表登录时有响应
*/
switch (msg.what){
//msg.what=0:就是用户名长度有问题,不用上传服务器检查了,可以降低服务器的压力,手机端就检查了
//如果输入长度有问题,用户就写错了,建议将保存的用户信息全部清除,所以用editor清除
case 0:
editor.putBoolean(rem_isCheck,false);
editor.putBoolean(auto_isCheck,false);
editor.putString("uname","");
editor.putString("upwd","");
editor.apply();
DialogUtil.showDialog(LoginActivity.this,"用户名输入有误",true);
break;
//如果msg.what=1说明连接网络有问题,用AlertDialog提示无法连接网络,DialogUtil是我自己写的类,因为很多地方用到Dialog,可以节省很多代码
case 1:
login_Button.setText("登录");
DialogUtil.showDialog(LoginActivity.this,"无法连接内网:MobileWiFi",false);
setViewEnable(true);//登录的时候将所有的View设置不可点击,防止多次登录,所以无法连接网络的时候需要将View设置可以点击,然后将登陆中动画取消
if(popupWindow!=null){
popupWindow.dismiss();
}
break;
//msg.what=2:说明网络有响应,然后根据响应决定是否登录成功,以及其他的操作,看个人需求了
case 2:
login_Button.setEnabled(true);
String responseToString=(String) msg.obj;//这个就是服务器发回来的响应,我转换成String了
Log.i("response",responseToString);
/**
* 响应字符串:工号&密码&姓名&车间&流水线(这是我需要得到的响应字符串格式)
* 字符串的长度一定大于12,所以12<length<50(这是过滤掉可能存在的垃圾响应,其实没什么用)
*/
//if()成立说明响应是我想要的(登录成功了),所以如果用户需要记住用户信息就要将登录信息保存,如果登录密码或者用户名错误就需要将以前保存的用户信息全部清除,防止信息泄露
//以下是登录成功
if(responseToString.length()>12&&responseToString.length()<50){
//登录成功的话,看看用户是否需要记住用户信息,以下是记住用户信息
if (rem_CheckBox.isChecked()) {
editor.putString("uname", uname_EditText.getText().toString());
editor.putString("upwd", upwd_EditText.getText().toString());
editor.putBoolean(rem_isCheck,true);
//以下是用户是否需要自动登录,也需要存储
if(auto_CheckBox.isChecked()){
editor.putBoolean(auto_isCheck,true);
}
else{
editor.putBoolean(auto_isCheck,false);
}
editor.apply();
}
else{
editor.putString("uname", "");
editor.putString("upwd", "");
editor.putBoolean(rem_isCheck,false);
editor.putBoolean(auto_isCheck,false);
editor.commit();
}
login(responseToString);
}
//因为我要的响应不会超过50,所以超过50应该就是服务器出错了,返回了大量信息,Dialog提示服务器出错
else if(responseToString.length()>=50){
setViewEnable(true);
popupWindow.dismiss();
DialogUtil.showDialog(LoginActivity.this,"服务器出错",true);
}
//以下就是登录信息错误,需要将保存的信息清除,下次打开不会显示任何信息
else{
editor.putBoolean(rem_isCheck,false);
editor.putBoolean(auto_isCheck,false);
editor.putString("uname","");
editor.putString("upwd","");
editor.apply();
DialogUtil.showDialog(LoginActivity.this,"用户名或密码错误!",true);
}
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
bindView();//就是绑定View
login_Button.setOnClickListener(this);//登录点击事件进行登录
getUserInfoFromSharedPreferences();//获取用户信息
checkMyPermission(permissions); //权限检查,获取权限
}
//好了,今天就到这里了,下面的代码就是照着onCreate中的顺序来展开的,有空再继续
}