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 HashMapgetUserDetails(){ 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. HashMapuser = 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.
Hocam Teşekkür Ederim.
Mantığını Kavramamda Yardımcı Oldunuz.