안드로이드 로그인 유지 - andeuloideu logeu-in yuji

우선 제가 구상하는 레이아웃은 아주 기본적으로 아이디, 비밀번호 그리고 로그인 버튼 입니다.

-레이아웃-

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="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://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>
안드로이드 로그인 유지 - andeuloideu logeu-in yuji
로그인 화면

간단하게 이메일과 비밀번호를 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에 대해 학습 후 포스팅 하도록 하겠습니다.