学习安卓之——SharedPreferences

学习安卓之——SharedPreferences

此文章转载于:https://www.cnblogs.com/smyhvae/p/4019379.html
原作者:千古壹号

一、Android数据的存储方式:

Android系统一共提供了四种数据存储方式。分别是:

SharePreference、SQLite、Content Provider和File;此外还有一种网络存储。由于Android系统中,数据基本都是私有的,都是存放于“data/data/程序包名”目录下,所以要实现数据共享,正确方式是使用Content Provider。

在Android中,可以使用几种方式实现数据持久化:
•Shared Preferences:除SQLite数据库外,另一种常用的数据存储方式。共享参数形式,一种以Key-Value的键值对形式保存数据的方式,其本质就是一个xml文件。Android内置的,一般应用的配置信息,推荐使用此种方式保存。
•Internal Storage:使用Android设备自带的内存存储数据。

•External Storage:使用外部存储设备存储数据,一般是指Sdcard。

•SQLite Databases:以SQLite数据库存储结构化的数据。SQLite是一个轻量级的数据库,支持基本SQL语法,是常被采用的一种数据存储方式。Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的API。

•Network Connection:使用基于网络的服务获取数据。

二、Android的文件系统:

1、Android系统文件目录:

在这里插入图片描述

2、Android的应用数据存储机制:

在Android中,第三方应用及其数据,都存放在data目录下。其中,应用安装包会被存放到/data/app/目录下,每个安装包的文件名都形如:应用包名.apk,以避免重复。比如包名为com.test.sample的应用,其应用数据的目录为/data/data/com.test.sample/。对应的数据库文件存储在/data/data/com.test.sample/database/目录下,设置文件存储在/data/data/com.test.sample/shared_prefs/,自定义的应用数据文件存储在目录/data/data/com.test.sample/files/下,等等。

不仅如此,Android还会为每个应用创建一个账号,只有通过本应用的账号才有权限去运行该应用的安装包文件,读写应用数据目录下的文件(当然root权限除外),从而保证了该应用数据不会再被其他应用获取或破坏。

3、Android的文件操作:

从应用数据目录下可以看出,数据文件可以分成两类,一类是放置在扩展存储器中的文件,即/sdcard/目录下的文件,它们可以被各个应用共享;而另一类则是放在该应用数据目录下文件,它们仅能被各个应用独享,不能被其他应用读写。

三、SharedPreferences:

在所有应用程序中,都必然涉及数据的交互。有些时候,应用程序有少量的数据需要保存,并且这些数据的格式很简单。比如:软件设置、用户账户设置,用户习惯设置等,这个时候就可以用到SharedPreferences。

其实,SharedPreferences使用xml格式为Android应用提供一种永久的数据存贮方式,并且是使用键值对的方式来存储数据的。对于一个Android应用,它存贮在文件系统的/data/data/your_app_package_name/shared_prefs/目录下,可以被处在同一个应用中的所有Activity 访问。Android 提提供了相关的API来处理这些数据而不需要程序员直接操作这些文件或者考虑数据同步的问题。

因为SharedPreferences本身是一个接口,程序无法直接创建SharedPreferences的实例,只能通过Context提供的getSharedPreferences(String name,int mode)方法来获取SharedPreferences的实例:

public abstract SharedPreferences getSharedPreferences(String name,int mode)

此方法接收两个参数,第一个参数用于指定SharedPreferences文件的名称(格式为xml文件),如果指定的文件不存在则会创建一个。SharedPreferences文件都是存放在/data/data//shared_prefs/目录下的;第二个参数用于指定操作模式:

•MODE_PRIVATE:默认操作模式,和直接传0效果相同,表示只有当前应用程序才可以对这个SharedPreferences文件进行读写

•MODE_WORLD_READABLE:指定此SharedPreferences对其他程序只读且无法修改。

•MODE_WORLD_WRITEABLE:指定此SharedPreferences能被其他程序读写。

•MODE_MULTI_PROCESS:Android2.3之后已经弃之不用了。

得到SharedPreferences对象后,就可以向SharedPreferences文件中存储数据了,主要分为以下三步:

•调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象

•向SharedPreferences.Editor对象中添加数据,比如添加一个布尔型数据就使用putBoolean方法,添加一个字符串就用putString()方法,以此类推

•调用commit()方法将添加的数据提交,从而完成数据存储操作

四、实例:保存编辑的短信内容:

通常情况下会发生这样的问题,我们在编辑短信的同时有电话打进来,那么接电话肯定是要启动另一个Activiy,那么当前编辑短信的Activity所编辑的信息我们想暂时保存下来,等接完电话后回到该Activity时,可以继续编辑短信。该功能需要如何去实现呢?

(1)保存数据:

首先使用SharedPreferences这个工具类:

 1     private EditText etMsg ;
 2     private Button sendButton;
 3     private SharedPreferences sp;
 4     
 5     @Override
 6         protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9         
10         etMsg = (EditText)findViewById(R.id.editText1);
11         sendButton = (Button)findViewById(R.id.button1);
12         
13         // 获取共享属性操作的工具(文件名,操作模式)
14         sp = This.getSharedPreferences("data", 0);
15     }

总结之后,最终的完整版代码如下:

activity_main.xml文件代码:

<LinearLayout 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:orientation="vertical"
    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=".MainActivity" >
    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:gravity="top"
        android:layout_weight="1"
        android:ems="10" />
    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button" />
</LinearLayout>

MainActivity.java的代码如下:

package com.example.smyh001;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.Menu;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
    private EditText etMsg ;
    private Button sendButton;
    private SharedPreferences sp;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        etMsg = (EditText)findViewById(R.id.editText1);
        sendButton = (Button)findViewById(R.id.button1);
        
        // 获取共享属性操作的工具
        sp = getSharedPreferences("data", 0);
    }
    //在onPause()方法中保存数据
    @Override
    protected void onPause() {
        super.onPause();
        String msg = etMsg.getText().toString();
        Editor editor = sp.edit();
        editor.putString("msg", msg);//执行方法:public abstract SharedPreferences.Editor putString (String key, String value) 
        editor.commit();        
    }
    
    //在onResume()方法中还原数据
    @Override
    protected void onResume() {
        super.onResume();
        etMsg.setText(sp.getString("msg", ""));    
        Editor editor = sp.edit();
        editor.clear();
        editor.commit();
    }    
}

运行程序之后,我们在编辑框输入一些文字:
在这里插入图片描述
退出程序,然后导出data.xml文件,打开后显示如下:
在这里插入图片描述
说明输入的文本被保存在了data.xml文件当中。当我们再回到程序,之前输入的文字会被保留在界面上,而data.xml文件中的文本则会被清空。

代码优化:

上方代码中如果我们在第40行代码的后面加下面这一行代码:

etMsg.setSelection((sp.getString("msg", "")).length());

当返回到原程序时,setSelection方法可将输入光标移动到文本的末尾位置以便继续输入。里面的参数sp.getString(“msg”, “”)是之前所输入的字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值