zoukankan      html  css  js  c++  java
  • Android SharedPreferences

    SharedPreferences的用法

    很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友。对于软件配置参数的保存,如果是window软件通常我们会采用ini文件进行保存,如果是j2se应用,我们会采用properties属性文件进行保存。如果是Android应用,我们最适合采用什么方式保存软件配置参数呢?
    Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下:
    SharedPreferences sharedPreferences = getSharedPreferences("zyj", Context.MODE_PRIVATE);
    Editor editor = sharedPreferences.edit();//获取编辑器
    editor.putString("name", "老李");
    editor.putInt("age", 4);
    editor.commit();//提交修改
    生成的zyj.xml文件内容如下:
    <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
    <map>
    <string name="name">老李</string>
    <int name="age" value="4" />
    </map>
    因为SharedPreferences背后是使用xml文件保存数据,getSharedPreferences(name,mode)方法的第一个参数用于指定该文件的名称,名称不用带后缀,后缀会由Android自动加上。方法的第二个参数指定文件的操作模式,共有四种操作模式,这四种模式前面介绍使用文件方式保存数据时已经讲解过。如果希望SharedPreferences背后使用的xml文件能被其他应用读和写,可以指定定Context.MODE_WORLD_READABLEContext.MODE_WORLD_WRITEABLE权限。
    另外Activity还提供了另一个getPreferences(mode)方法操作SharedPreferences这个方法默认使用当前类不带包名的类名作为文件的名称。
    SharedPreferences其实用的是pull解释器
     
    访问SharedPreferences中的数据代码如下:
    SharedPreferences sharedPreferences = getSharedPreferences("zyj", Context.MODE_PRIVATE);
    //getString()第二个参数为缺省值,如果preference中不存在该key,将返回缺省值
    String name = sharedPreferences.getString("name", "");
    int age = sharedPreferences.getInt("age", 1);
     
    如果访问其他应用中的Preference前提条件是:
    preference创建时指定了Context.MODE_WORLD_READABLEContext.MODE_WORLD_WRITEABLE权限。如:有个<package name>com.jbridge.pres.activity的应用使用下面语句创建了preference
    getSharedPreferences("zyj", Context.MODE_WORLD_READABLE);
    其他应用要访问上面应用的preference首先需要创建上面应用的Context,然后通过Context 访问preference 访问preference时会在应用所在包下的shared_prefs目录找到preference 
    Context otherAppsContext = createPackageContext("com.jbridge.pres.activity", Context.CONTEXT_IGNORE_SECURITY);
    SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("zyj",Context.MODE_WORLD_READABLE);
    String name = sharedPreferences.getString("name", "");
    int age = sharedPreferences.getInt("age", 0);
    如果不通过创建Context访问其他应用的preference,可以以读取xml文件方式直接访问其他应用preference对应的xml文件,如:
    File xmlFile = new File(“/data/data/<package name>/shared_prefs/zyj.xml”);//<package name>应替换成应用的包名
     
    下面,编写一个使用SharedPreferences读写配置文件的小例子。

     

           1.创建Android工程

           Project name:sharedPreferences

           BuildTarget:Android2.2

           Application name:软件参数设置

           Package name:com.com.jbridge.pres.activity

           Create Activity:PreferencesActivity

           Min SDK Version:8

     

           2.编辑strings.xml

    <?xml version="1.0" encoding="utf-8"?>

    <resources>

        <string name="hello">Hello World, PreferencesActivity!</string>

        <string name="app_name">软件参数设置</string>

        <string name="tv_name">姓名</string>

        <string name="tv_age">年龄</string>

        <string name="bt_write">设置</string>

        <string name="bt_read">读取</string>

        <string name="save_success">保存成功</string>

        <string name="save_failed">保存失败</string>

    </resources>

           3.编辑main.xml

    <?xml version="1.0" encoding="utf-8"?>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

        android:orientation="vertical"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        >

        <RelativeLayout android:layout_width="fill_parent" 

                        android:layout_height="wrap_content">

            <TextView 

            android:layout_width="wrap_content" 

            android:layout_height="wrap_content" 

            android:text="@string/tv_name" 

            android:id="@+id/tv_name" 

            android:textSize="30px"

            />

            <EditText 

             android:layout_width="fill_parent"

             android:layout_height="wrap_content" 

             android:id="@+id/et_name" 

            android:layout_toRightOf="@id/tv_name" 

            android:layout_alignTop="@id/tv_name" 

            android:layout_marginLeft="30px"

            />

        </RelativeLayout>

        <RelativeLayout android:layout_width="fill_parent" 

                        android:layout_height="wrap_content">

            <TextView 

            android:layout_width="wrap_content" 

            android:layout_height="wrap_content" 

            android:text="@string/tv_age" 

            android:id="@+id/tv_age" 

             android:textSize="30px"

            />

            <EditText 

             android:layout_width="fill_parent"

             android:layout_height="wrap_content" 

             android:id="@+id/et_age" 

            android:layout_toRightOf="@id/tv_age" 

            android:layout_alignTop="@id/tv_age" 

            android:layout_marginLeft="30px"

            />

        </RelativeLayout>

        <RelativeLayout 

        android:layout_width="fill_parent" 

                        android:layout_height="wrap_content"

        >

            <Button

             android:layout_width="wrap_content" 

            android:layout_height="wrap_content" 

             android:id="@+id/bt_write"

             android:text="@string/bt_write"

             

            />

            <Button

             android:layout_width="wrap_content" 

            android:layout_height="wrap_content" 

             android:id="@+id/bt_read"

             android:text="@string/bt_read"

             android:layout_toRightOf="@id/bt_write" 

            android:layout_alignTop="@id/bt_write" 

            android:layout_marginLeft="30px"

            />

        </RelativeLayout>

         <TextView 

            android:layout_width="fill_parent"

            android:layout_height="wrap_content" 

            android:id="@+id/tv_show" 

            />

    </LinearLayout>

           4.为按钮添加事件代码

    package com.jbridge.pres.activity;

    import android.app.Activity;

    import android.content.Context;

    import android.content.SharedPreferences;

    import android.content.SharedPreferences.Editor;

    import android.content.res.Resources.NotFoundException;

    import android.os.Bundle;

    import android.text.Editable;

    import android.view.View;

    import android.widget.Button;

    import android.widget.EditText;

    import android.widget.TextView;

    import android.widget.Toast;

    public class PreferencesActivity extends Activity {

    private EditText etName;

         private EditText etAge;

      

    private View.OnClickListener onClickListener=new View.OnClickListener() {

     

    public void onClick(View view) {

    Button button=(Button) view;

    SharedPreferences sharedPreferences=PreferencesActivity.this.getSharedPreferences("zyj", Context.MODE_PRIVATE);

    switch (button.getId()) {

    case R.id.bt_write:

    try {

    Editor editor=sharedPreferences.edit();

    editor.putString("name", etName.getText().toString());

    editor.putInt("age",Integer.valueOf(etAge.getText().toString()) );

    editor.commit();

    Toast.makeText(PreferencesActivity.this, R.string.save_success, Toast.LENGTH_LONG).show();

    } catch (NumberFormatException e) {

    Toast.makeText(PreferencesActivity.this, R.string.save_failed, Toast.LENGTH_LONG).show();;

    e.printStackTrace();

    } catch (NotFoundException e) {

    Toast.makeText(PreferencesActivity.this, R.string.save_failed, Toast.LENGTH_LONG).show();;

    e.printStackTrace();

    }

    break;

                case R.id.bt_read:

                String name=sharedPreferences.getString("name", "no name");

                String age=String.valueOf(sharedPreferences.getInt("age", 0));

                TextView tvShow=(TextView) PreferencesActivity.this.findViewById(R.id.tv_show);

    tvShow.setText("姓名: "+name+"     年龄: "+age); 

                break;

    default:

    break;

    }

    }

    };

        @Override

        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.main);

           SharedPreferences sharedPreferences=PreferencesActivity.this.getSharedPreferences("zyj", Context.MODE_PRIVATE);

            etName=(EditText) this.findViewById(R.id.et_name);

            etAge=(EditText) this.findViewById(R.id.et_age);

            etName.setText(sharedPreferences.getString("name", "no name"));

            etAge.setText(String.valueOf(sharedPreferences.getInt("age", 0)));

            Button btWrite=(Button) this.findViewById(R.id.bt_write);

            Button btRead=(Button) this.findViewById(R.id.bt_read);

            btWrite.setOnClickListener(onClickListener);     

            btRead.setOnClickListener(onClickListener);     

        }

        /*

              如果访问其他应用中的Preference,前提条件是:该preference创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE权限。如:有个<package name>为com.jbridge.pres.activity的应用使用下面语句创建了preference。

        getSharedPreferences("zyj", Context.MODE_WORLD_READABLE);

             其他应用要访问上面应用的preference,首先需要创建上面应用的Context,然后通过Context 访问preference ,访问preference时会在应用所在包下的shared_prefs目录找到preference :

        Context otherAppsContext = createPackageContext("com.jbridge.pres.activity", Context.CONTEXT_IGNORE_SECURITY);

        SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("zyj", Context.MODE_WORLD_READABLE);

        String name = sharedPreferences.getString("name", "no name");

        int age = sharedPreferences.getInt("age", 0);

        */

     

    }

           5.运行程序 

           启动模拟器,运行程序。输入名称和年龄,点击保存。我们使用的代码是getSharedPreferences("zyj",Context.MODE_PRIVATE);,当然commit时。它会为我们为”/data/data/com.jbridge.pres.activity/shared_prefszyj.xml”。将 preferences.xml导出,查看它的内容为:

    <?xml version='1.0' encoding='utf-8' standalone='yes' ?><map><string name="name">zyj</string><int name="age" value="22" /></map>
    欧克蓝科技
  • 相关阅读:
    Oracle 11g数据库详解
    1.Oracle数据库查看用户锁表和对表解锁的sql语句
    ORACLE性能优化- Buffer cache 的调整与优化
    excel数据生成sql insert语句
    Python_二叉树
    Python_自定义栈
    Python_内置四种队列
    Python_重写集合
    python_pycharm下拉前置标示
    python_形参何时影响实参
  • 原文地址:https://www.cnblogs.com/sias/p/3763379.html
Copyright © 2011-2022 走看看