Using Android Preferences

Hai-Lai ư, đúng thật, blog của mình tiếng anh thì sai cú pháp, lúc anh lúc Việt thậm chí lúc em. :)). Sở thích hay sao ấy, tôi thích sự lộn xộn. Từ giờ có lẽ blog sẽ là nơi luyện từ vựng anh của mình bằng cách dịch những bài viết hay từ các trang web khác và luyện gõ tiếng anh cho quen tay. Hôm nay tôi muốn dịch một bài viết về việc sử dụng Preferences trong Android.

 

Trước đây,  khi chúng ta viết một ứng dụng mà nó liên quan tới việc lưu trữ  dữ liệu thì chắc hẳn nhiều bạn sẽ nghĩ ngay tới Sqlite database nhưng ngoài điều đó ra Android còn cung cấp một cách khác để lưu trữ dữ liệu người dùng thông qua việc sử dụng preferences

Preference trong Android lưu trữ theo dạng Key-Value.Nó có thể lưu trữ dữ liệu cho một Activity cụ thể hoặc chia sẻ  dữ liệu giữa tất cả các Activity trong ứng dụng của bạn, và dữ liệu được lưu trữ trong một file xml.

Saving Preferences

Chúng ta có thể save preferences theo 3 cách sau.

1. Preferences có thể lấy về chỉ bởi một Activity đơn.

2. Preferences có thể được chia sẻ hoặc lấy về giữa tất các các Activity bên trong ứng dụng.

3. Preferences có thể được chia sẻ và lấy về thông qua tất cả các ứng dụng trong device.

 

Saving Activity-level preferences:

Để Save Preferencesmaf nó chỉ được truy cập từ một Activity đơn, chúng ta có thể làm nó như sau :

SharedPreferences prefs=getPreferences(Context.MODE_PRIVATE);
        SharedPreferences.Editor editor=prefs.edit();
        editor.putString("pref 1", "some text");
        
        editor.commit();

Chúng ta lấy về một đối tượng SharePreferences thông qua lời gọi phương thức getPreferences(int mode). Đối số kiểu integer mà chúng ta đưa vào có thể là :

  • Context.MODE_PRIVATE (0) : Một file được tạo và nó chỉ được truy cập bởi ứng dụng hiện tại mà thôi (Có thể là cùng Context).
  • Context.MODE_WORLD_READABLE (1) : File được tạo theo chế độ cho phép đọc từ ứng dụng khác.
  • Context.MODE_WORLD_WRITEABLE (2) : File được tạo theo chế độ cho phép ứng dụng khác có thể thay đổi nó, tức có thể ghi vào nó.

Sau đó chúng ta lấy một instnce của SharePreferences.Editor và ghi lên preferences thông qua phương thức editor.putString(“pref 1”, “some text”);

ShrarePreferences cho phép chúng ta thêm preferences bằng cách sử dụng các phương thức sau :

  • editor.putBoolean(String key, boolean value).
  • editor.putFloat(String key,float value).
  • editor.putInt(String key, int value).
  • editor.putLong(String key, long value)
  • editor.putString(String key, String value)

Sau đó chúng ta sẽ gọi edit.commit() để lưu preferences tới file. commit trả về một kiểu boolean, true nếu thành công và false nếu thất bại.

Reading preferences values:

Để đọc giá trị của preferences:

              SharedPreferences prefs=getPreferences(Context.MODE_PRIVATE);
              String val=prefs.getString("pref 1", "some text");

Chúng ta sử dụng ShrarePreferences.getString(key-value) để trả về các giá trị đã lưu trữ từ trước theo các key tương ứng, và tất nhiên có thể dùng get boolean-float-int.

Saving Application-level preferences:

Để lưu Preferences mà chúng ta có thể lấy về từ tất các Activity trong ứng dụng hiện tại thì chúng ta có thể làm như sau :

SharedPreferences prefs= getSharedPreferences("demopref", Context.MODE_WORLD_READABLE);
        SharedPreferences.Editor editor=prefs.edit();
        editor.putString("demostring", "hello");
        editor.commit();

Giống như đoạn code phía trên, nhưng sự khác biệt là chúng ta cho Preferences một cái tên và nó là demopref trong trường hợp này, vì vậy mà các activity khác có thể tham chiếu tới nó.

Sharing preferences across applications:

Chúng ta có thể lưu trữ Preferences trong một ứng dụng và đọc chúng từ một ứng dụng khác, điều này có thể đọc Preferences thông qua Context của ứng dựng đầu tiên..
ví dụ như chúng ta có hai ứng dụng :

  • Ứng dụng 1 với package name là : com.mina.prefdemo
  • Ứng dụng 2 có package name là : com.mina.demoapp

Nếu ứng dụng đầu tiên tạo một Preferences với tên là demopref và insert một String preference với key/value “demostring/hello”.

Bây giờ chúng ta sẽ truy cập vào file này và giá trị từ App 2 sẽ giống như thế này :

Context con;
  try {
   con = createPackageContext("com.minasamy.prefdemo", 0);
   SharedPreferences pref=con.getSharedPreferences("demopref", Context.MODE_PRIVATE);
   String x=pref.getString("demostring", "not found");
   txt.setText(x);
  } catch (NameNotFoundException e) {
   Log.e(Tag, e.toString());
  }

Creating Preferences Activities:

Android cung cấp một cách khác rất tốt cho việc saving Preferences. Bạn có thể tạo một Activity mà extend từ PreferenceActivity.
PreferenceActivity là một Activity mà hiển thị một tập các preference xây dựng trong nó và quan hệ với các Widget mà được định nghĩa trong xml file.

  • CheckBoxPreference
  • EditTextPreference
  • RingtonePreference
  • ListPreference –> Hiển thị danh sách các key/value

Xml file :

Sau đó là Activity của chúng ta :

public class PrefActivity extends PreferenceActivity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  addPreferencesFromResource(R.xml.prefs);
  
 }
}




ListPreference có thể quan hệ với các String Array như key-value

Bài Viết được viết gần 1h đồng hồ vật vã. 1/6/2011

Advertisements

10 thoughts on “Using Android Preferences

    1. Sharing Post author

      Cảm ơn đưa cầu hỏi tới blog, một câu hỏi thú vị thật, nhưng mình không biết được bạn cần lưu ở mức độ nào, tuy nhiên nếu chỉ đáp ứng bạn lưu những giá trị của mảng thì bạn cần lưu ý, rằng cáu KEY bạn phải thay đổi, nếu như KEY bạn không thay đổi thì các giá trị nó sẽ update sau mỗi lần cập nhật giá trị từ mảng, OK, vì thế bạn cần thay đổi nó, ở đây mình ví dụ :update.putString(KEY+i, store[i]); 10 KEY sẽ được lưu vào file android.xml. Bạn nên tham khảo bài viết này nữa :http://developer.android.com/reference/android/preference/ListPreference.html, Good luck !!!

      package SharePreferences.demo;
      
      import android.app.Activity;
      import android.content.SharedPreferences;
      import android.os.Bundle;
      import android.util.Log;
      
      public class SharePreferencesActivity extends Activity {
      	String NAME = "android";
      	String KEY = "TEXT";
          /** Called when the activity is first created. */
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.main);
              
              String[] store = new String[10];
              for(int i=0; i<10; i++){
              	store[i]="VALUES("+i+")";
              }
              
              for(int i=0; i<10; i++){
              	Log.d("store["+i+"]", store[i]);
              }
              SharedPreferences editor = this.getSharedPreferences(NAME, Activity.MODE_APPEND);
              SharedPreferences.Editor update = editor.edit();
              
              for(int i=0; i<10; i++){
              	update.putString(KEY+i, store[i]);
              }
              update.commit();
              
          }
      }
      
      Reply
    1. Sharing Post author

      Hi, bạn có thể hiểu như thế này.
      Trong android có một số kiểu lưu trữ data trong nó: Sqlite, file, sharepreference , và sharepreference là một kiểu lưu trữ kiểu Xml, mục đích của nó như trong bài viết bạn thấy có các chế độ (mode) khi sủ dụng nó, cái hay là nó có thể chia sẻ dữ liệu giữa các ứng dụng cho bạn. http://developer.android.com/reference/android/content/SharedPreferences.html

      Reply
  1. hohoanganh205

    “chia sẻ dữ liệu giữa các ứng dụng” ? bạn có thể nói cụ thể ko? chẳng hạn trong trường hợp nào thì cần làm SaredP mà ko thể dùng Sqlite, file … cám ơn bạn

    Reply
    1. Sharing Post author

      Xin lỗi bạn nhé, ý tớ là chia sẻ giữa các Activity. Vừa về tới nhà vào blog thì thấy reply, bạn tham khảo link sau nhé …. http://stackoverflow.com/questions/5734721/android-shared-preferences, bữa làm bao nhiêu là demo về android mà cái linux lúc đó nó bị điên nên mất hết, tiếc quá hok public được, giờ lại chẳng làm gì liên quan tới mobile, :)). Khi bạn đã hiểu được cơ chế của cái này, thì lúc đó cái chia sẻ giữa các ứng dụng bạn sẽ làm được, nó cũng chỉ thông qua package thôi …

      Reply

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s