Lưu trữ dữ liệu trên thiết bị với Android SharedPreferences
Công ty Vĩnh Cửu tuyển dụng lập trình viên Java

1- SharedPreferences là gì?

Trước hết để làm rõ SharedPreferences là gì hãy xem một tình huống:

Bạn đang chơi một trò chơi trên Android, trước khi chơi trò chơi đó bạn lựa chọn các thông số của trò chơi chẳng hạn độ sáng trong trò chơi, mức độ âm lượng, và độ khó. Sau khi chơi xong bạn tắt trò chơi và có thể tiếp tục chơi vào ngày hôm sau. SharedPreferences cho phép bạn lưu lại các các thông số bạn đã thiết lập trước đó, để cho phép khi bạn chơi lại các thiết lập đó có thể sử dụng mà không cần phải thiết lập lại.
SharedPreferences lưu các dữ liệu thô dưới dạng các cặp khóa và giá trị (key-value) vào các tập tin của ứng dụng. Bạn cũng có thể chọn một chế độ lưu trữ riêng tư (PRIVATE) mà các ứng dụng khác không thể truy cập vào các tập tin này, chính vì vậy nó là an toàn.

2- Ví dụ với SharedPreferences

Xem trước hình ảnh giao diện của ứng dụng:
Tạo mới project có tên AndroidSharedPreferences:
Thiết kế giao diện:

SLIDER:

activity_main.xml
<?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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="org.o7planning.androidsharedpreferences.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Game Setting:"
        android:id="@+id/textView_setting"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Sound:"
        android:id="@+id/textView_sound"
        android:layout_below="@+id/textView_setting"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="35dp" />

    <SeekBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/seekBar_sound"
        android:layout_below="@+id/textView_sound"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="35dp"
        android:layout_alignRight="@+id/textView_setting"
        android:layout_alignEnd="@+id/textView_setting"
        android:max="100"
        android:progress="90"
        android:indeterminate="false" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Brightness:"
        android:id="@+id/textView_brightness"
        android:layout_below="@+id/seekBar_sound"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="35dp" />

    <SeekBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/seekBar_brightness"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignEnd="@+id/seekBar_sound"
        android:max="100"
        android:progress="95"
        android:indeterminate="false"
        android:layout_below="@+id/textView_brightness"
        android:layout_marginTop="35dp"
        android:layout_alignRight="@+id/textView_setting" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Difficulty Level"
        android:id="@+id/textView_diffLevel"
        android:layout_below="@+id/seekBar_brightness"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="35dp" />

    <RadioGroup
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_below="@+id/textView_diffLevel"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="35dp"
        android:orientation="horizontal"
        android:id="@+id/radioGroup_diffLevel">

        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Easy"
            android:id="@+id/radioButton_easy"
            android:checked="false" />

        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Medium"
            android:id="@+id/radioButton_medium"
            android:checked="false" />

        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hard"
            android:id="@+id/radioButton_hard"
            android:checked="false" />
    </RadioGroup>

    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Save"
        android:id="@+id/button"
        android:layout_below="@+id/radioGroup_diffLevel"
        android:layout_toRightOf="@+id/textView_diffLevel"
        android:onClick="doSave" />

</RelativeLayout>
MainActivity.java
package org.o7planning.androidsharedpreferences;

import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.SeekBar;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {


   private SeekBar seekBarSound ;
   private SeekBar seekBarBrightness;

   private RadioGroup radioGroupDiffLevel;
   private RadioButton radioButtonEasy;
   private RadioButton radioButtonMedium;
   private RadioButton radioButtonHard;

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

       this.seekBarBrightness= (SeekBar)this.findViewById(R.id.seekBar_brightness);
       this.seekBarSound= (SeekBar)this.findViewById(R.id.seekBar_sound);

       this.radioGroupDiffLevel= (RadioGroup) this.findViewById(R.id.radioGroup_diffLevel);
       this.radioButtonEasy=(RadioButton) this.findViewById(R.id.radioButton_easy);

       this.radioButtonMedium = (RadioButton)this.findViewById(R.id.radioButton_medium);
       this.radioButtonHard=(RadioButton) this.findViewById(R.id.radioButton_hard);


       // Hiển thị thông sét đặt đã lưu lại trong lần chơi trước.
       this.loadGameSetting();
   }


   private void loadGameSetting()  {
       SharedPreferences sharedPreferences= this.getSharedPreferences("gameSetting", Context.MODE_PRIVATE);

       if(sharedPreferences!= null) {

           int brightness = sharedPreferences.getInt("brightness", 90);
           int sound = sharedPreferences.getInt("sound",95);
           int checkedRadioButtonId = sharedPreferences.getInt("checkedRadioButtonId", R.id.radioButton_medium);

           this.seekBarSound.setProgress(sound);
           this.seekBarBrightness.setProgress(brightness);
           this.radioGroupDiffLevel.check(checkedRadioButtonId);

       } else {
           this.radioGroupDiffLevel.check(R.id.radioButton_medium);
           Toast.makeText(this,"Use the default game setting",Toast.LENGTH_LONG).show();
       }

   }


   // Được gọi khi người dùng nhấn vào nút Save.
   public void doSave(View view)  {

       // File chia sẻ sử dụng trong nội bộ ứng dụng, hoặc các ứng dụng được chia sẻ cùng User.
       SharedPreferences sharedPreferences= this.getSharedPreferences("gameSetting", Context.MODE_PRIVATE);

       SharedPreferences.Editor editor = sharedPreferences.edit();

       editor.putInt("brightness", this.seekBarBrightness.getProgress());
       editor.putInt("sound", this.seekBarSound.getProgress());


       // ID của RadioButton đang được chọn.
       int checkedRadioButtonId = radioGroupDiffLevel.getCheckedRadioButtonId();

       editor.putInt("checkedRadioButtonId", checkedRadioButtonId);

       // Save.
       editor.apply();

       Toast.makeText(this,"Game Setting saved!",Toast.LENGTH_LONG).show();
   }
}
Chạy ứng dụng của bạn.
Sau khi save, bạn có thể tắt ứng dụng, và mở lại nó các thông số mà bạn đã lưu lại tự động được sét đặt cho trò chơi.