2011-11-17

在 Android 使用 Preference 儲存資料

在程式結束後還要保留下來的資料,簡單的可以用 Preference 以 key-value 的方式存到手機裡,複雜的可以用檔案或者 SQLite。

使用 Preference 讀寫資料相當簡單。

PreferenceActivity
public class PreferenceActivity extends Activity {

    private static final String TAG = "PreferenceActivity";
    private static final String CURRENT_KEY = "MAX";
    private static final int MAX = 30;
    private CountDownHandler handler;
    private TextView tv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate...");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        this.handler = new CountDownHandler();
        this.tv = (TextView) this.findViewById(R.id.tv);
    }

    @Override
    protected void onResume() {
        Log.d(TAG, "onResume...");
        super.onResume();
        // 從 Preference 裡讀取上次保留的值,如果沒有就用預設值
        SharedPreferences pref = this.getPreferences(MODE_PRIVATE);
        int current = pref.getInt(PreferenceActivity.CURRENT_KEY,
                PreferenceActivity.MAX);
        Log.d(TAG, "Get the current from preference..." + current);
        this.handler.current = current;
        this.handler.pause = false;
        this.handler.sendEmptyMessage(0);
    }

    @Override
    protected void onPause() {
        Log.d(TAG, "onPause...");
        super.onPause();
        this.handler.pause = true;
        // 程式暫停,將目前的值寫到 Preference
        SharedPreferences pref = this.getPreferences(MODE_PRIVATE);
        Editor editor = pref.edit();
        editor.putInt(PreferenceActivity.CURRENT_KEY, this.handler.current);
        // 一定要 commit
        editor.commit();
        Log.d(TAG, "Put the current to preference..." + this.handler.current);
    }

    public void show(int max) {
        this.tv.setText(String.valueOf(max));
    }

    public void reset(View view) {
        Log.d(TAG, "reset...");
        int cur = this.handler.current;
        this.handler.current = PreferenceActivity.MAX;
        if (cur == 0) {
            this.handler.sendEmptyMessage(0);
        }
    }

    private final class CountDownHandler extends Handler {

        private boolean pause;
        private int current;

        public CountDownHandler() {
            Log.d(TAG, "new a CountDownHandler...");
        }

        @Override
        public void handleMessage(Message msg) {
            Log.d(TAG, "handleMessage..." + this.current);
            if (this.pause) {
                Log.d(TAG, "paused!");
                return;
            }
            if (this.current == 0) {
                Log.d(TAG, "finished!");
                return;
            }
            this.current--;
            show(this.current);
            this.sendMessageDelayed(this.obtainMessage(), 1000);
        }
    }
}
main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
    <TextView  
        android:id="@+id/tv"
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      />
    <Button  
        android:id="@+id/btn"
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Reset"
      android:onClick="reset"
      />
</LinearLayout>


沒有留言:

張貼留言