(Android review)SharePreferences的使用

典型应用场合:

进入某一界面以后,显示默认值(其实这个也可以通过直接在布局文件中指定)

基本点:

1)SharePreferences所生成的文件最终还是以.xml文件的形式存在于/data/data/应用包名/share_prefs/xxx.xml中

2)SharePreferences适合用于存储key-value型的数据

基本使用:

存:

Editor editor = sp.edit();//获取编辑器
		editor.putString("name", name);//存储数据(还没进入进入文件)
		editor.putString("phone", phone);
		editor.putString("email", email);
		editor.commit();//提交修改(类似于事务)

取:

sp = getSharedPreferences("data", MODE_PRIVATE);//获取对象,默认指向当前应用.文件名为data.xml,模式为私有
//	    sp = getPreferences(MODE_PRIVATE);//这时候生成的文件名为MainActivity.xml

		et_name.setText(sp.getString("name", ""));
		et_phone.setText(sp.getString("phone", ""));
		et_email.setText(sp.getString("email", ""));

解析:为什么我们使用getPreferences(MODE_PRIVATE)时生成的文件名为MainActivity.xml呢??如下图所示:

其实在之前的博客我就提过,这种很类似的函数,在底层实现的时候,很可能就是你调我,我调你的。。。事实胜于雄辩,源码面前无秘密。。现在我们就去看看Android源码中这两个函数就知道了。。。

源码分析:

先看getSharedPreferences(String name, int mode):

 @Override
    public SharedPreferences getSharedPreferences(String name, int mode) {
        return mBase.getSharedPreferences(name, mode);
    }

接下来,看一下getPreferences(int mode):

 /**
     * Retrieve a {@link SharedPreferences} object for accessing preferences
     * that are private to this activity.  This simply calls the underlying
     * {@link #getSharedPreferences(String, int)} method by passing in this activity‘s
     * class name as the preferences name.
     *
     * @param mode Operating mode.  Use {@link #MODE_PRIVATE} for the default
     *             operation, {@link #MODE_WORLD_READABLE} and
     *             {@link #MODE_WORLD_WRITEABLE} to control permissions.
     *
     * @return Returns the single SharedPreferences instance that can be used
     *         to retrieve and modify the preference values.
     */
    public SharedPreferences getPreferences(int mode) {
        return getSharedPreferences(getLocalClassName(), mode);
    }

getPreferences(int mode)方法中用到了getLocalClassName()这个函数,其实这个函数不需要看它的源码,单单是看它的名字就知道他是干什么的了:获取当前Activity的名字。。。。不过既然看到这里了,我们还是去看一下它的源码都是怎么写的吧。

/**
     * Returns class name for this activity with the package prefix removed.
     * This is the default name used to read and write settings.
     *
     * @return The local class name.
     */
    public String getLocalClassName() {
        final String pkg = getPackageName();
        final String cls = mComponent.getClassName();//获取长类名:包名+类名
        int packageLen = pkg.length();
        if (!cls.startsWith(pkg) || cls.length() <= packageLen
                || cls.charAt(packageLen) != ‘.‘) {
            return cls;
        }
        return cls.substring(packageLen+1);//截取包名后面的那一段.也就是类名
    }

例子:

1、MainActivity

package com.example.sharepreferencetest;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends Activity {

	private EditText et_name;
	private EditText et_phone;
	private EditText et_email;
	private SharedPreferences sp;

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

		et_name = (EditText) findViewById(R.id.nameET);
		et_phone = (EditText) findViewById(R.id.phoneET);
		et_email = (EditText) findViewById(R.id.emailET);

		sp = getSharedPreferences("data", MODE_PRIVATE);//获取对象,默认指向当前应用.文件名为data.xml,模式为私有
//	    sp = getPreferences(MODE_PRIVATE);//这时候生成的文件名为MainActivity.xml

		et_name.setText(sp.getString("name", ""));
		et_phone.setText(sp.getString("phone", ""));
		et_email.setText(sp.getString("email", ""));

	}

	public void onClick(View view){
		String name = et_name.getText().toString();
		String phone = et_phone.getText().toString();
		String email = et_email.getText().toString();

		Editor editor = sp.edit();//获取编辑器
		editor.putString("name", name);//存储数据(还没进入进入文件)
		editor.putString("phone", phone);
		editor.putString("email", email);
		editor.commit();//提交修改(类似于事务)

	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

2、main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="姓名" />

    <EditText
        android:id="@+id/nameET"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPersonName" >

        <requestFocus />
    </EditText>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="电话" />

    <EditText
        android:id="@+id/phoneET"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="phone" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="邮箱" />

    <EditText
        android:id="@+id/emailET"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textEmailAddress" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="保存为默认" />

</LinearLayout>

效果图:

生成的data.xml文件的内容如下:

<?xml version=‘1.0‘ encoding=‘utf-8‘ standalone=‘yes‘ ?>
<map>
<string name="email">[email protected]</string>
<string name="phone">13675173829</string>
<string name="name">hjd</string>
</map>

源码下载:http://download.csdn.net/detail/caihongshijie6/7615023

(Android review)SharePreferences的使用,布布扣,bubuko.com

时间: 2024-10-12 21:49:50

(Android review)SharePreferences的使用的相关文章

(Android review)dialog的使用

一.基本知识点 常见的dialog 基本代码:AlertDialog.Builder builder = new AlertDialog.Builder(this);AlertDialog dialog = builder.create();dialog.show(); 1)常见对话框builder.setMessage("浏览传智播客的网站");builder.setPositiveButton 2)选择对话框builder.setItems(items, new DialogInt

(Android review)打开Activity返回结果

一.基本知识点 其实要完成这个功能很简单: 1.MainActivity startActivityForResult(intent, 100);//第二个是请求码 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(data != null){ if(r

(Android review)XML的解析与序列化

这篇博客主要用来介绍对XML文件的操作:解析与生成. Android手机内部的解析就是pull解析官网:http://xmlpull.org/所谓的解析,我们可以理解为:利用XML文件的内容来生成一个对象导出生成的xml文件后不要对其格式化,否则会出异常 1.MainActivity package com.example.xmlparsertest1; import android.os.Bundle; import android.app.Activity; import android.v

(Android review)ContentProvider的基本使用

1.某些数据库在外面是不能使用的.2.ContentProvider让A程序中的数据能让B程序使用3.ContentProvider主要是共享数据.可以添加ContentObserver来观察数据的变化4.<provider />中的authorities主要用于区分不同的provider5.content://cn.itcast.aqlite.provider((/person)/id)解析:content://    ----->固定写法,必须有cn.itcast.aqlite.pr

(Android review)handler的基本使用

一.基本知识点 1.Intent intent = new Intent();//打开浏览器的intent.setAction(Intent.ACTION_VIEW);intent.setData(Uri.parse("http://www.baidu.com")); 2.SystemClock.sleep(20000);//睡眠20秒,用来掩饰想赢一场 3.耗时的操作都应该子线程中做联网获取数据大文件的拷贝都需要放置在子线程来操作 onCreate()  按钮点击回调事件.对于显示的

(Android review)Activity之间的数据传递

一.基本知识点 1.Activity之间传递数据1)传递基本类型或String intent.putExtra("username", username);  getIntent(); intent.getStringExtra("username"); 2)以bundle的形式传 Bundle bundle = new Bundle();    bundle.putString("username", username);    bundle.

(Android review)ContentObserver

1.一个应用通过ContentObserver来观察自己所监听的数据(某个特定的URI)是否发生了变化2.ContentObserver放在Activity中.CotentProvider专门写一个类3.其实今天模拟这么一个场景.A应用通过原始应用的ContentProvider中提供的方法来操作原始应用的数据. .在原始应用中注册观察者来更新.也可以在B应用中注册观察者来更新 其实,ContentObserver的使用是比较简单的.主要有两个步骤: 1)通过ContentProvider来修改

Android review Android中的测试

Android中的测试无非是分为两种: 一.在一个工程里面写测试代码. 二.专门新建一个工程写测试代码. 一.在一个工程里面写测试代码 步骤: 1.写一个类继承AndroidTestCase 如: package com.example.junittest; import junit.framework.Assert; import android.test.AndroidTestCase; public class MyTest extends AndroidTestCase { public

(Android review)文件的读写(对File的操作)

Android中对操作的文件主要可以分为:File.XML.SharedPreference. 这篇博客主要介绍对File的操作: 1.MainActivity package com.example.filetest; import android.os.Bundle; import android.os.Environment; import android.app.Activity; import android.view.Menu; import android.view.View; i