우선 제가 구상하는 레이아웃은 아주 기본적으로 아이디, 비밀번호 그리고 로그인 버튼 입니다.
-레이아웃-
id_text, password_text -> EditText
login_button -> Button
그리고 로그인에 대해 말하자면 간단하게 자동로그인을 구현 할 (SharedPreferences) 앱 데이터 저장, API 비동기 연동 (AsyncTask의 doInBackground에서 진행, OutputStream은 HttpUrlConnection(params), InputStream은 JSON) 정도 입니다!
간단한 설명은 끝났고 우선 레이아웃부터 보겠습니다
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:app="//schemas.android.com/apk/res-auto" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" tools:context="com.example.practice.login_activity"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <EditText android:id="@+id/email_text" android:layout_width="0dp" android:layout_height="54dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_alignParentRight="true" android:layout_marginLeft="16dp" android:layout_marginTop="288dp" android:layout_marginRight="16dp" android:drawablePadding="8dp" android:hint="이메일을 입력해주세요." android:paddingLeft="16dp" android:textColorHint="#A9ADB4" android:textCursorDrawable="@null"/> <EditText android:id="@+id/password_text" android:layout_width="0dp" android:layout_height="54dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_alignParentRight="true" android:layout_marginLeft="16dp" android:layout_marginTop="347dp" android:layout_marginRight="16dp" android:drawablePadding="8dp" android:hint="비밀번호를 입력해주세요." android:paddingLeft="16dp" android:textColorHint="#A9ADB4" android:textCursorDrawable="@null" tools:ignore="DuplicateIds" /> <Button android:id="@+id/login_button" android:layout_width="355dp" android:layout_height="66dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_alignParentRight="true" android:layout_marginLeft="13dp" android:layout_marginTop="421dp" android:layout_marginRight="13dp" android:letterSpacing="-0.05" android:lineSpacingExtra="3sp" android:text="로그인" android:textColor="#10171F" android:textSize="20sp" android:textStyle="bold" android:translationY="-1.52sp" /> </RelativeLayout> </ScrollView>간단하게 이메일과 비밀번호를 EditText로 하였고 로그인버튼은 Button으로 하였습니다.
각각 기능을 수행하기 위해서는 아이디가 필요하겠죠!
SharedPreferences
우선 자동 로그인 기능을 수행하기위해 SharedPreferences에 대한 지식이 필요해요. SharedPreferences는 앱내부에 간단한(작은양) 데이터를 저장하여 삭제 시 까지 유지시켜 데이터를 보존시킬 수 있습니다.
바로 코드 보여드리겠습니다
public class shared_preferences { static String pref_user_email = "user_email"; static public SharedPreferences get_shared_preferences(Context ctx) {//모든 액티비티에서 인스턴스 얻음 return PreferenceManager.getDefaultSharedPreferences(ctx); } public static void set_user_email(Context ctx, String user_email) {//이메일 저장 SharedPreferences.Editor editor = get_shared_preferences(ctx).edit(); editor.putString(pref_user_email, user_email); editor.commit();//커밋은 필수 } public static String get_user_email(Context ctx) {//저장된 이메일 가져오기 return get_shared_preferences(ctx).getString(pref_user_email, ""); } public static void clear_user(Context ctx) {//로그아웃 시 데이터 삭제 SharedPreferences.Editor editor = get_shared_preferences(ctx).edit(); editor.clear(); editor.commit();//커밋은 필수 } }윗 코드를 보시면 저장되는 데이터를 이메일로하였고 로그인시 화면전환, 즉 Intent Activity를 할때 shared_preferences.set_user_email()를 통해 데이터를 앱내부에 글로벌로 저장할 수 있습니다.
다음으로는 clear_user를 보겠습니다. 각 액티비티에서 로그아웃 시 shared_preferences.clear_user()를 통해 데이터를 삭제하고 로그아웃 할 수 있습니다. 커밋은 필수입니다!!!
이제 get_user_email을 보겠는데요, 자동로그인을 체크하려면 로그인 액티비티에서 shared_preferences.get_user_email()이 필요합니다. 우선 먼저 아래에서 자동로그인 체크 시 필요한 코드를 보겠습니다.
/* ↓ 자동로그인 확인 ↓ */ if (shared_preferences.get_user_email(login_activity.this).length() != 0) {//로그인 고유데이터(현재는 이메일) 길이 0 아닐시 Intent intent = new Intent(login_activity.this, main_activity.class); startActivity(intent); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);//액티비티 스택제거 Toast.makeText(getApplicationContext(), "자동 로그인 되었습니다", Toast.LENGTH_SHORT).show(); finish(); }get_user_email에서 return 값을 ""로 설정하였는데 set_user_email 시 데이터가 들어와 새로운 데이터로 설정이 됩니다. 처음값이 없으니 length가 0이겠고 이제 값이 들어오면 0이 아니게 되겠죠? 그래서 조건문은 length != 0 으로 잡아주고 true일 때, 바로 메인 액티비티로 전환되도록 하였습니다.
이번 시간에는 SharedPreferences에 대해 알아보았는데요! 다음시간에는 AsyncTask에 대해 알아보겠습니다~
*번외*
sharedpreferences는 앱 데이터베이스라 하기에는 너무 적은양의 데이터만 저장할 수 있어서, 추후에 Room에 대해 학습 후 포스팅 하도록 하겠습니다.