자동로그인을 구현하는 로직은 다음과 같이 설계하였다.
로그인 버튼을 누를 경우, autoLogin
을 선택하였는지 값을 boolean 값으로 받는다.
만약 autoLogin == true
라면 해당 id와 password를 preference에 저장한다. 그 후, 앱을 종료했다 켰을 경우 preference에 값이 있다면 그 값을 읽어서 id와 password의 EditText에 써지도록 구현할 예정이다.
activity_main.xml 파일은 전에 구현한 것과 동일하다.
MainActivity.java
package com.example.myapp;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class MainActivity extends AppCompatActivity {
Button btnLogin, btnJoin, btnProduct;
EditText loginID, loginPassword;
RadioButton autoLogin;
String id, password, autoID, autoPassword;
boolean autoCheck;
SharedPreferences memberPref;
SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnLogin = (Button) findViewById(R.id.btnLogin);
btnJoin = (Button) findViewById(R.id.btnJoin);
btnProduct = (Button) findViewById(R.id.btnProduct);
//id, password 값 받기
loginID = (EditText) findViewById(R.id.loginID);
loginPassword = (EditText) findViewById(R.id.loginPassword);
autoLogin = (RadioButton) findViewById(R.id.autoLogin);
//자동로그인
try{
memberPref = getSharedPreferences("memberPref", joinActivity.MODE_PRIVATE);
if(memberPref.getBoolean("autoCheck", false)){
loginID.setText(memberPref.getString("autoID", ""));
loginPassword.setText(memberPref.getString("autoPassword", ""));
autoLogin.setChecked(false);
}
}catch (Exception e){
}
//로그인 눌렀을 경우
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
id = loginID.getText().toString();
password = loginPassword.getText().toString();
autoCheck = autoLogin.isChecked();
//아이디, 비밀번호 맞음
if (password.equals(passwordCheck(id))) {
if (autoCheck) {
editor = memberPref.edit();
editor.putString("autoID", id);
editor.putString("autoPassword", password);
editor.putBoolean("autoCheck", autoCheck);
editor.commit();
}
//product 화면으로 이동
Intent intent = new Intent(getApplicationContext(), ProductActivity.class);
intent.putExtra("intentId", id);
startActivity(intent);
finish();
}
//에러 처리
else {
//아이디 틀림
if (passwordCheck(id) == null) {
Toast.makeText(getApplicationContext(), "아이디를 다시 입력하세요.",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "비밀번호를 다시 입력하세요.",
Toast.LENGTH_SHORT).show();
}
}
}
});
//회원가입 눌렀을 경우
btnJoin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplicationContext(),
joinActivity.class);
startActivity(intent);
}
});
}
//로그인 기능 - 회원가입 정보랑 맞는지 확인
public String passwordCheck(String id) {
//회원가입 정보 가져오기
String tmp = null;
try {
FileInputStream fs = openFileInput(id);
BufferedReader reader = new BufferedReader(new InputStreamReader(fs));
reader.readLine();
tmp = reader.readLine();
} catch (Exception e) {
e.printStackTrace();
}
return tmp;
}
}
//자동로그인
try{
memberPref = getSharedPreferences("memberPref", joinActivity.MODE_PRIVATE);
if(memberPref.getBoolean("autoCheck", false)){
loginID.setText(memberPref.getString("autoID", ""));
loginPassword.setText(memberPref.getString("autoPassword", ""));
autoLogin.setChecked(false);
}
}catch (Exception e){
}
앱을 실행할 때, try문을 통해 preference에 저장된 값을 읽을 수 있도록 하였다.
if (autoCheck) {
editor = memberPref.edit();
editor.putString("autoID", id);
editor.putString("autoPassword", password);
editor.putBoolean("autoCheck", autoCheck);
editor.commit();
}
로그인 할 경우 autoCheck가 true라면 preference에 값을 저장하였다.
이번 시간에는 preference를 활용하여 값을 저장하고 읽는 것을 해보았다. 회원가입을 할 때 preference로 삽질을 해서, 이번에 자동 로그인을 구현하는 것은 그리 어렵지 않게 끝낼 수 있었다.