حفظ session کاربر در اپلیکیشن اندروید با استفاده از Shared Prefrences

پنج شنبه ۰۱ شهریور ۹۷ توسط امیرحسین حیدری

در این مطلب قصد داریم مدیریت session(نشست) کاربر را با استفاده از Shared prefrences  در اندروید با یک مثال بررسی کنیم. در حقیقت زمانی که  کاربر وارد اپلیکیشن میشود، حتی در صورت بسته شدن یا کرش کردن اپلیکیشن، همچنان باید در حالت لاگین باقی بماند تا زمانی که خود تصمیم به خروج از اپلیکیشن بگیرد.

روشی که میتوان برای این منظور در نظر گرفت استفاده از (کلید-مقدار) در Shared Preferences هست.

در این مثال ما دو صفحه ایجاد خواهیم کرد : 1- صفحه ورود 2- صفحه خوش آمد گویی

به این ترتیب که وقتی کاربر مشخصات خود را وارد کرده و تایید  شد، وارد اپلیکیشن شده و ما مقدار true  رو به  LoggedInStatus در Shared Preferences نسبت میدهیم. و همچنین با خروج کاربر LoggedInStatus مقدار false  به خود میگیرد.

 

صفحه ورود:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/loginForm"
    android:visibility="invisible"
    tools:context="com.sharedprefrences.activities.LoginActivity">

    <TextView
        android:id="@+id/usernameTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:textSize="18dp"
        android:textColor="@android:color/black"
        android:layout_marginLeft="35dp"
        android:layout_marginStart="35dp"
        android:layout_marginTop="71dp"
        android:text="Username" />

    <EditText
        android:id="@+id/usernameText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/usernameTextView"
        android:layout_marginLeft="37dp"
        android:layout_marginStart="37dp"
        android:layout_toEndOf="@+id/usernameTextView"
        android:layout_toRightOf="@+id/usernameTextView"
        android:inputType="textNoSuggestions"
        android:background="@null"
        android:ems="10"
        android:hint="username" />

    <TextView
        android:id="@+id/password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/usernameTextView"
        android:layout_alignStart="@+id/usernameTextView"
        android:layout_below="@+id/usernameTextView"
        android:layout_marginTop="40dp"
        android:textColor="@android:color/black"
        android:text="Password"
        android:textSize="18dp" />

    <EditText
        android:id="@+id/passwordText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/password"
        android:layout_alignLeft="@+id/usernameText"
        android:layout_alignStart="@+id/usernameText"
        android:background="@null"
        android:ems="10"
        android:inputType="textPassword"
        android:hint="password" />

    <Button
        android:id="@+id/submit"
        android:layout_width="320dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/password"
        android:layout_centerHorizontal="true"
        android:background="@color/colorPrimary"
        android:layout_marginTop="80dp"
        android:text="Submit"
        android:textAllCaps="false"
        android:textSize="20sp" />

</RelativeLayout>

 و در فایل جاوای اکتیویتی لاگین:

package com.www.sharedprefrences.activities;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.Toast;

import com.anuragdhunna.www.sessionmangementsharedpref.utils.LoginServices;
import com.anuragdhunna.www.sessionmangementsharedpref.R;
import com.anuragdhunna.www.sessionmangementsharedpref.utils.RetrofitClient;
import com.anuragdhunna.www. sharedprefrences.utils.SaveSharedPreference;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;

import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
public class LoginActivity extends AppCompatActivity {

    EditText username,password;
    Button submitBtn;
    RelativeLayout loginForm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        username = findViewById(R.id.usernameText);
        password = findViewById(R.id.passwordText);
        submitBtn = findViewById(R.id.submit);
        loginForm = findViewById(R.id.loginForm);

        // Check if UserResponse is Already Logged In
        if(SaveSharedPreference.getLoggedStatus(getApplicationContext())) {
            Intent intent = new Intent(getApplicationContext(), WelcomeActivity.class);
            startActivity(intent);
        } else {
            loginForm.setVisibility(View.VISIBLE);
        }


        submitBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Make form visible

                userLogin(username.getText().toString(), password.getText().toString());
            }
        });
    }

    /**
     * Login API call
     * @param username
     * @param password
     */
    private void userLogin(String username, String password) {

        Retrofit retrofit = RetrofitClient.getClient();
        final LoginServices loginServices = retrofit.create(LoginServices.class);
        Call<Void> call = loginServices.userLogin(username, password);

        call.enqueue(new Callback<Void>() {
            @Override
            public void onResponse(Call<Void> call, Response<Void> response) {

                if (response.isSuccessful()) {
                    // Set Logged In statue to 'true'
                    SaveSharedPreference.setLoggedIn(getApplicationContext(), true);
                    Intent intent = new Intent(getApplicationContext(), WelcomeActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK |FLAG_ACTIVITY_CLEAR_TASK);
                    startActivity(intent);
                } else {
                    Toast.makeText(getApplicationContext(), "Credentials are not Valid.",
                            Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<Void> call, Throwable t) {
                Log.e("TAG", "=======onFailure: " + t.toString());
                t.printStackTrace();
                // Log error here since request failed
            }
        });
    }
}

صفحه خوش آمد گویی:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.sharedprefrences.activities.WelcomeActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="55dp"
        android:text="User is now logged in"
        android:textColor="@android:color/black"
        android:textSize="20sp" />

    <Button
        android:id="@+id/logoutBT"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="73dp"
        android:text="Logout" />
</RelativeLayout>

 

package com.sharedprefrences.activities;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.anuragdhunna.www.sharedprefrences.utils.LoginServices;
import com.anuragdhunna.www.sharedprefrences.R;
import com.anuragdhunna.www.sharedprefrences.utils.RetrofitClient;
import com.anuragdhunna.www.sharedprefrences.utils.SaveSharedPreference;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;

public class WelcomeActivity extends AppCompatActivity {

    Button logoutBT;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_welcome);

        logoutBT = findViewById(R.id.logoutBT);

        logoutBT.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Set LoggedIn status to false
                SaveSharedPreference.setLoggedIn(getApplicationContext(), false);

                // Logout
                logout();
            }
        });
    }

    /**
     * Logout
     */
    public void logout() {
        Retrofit retrofit = RetrofitClient.getClient();
        LoginServices loginServices = retrofit.create(LoginServices.class);
        Call<Void> logout = loginServices.logout();

        logout.enqueue(new Callback<Void>() {
            @Override
            public void onResponse(Call<Void> call, Response<Void> response) {
                if (response.code() == 200) {
                    Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                }
            }

            @Override
            public void onFailure(Call<Void> call, Throwable t) {
                Log.e("TAG", "=======onFailure: " + t.toString());
                t.printStackTrace();
            }
        });
    }
}
package com.sharedprefrences.activities;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.Toast;

import com.anuragdhunna.www.sessionmangementsharedpref.utils.LoginServices;
import com.anuragdhunna.www.sessionmangementsharedpref.R;
import com.anuragdhunna.www.sessionmangementsharedpref.utils.RetrofitClient;
import com.anuragdhunna.www. sharedprefrences.utils.SaveSharedPreference;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;

import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
public class LoginActivity extends AppCompatActivity {

    EditText username,password;
    Button submitBtn;
    RelativeLayout loginForm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        username = findViewById(R.id.usernameText);
        password = findViewById(R.id.passwordText);
        submitBtn = findViewById(R.id.submit);
        loginForm = findViewById(R.id.loginForm);

        // Check if UserResponse is Already Logged In
        if(SaveSharedPreference.getLoggedStatus(getApplicationContext())) {
            Intent intent = new Intent(getApplicationContext(), WelcomeActivity.class);
            startActivity(intent);
        } else {
            loginForm.setVisibility(View.VISIBLE);
        }


        submitBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Make form visible

                userLogin(username.getText().toString(), password.getText().toString());
            }
        });
    }

    /**
     * Login API call
     * @param username
     * @param password
     */
    private void userLogin(String username, String password) {

        Retrofit retrofit = RetrofitClient.getClient();
        final LoginServices loginServices = retrofit.create(LoginServices.class);
        Call<Void> call = loginServices.userLogin(username, password);

        call.enqueue(new Callback<Void>() {
            @Override
            public void onResponse(Call<Void> call, Response<Void> response) {

                if (response.isSuccessful()) {
                    // Set Logged In statue to 'true'
                    SaveSharedPreference.setLoggedIn(getApplicationContext(), true);
                    Intent intent = new Intent(getApplicationContext(), WelcomeActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK |FLAG_ACTIVITY_CLEAR_TASK);
                    startActivity(intent);
                } else {
                    Toast.makeText(getApplicationContext(), "Credentials are not Valid.",
                            Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<Void> call, Throwable t) {
                Log.e("TAG", "=======onFailure: " + t.toString());
                t.printStackTrace();
                // Log error here since request failed
            }
        });
    }
}
​

کلاس Shared Prefrences:

package com.sharedprefrences.utils;

public class PreferencesUtility {

    // Values for Shared Prefrences
    public static final String LOGGED_IN_PREF = "logged_in_status";

}

package com.anuragdhunna.www.sharedprefrences.utils;

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

import static com.anuragdhunna.www.sessionmangementsharedpref.utils.PreferencesUtility.*;

public class SaveSharedPreference {

    static SharedPreferences getPreferences(Context context) {
        return PreferenceManager.getDefaultSharedPreferences(context);
    }

    /**
     * Set the Login Status
     * @param context
     * @param loggedIn
     */
    public static void setLoggedIn(Context context, boolean loggedIn) {
        SharedPreferences.Editor editor = getPreferences(context).edit();
        editor.putBoolean(LOGGED_IN_PREF, loggedIn);
        editor.apply();
    }

    /**
     * Get the Login Status
     * @param context
     * @return boolean: login status
     */
    public static boolean getLoggedStatus(Context context) {
        return getPreferences(context).getBoolean(LOGGED_IN_PREF, false);
    }
}

لطفا نظر یا سوال خود را در میان بگذارید.


کلیدواژه: Shared Preferences session Android

منابع:

ارسال دیدگاه:
برای ارسال دیگاه باید به سیستم وارد شوید و یا ثبت نام کنید. ثبت نام چند لحظه بیشتر زمان شما را نمیگیرد.