Pemrograman Mobile

Lanjut

#5: Shared Preferences

Muhamad Saad Nurul Ishlah, M.Comp.

 

Program Studi Sistem Informasi, Sekolah Vokasi,

Universitas Pakuan

Pembahasan

  • Shared Preferences
  • Mendengarkan perubahan data

Shared Preferences

Shared Preferences?

  • Tipe penyimpanan data yang memungkinkan membaca (mengembalikan) dan menulis (menyimpan) data primitif sebagai pasangan kunci/nilai (key/value) pada sebuah berkas di penyimpanan perangkat

  • kelas SharedPreferences menyediakan APIs untuk membaca, menulis, dan mengatur data

  • Simpan data di metode callback onPause(), kembalikan data di onCreate()

Shared Preferences dan Saved Instance State

  • Pasangan sejumlah kecil kunci/nilai 
  • Data bersifat private hanya untuk aplikasi

Shared Preferences vs Saved Instance State

Shared Prefernces Saved Instance State
Menyimpan data di seluruh sesi pengguna, bahkan jika aplikasi mati dan restart, atau perangkat di-boot ulang Mempertahankan data status di seluruh instan Activity dalam sesi pengguna yang sama
Data yang harus diingat di seluruh sesi, seperti pengaturan yang disukai pengguna atau skor permainan mereka Data yang tidak boleh diingat di seluruh sesi, seperti tab yang saat ini dipilih atau keadaan aktivitas saat ini.
Secara umum digunakan untuk menyimpan preferensi pengguna Secara umum digunakan untuk membuat ulang state setelah perangkat diputar

Membuat Shared Preferences

  • Hanya membutuhkan 1 berkas Shared Preferences per aplikasi
  • Namai menggunakan nama package dari aplikasi – unik dan mudah diasosiasikan denga aplikasi
  • argumen MODE untuk getSharedPreferences() digunakan untuk backwards compatibility, gunakan MODE_PRIVATE agar aman
private String sharedPrefFile =
	"com.example.android.hellosharedprefs";
mPreferences =
	getSharedPreferences(sharedPrefFile, MODE_PRIVATE);

Menyimpan Shared Preferences

  • Gunakan interface SharedPreferences.Editor
  • Perhatikan semua operasi berkas
  • Lakukan metode overwrite jika terdapat kunci
  • gunakan apply() untuk menyimpan data secara asinkronus dan aman
@Override
protected void onPause() {
   super.onPause();
   SharedPreferences.Editor preferencesEditor =     
       mPreferences.edit();
   preferencesEditor.putInt("count", mCount);
   preferencesEditor.putInt("color", mCurrentColor);
   preferencesEditor.apply();
}

Memulihkan Shared Preferences

  • Pulihkan pada callback onCreate() di Activity
  • Metode pengambilan menggunakan 2 argumen: kunci, dan nilai default jika kunci tidak ditemukan
  • Gunakan argumen default agar tidak perlu melakukan tes apakah preferensi sudah ada di berkas
mPreferences = getSharedPreferences(sharedPrefFile, MODE_PRIVATE);
if (savedInstanceState != null) {
    mCount = mPreferences.getInt("count", 1);
    mShowCount.setText(String.format("%s", mCount));

    mCurrentColor = mPreferences.getInt("color", mCurrentColor);
    mShowCount.setBackgroundColor(mCurrentColor);

    mNewText = mPreferences.getString("text", "");
} else { … }

Membersihkan Shared Preferences

  • Panggil metode clear() pada SharedPreferences.Editor dan tetapkan perubahan
  • Anda dapat mengombinasikan pemanggilan put dan clear. Namun ketika menggunakan apply(), clear() dilakukan lebih dulu, terlepas dari urutan
SharedPreferences.Editor preferencesEditor =
              mPreferences.edit();
preferencesEditor.clear();
preferencesEditor.apply();

Mendengarkan Perubahan Data

Mendengarkan Perubahan

public class SettingsActivity extends AppCompatActivity
    implements OnSharedPreferenceChangeListener { 
    
    ...
    
    public void onSharedPreferenceChanged(
        SharedPreferences sharedPreferences, String key) {
        if (key.equals(MY_KEY)) {
            // Do something
        }
    }
    
    // Instansiasi listener
    SharedPreferences.OnSharedPreferenceChangeListener listener =
        new SharedPreferences.OnSharedPreferenceChangeListener() {
      	
        public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
            // Implementasikan listener di sini
      	}
    };
    
    prefs.registerOnSharedPreferenceChangeListener(listener);

}

STRONG Reference ke listener

  • Ketika mendaftarkan listener, pengatur preferensi tidak menyimpan referensi yang kuat ke listener

  • Anda harus menyimpan referensi yang kuat (strong reference) ke listener, jika tidak, listener tersebut akan rentan terhadap garbage collector

  • Simpan referensi ke listener dalam data instan dari sebuah objek yang akan ada selaman listener itu diperlukan

Contoh Implementasi Shared Preferences

/*
 * Copyright (C) 2016 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.example.android.hellosharedprefs;

import android.content.SharedPreferences;
import android.graphics.drawable.ColorDrawable;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

/**
 * HelloSharedPrefs is an adaptation of the HelloToast app from chapter 1.
 * It includes:
 * - Buttons for changing the background color.
 * - Maintenance of instance state.
 * - Themes and styles.
 * - Read and write shared preferences for the current count and the color.
 * <p>
 * This is the solution code for HelloSharedPrefs.
 */
public class MainActivity extends AppCompatActivity {
    // Current count
    private int mCount = 0;
    // Current background color
    private int mColor;
    // Text view to display both count and color
    private TextView mShowCountTextView;

    // Key for current count
    private final String COUNT_KEY = "count";
    // Key for current color
    private final String COLOR_KEY = "color";

    // Shared preferences object
    private SharedPreferences mPreferences;

    // Name of shared preferences file
    private String sharedPrefFile =
            "com.example.android.hellosharedprefs";


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

        // Initialize views, color, preferences
        mShowCountTextView = findViewById(R.id.count_textview);
        mColor = ContextCompat.getColor(this,
                R.color.default_background);

        mPreferences = getSharedPreferences(sharedPrefFile, MODE_PRIVATE);

        // Restore preferences
        mCount = mPreferences.getInt(COUNT_KEY, 0);
        mShowCountTextView.setText(String.format("%s", mCount));
        mColor = mPreferences.getInt(COLOR_KEY, mColor);
        mShowCountTextView.setBackgroundColor(mColor);
    }

    /**
     * Handles the onClick for the background color buttons.  Gets background
     * color of the button that was clicked, and sets the TextView background
     * to that color.
     *
     * @param view The view (Button) that was clicked.
     */
    public void changeBackground(View view) {
        int color = ((ColorDrawable) view.getBackground()).getColor();
        mShowCountTextView.setBackgroundColor(color);
        mColor = color;
    }

    /**
     * Handles the onClick for the Count button.  Increments the value of the
     * mCount global and updates the TextView.
     *
     * @param view The view (Button) that was clicked.
     */
    public void countUp(View view) {
        mCount++;
        mShowCountTextView.setText(String.format("%s", mCount));
    }

    /**
     * Handles the onClick for the Reset button.  Resets the global count and
     * background variables to the defaults and resets the views to those
     * default values.
     *
     * @param view The view (Button) that was clicked.
     */
    public void reset(View view) {
        // Reset count
        mCount = 0;
        mShowCountTextView.setText(String.format("%s", mCount));

        // Reset color
        mColor = ContextCompat.getColor(this,
                R.color.default_background);
        mShowCountTextView.setBackgroundColor(mColor);

        // Clear preferences
        SharedPreferences.Editor preferencesEditor = mPreferences.edit();
        preferencesEditor.clear();
        preferencesEditor.apply();
    }

    /**
     * Callback for activity pause.  Shared preferences are saved here.
     */
    @Override
    protected void onPause() {
        super.onPause();

        SharedPreferences.Editor preferencesEditor = mPreferences.edit();
        preferencesEditor.putInt(COUNT_KEY, mCount);
        preferencesEditor.putInt(COLOR_KEY, mColor);
        preferencesEditor.apply();
    }
}

Video Tutorial

Referensi

Referensi

Terima Kasih

Made with Slides.com