Android SharedPreferences ile Session Yönetimi

 

Merhaba dostlar, bugün sizlerle Android‘in bir çok veri kaydetme yollarından biri olan SharedPreferences hakkında konuşacağız. Yazının sonunda ise çalışan örnek uygulamamın github linkini sizinle paylaşacağım.

SharedPreferences anahtar-değer (key-value) ikilisini kullanarak veri kaydedip çağırmakta kullanılır. Bu yöntem genel olarak az miktarda verimiz olduğu zaman kullanılmakta, daha karmaşık verilerde veritabanı kullanmak daha mantıklı olacaktır. Biz session verileri tutacağımız için tam olarak aradığımız özellikleri sunacaktır. Şimdi bizim örnek kullanım senaryomuza bakalım.

Senaryomuz şu şekilde dostlar: Kullanıcımız, email ve sifre bilgileri ile uygulamamıza giriş yapmak istiyor. Kullanıcının girdiği bilgileri olması gereken veriler ile (normal hayat senaryosunda veritabanımız ile karşılaştırmamız daha mantıklı olacaktır) karşılaştırıyoruz eğer bilgiler doğru ise daha sonraki girişlerinde direk ana sayfaya yönlendirmek için email ve sifre bilgilerini SharedPreferences ile kayıt altına alıyoruz.
Bu yazıda veritabanı kısmını es geçeceğiz ve direk girilen email ve şifreyi alarak kaydedeceğiz. Uygulamayı kapatıp açtığımızda girdiğimiz veriler kayıtlı şekilde duruyor olacak.

Hemen başlayalım ve adımlarımızı konuşalım.

 

1) SessionManager.java sınıfımızı oluşturmak

 

Bu adımda session yönetimimizi yapıyoruz, SharedPreferences tanımlamalarımızı ve çağırmak istediğimiz fonksiyonları burada yazıyoruz. Biz dört farklı fonksiyon yazacağız, Giriş (kullanıcı bilgilerini kaydet ve giriş yap), çıkış (bilgileri sil ve çıkış yap), bilgileri çağır ve kontrol et. Kod açıklamalarını kod yanlarına yazdım, oradan daha detaylı anlayabilirsiniz.


package com.sharedpreferencesornek.akilinc.sharedpreferencesornek;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;

import java.util.HashMap;

public class SessionManager {

    // SharedPreferences nesnesi
    SharedPreferences pref;

    //Shared preferences için Editor nesnesi
    SharedPreferences.Editor editor;

    // Context
    Context _context;

    // Shared pref mod
    int PRIVATE_MODE = 0;

    // Sharedpref dosya adı
    private static final String PREF_NAME = "SharedPreferencesOrnek";

    //SharedPreferences için key-value'lar.
    private static final String IS_LOGIN = "IsLoggedIn";

    //email ve sifre keylerini her yerden ulaşılabilmesi için public yapıyoruz.
    public static final String KEY_EMAIL = "email";

    public static final String KEY_SIFRE = "sifre";

    // Yapıcı fonksiyonumuz
    public SessionManager(Context context){

        this._context = context;
        pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
        editor = pref.edit();
    }

    /**
     * login session'ı oluşturuyoruz. Ilk defa gelen veriyi kaydediyoruz.
     * */
    public void createLoginSession(String email, String sifre){

        // giriş yapıldığında login değerini true yapıyoruz.
        editor.putBoolean(IS_LOGIN, true);

        // email ve sifreyi editor ile kaydediyoruz.
        editor.putString(KEY_EMAIL, email);

        editor.putString(KEY_SIFRE, sifre);

        // değişiklikleri yolluyoruz.
        editor.commit();
    }

    /**
     * Kullanıcının login durumunu kontrol etmek
     * Eger false ise girmesi yasak olan yerden çıkartmak
     * true ise girebilmesini sağlamak.
     * */
    public void checkLogin(){

        if(!this.isLoggedIn()){

            // Kullanıcı girmemesi gereken yerde, giriş sayfasına yönlendir.
            Intent i = new Intent(_context, MainActivity.class);
            // flagler ile her şeyi sil
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            _context.startActivity(i);
        }
    }

    /**
     * Kaydedilen verileri çağırma,
     * */
    public HashMap getUserDetails(){

        HashMap user = new HashMap();

        user.put(KEY_EMAIL, pref.getString(KEY_EMAIL, null));

        user.put(KEY_SIFRE, pref.getString(KEY_SIFRE, null));

        return user;
    }

    /**
     * çıkış yapıldığında session bilgilerini sil.
     * */
    public void logoutUser(){

        // Shared Preferences dan tüm verileri sil.
        editor.clear();
        editor.commit();

        // çıkıştan sonra giriş ekranına yönlendir.
        Intent i = new Intent(_context, MainActivity.class);

        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        _context.startActivity(i);
    }

    /**
     * Giriş için hızlı kontrol.
     * **/
    public boolean isLoggedIn(){

        return pref.getBoolean(IS_LOGIN, false);
    }
}

 

2) Kullanıcı girişimiz ve session kayıt fonksiyonlarını çağırmak için bir activity oluşturmak

 

Bu örnekte MainActivty bizim giriş sayfamız olacak. Aşağıda örnek xml dosyasını ve java dosyasını görebilirsiniz.

activity_main.xml dosyasında iki EditText bir de Button bulunmakta. EditText‘ler email ve sifre girişi için kullanılacak, button ise fonksiyonlarımızı tetiklemek için kullanılacak.

MainActivity.java ise EditTexlerden bilgileri alıp kontrol edip daha sonrasında Session‘a kaydederek bizi sonraki sayfaya yollayacak. Açıklamalarını yine java dosyasının içinde bulabilirsiniz.

activity_main.xml



    

    

    

MainActivity.java


package com.sharedpreferencesornek.akilinc.sharedpreferencesornek;

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

public class MainActivity extends AppCompatActivity {

    //session durumu
    SessionManager session;

    //EditText'lerimiz
    EditText etEmail;
    EditText etSifre;
    Button btnGiris;

    //EditTextlerdeki verileri kaydedeceğimiz Stringler
    String email, sifre;

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

        // Session Manager tanımladık.
        session = new SessionManager(getApplicationContext());

        //activity mizin başında hemen login durumunu kontrol ediyoruz, eğer session varsa giriş ekranını geçiyoruz.
        if (session.isLoggedIn() == true){

            startActivity(new Intent(MainActivity.this, AsilSayfa.class));
        }

        //xml dosyasındaki objelerin tanımlamalarını yaptık.
        etEmail = findViewById(R.id.editTextEmail);
        etSifre = findViewById(R.id.editTextSifre);
        btnGiris = findViewById(R.id.buttonGiris);

        //button'ın onClickListener'ı
        btnGiris.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //editTextlerimizin boş olup olmadığını denetliyoruz.
                if (etEmail.getText().toString().isEmpty() || etSifre.getText().toString().isEmpty()){

                    Toast.makeText(getApplicationContext(), "Alanlar Boş Bırakılamaz.", Toast.LENGTH_LONG).show();
                }

                else{

                    //EditTextler boş değil ise Stringlerimize atadık.
                    email = etEmail.getText().toString();
                    sifre = etSifre.getText().toString();

                    //login kontrolünü yapacağımız fonksiyona Stringlerimizi yolladık.
                    loginCheck(email, sifre);
                }
            }
        });
    }

    //giriş kontrolünü yapacağımız fonksiyon.
    //Burada normalde veritabanından verilerle kıyaslamamız daha mantıklı olacaktır.
    //Bizim konumuz SharedPreferences olduğu için basit iki değer ile kıyasladık.
    private void loginCheck(String email, String sifre){

        //EditTextlerdeki verilerle olmasını istediğimiz verileri kıyasladık.
        if (email.equals("ahmet@ahmetkilinc.net") && sifre.equals("ahmet")){

            Toast.makeText(getApplicationContext(), "Giriş Başarılı.", Toast.LENGTH_LONG).show();

            //giriş başarılı ise Session'a verilerimizi yolladık.
            session.createLoginSession(email, sifre);

            //sonraki sayfaya yönlendirdik.
            startActivity(new Intent(MainActivity.this, AsilSayfa.class));
        }

        else{

            //giriş başarısız mesajı yazdırdık.
            Toast.makeText(getApplicationContext(), "Email veya Sifre Hatalı. Tekrar Deneyin.", Toast.LENGTH_LONG).show();
        }
    }
}


 

3) Başarılı bir girişten sonra açılacak sayfamızı oluşturmak

 

Başarılı bir girişten sonra uygulamamızın içeriğini görebileceğimiz sayfamız açılacak, burada session var mı yok mu diye kontrol edeceğiz. Eğer session yok ise, kullanıcıyı giriş sayfasına yönlendireceğiz. Var ise session bilgilerini TextView’lerimizin içine yazdıracağız. Çıkış butonumuz ise session’ı sonlandıracak ve kullanıcıyı giriş sayfasına yönlendirecek.

Bunları gerçekleştirmek için yeni bir activity oluşturalım, adını istediğiniz gibi koyabilirisniz, bu örnekte yeni sayfamızın adı AsilSayfa olacak, aşağıda AsilSayfa.java ve activity_asil_sayfa.xml dosyalarının kodlarını bulabilirsiniz. Java kodlarının açıklamaları dosya üstündedir.

activity_asil_sayfa.xml





    

    

    

    

AsilSayfa.java


package com.sharedpreferencesornek.akilinc.sharedpreferencesornek;

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

import java.util.HashMap;

public class AsilSayfa extends AppCompatActivity {

    // Session Manager Class
    SessionManager session;

    //TextViewlerimiz
    TextView tvEmail;
    TextView tvSifre;

    //Çıkış butonumuz
    Button btnCikis;

    //sessiondan alacağımız Stringlerimizi kaydedeceğimiz Stringler
    String email, sifre;

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

        //TextView tanımlamaları
        tvEmail = findViewById(R.id.textViewemail);
        tvSifre = findViewById(R.id.textViewsifre);
        btnCikis = findViewById(R.id.buttonCikis);

        // session verileri için sınıfımızı çağırdık
        session = new SessionManager(getApplicationContext());

        // sessiondan kullanıcı verilerini almak için nesnemizi oluşturduk.
        HashMap user = session.getUserDetails();

        //keylerine göre user nesnemizden verilerimizi çağırdık ve ekledik.
        email = user.get(SessionManager.KEY_EMAIL);
        sifre = user.get(SessionManager.KEY_SIFRE);


        //session'ın varlığını sorguluyoruz. eğer boş ise giriş sayfasına yönlendiriyoruz.
        if (email.isEmpty() || sifre.isEmpty()){

            Toast.makeText(getApplicationContext(), "Lütfen Giriş Yapınız.", Toast.LENGTH_LONG).show();
            startActivity(new Intent(getApplicationContext(), MainActivity.class));
        }

        else{

            //session boş değil ise TextViewlerimize session bilgilerini yazdırıyoruz.
            tvEmail.setText(email);
            tvSifre.setText(sifre);
        }

        //çıkış butonunun onClickListener'ı
        btnCikis.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Session çıkış fonksiyonunu çalıştırıyoruz.
                session.logoutUser();

                Intent i = new Intent(getApplicationContext(), MainActivity.class);
                //çıkış yapıldıktan sonra giriş sayfasında geri butonu sorununu çözmek için flagler ayarladık.
                i.setFlags(i.FLAG_ACTIVITY_CLEAR_TOP | i.FLAG_ACTIVITY_CLEAR_TASK | i.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i);
            }
        });
    }
}


 

Evet dostlar bugün çokça önemli olan bir konu hakkında konuştuk. Söz verdiğim gibi github linkine şuradan ulaşabilirsiniz. Herhangi bir sorunda yorum yazabilir veya mail ile danışabilirsiniz. Kendinize dikkat edin.

ahmet

Ahmet Kılınç - Software Developer

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. delico dedi ki:

    Hocam Teşekkür Ederim.
    Mantığını Kavramamda Yardımcı Oldunuz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.