• Android 之 SharedPreferences应用


      Android 平台给我们提供了一个 SharedPreferences 类,它是一个轻量级的存储类,特别适合用于保存共享数据。使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下。

      获取SharedPreferences的两种方式:调用Context对象的getSharedPreferences()方法;调用Activity对象的getPreferences()方法。

      两种方式的区别:

      调用Context对象的getSharedPreferences()方法获得的SharedPreferences对象可以被同一应用程序下的其他组件共享;

      调用Activity对象的getPreferences()方法获得的SharedPreferences对象只能在该Activity中使用。

      以下以 getSharedPreferences() 方式为示例:
    SharedPreferences sharedPreferences = getSharedPreferences("xml_name", Context.MODE_PRIVATE);
    Editor editor = sharedPreferences.edit();//获取编辑器
    editor.putString("username", "zhangsan");
    editor.commit();//提交修改

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

    <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
    <map>
        <string name="username">zhangsan</string>
    </map>

      getSharedPreferences(name,mode)方法的第一个参数用于指定该文件的名称,名称不用带后缀,后缀会由Android自动加上;第二个参数指定文件的操作模式。

      SharedPreferences 有以下四种操作模式:

      Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容;

      Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件;

      Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件;

      MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;

      MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。

      注意:Context.MODE_WORLD_READABLE 和 Context.MODE_WORLD_WRITEABLE 变量在API 17以后已经不建议使用了。创建全局可读文件是非常危险的事,这样会引起程序的安全漏洞。程序之间的交互应该更多的使用正规的途径,比如:ContentProvider, BroadcastReceiver, and Service。当程序通过备份和恢复后,并不能保证这种获取方式依然对该文件有效。文件创建模式:允许所有的其它程序来读取创建的文件。

      Context.MODE_MULTI_PROCESS

      在API11中添加,SharedPreferences加载标记:被设置后,在硬盘上的文件在被修改是将会被检查如果当前的SharedPreferences实例已经被加载进进程后。这种情况通常发生在,当程序有多个进程在修改同一个SharedPreferences文件的时候。通常来说这种方式在进程之间交互表现是非常好的。

      在API 2.3之前,发布release版本时,这个标记是默认存在的,当发布release版本时。对于使用2.3以上的sdk进行编译的时候,如果想使用那么必须明确的设置。

      getPreferences() - 如果你的Activity仅仅需要一个preferences文件可以使用这个方法。因为你的Activity只要一个preferences文件,所以不需要提供名字。

      使用方法 getXXX() 等方法读取。从SharedPreferences获取数据,示例如下:

    SharedPreferences preferences=getSharedPreferences("xml_name", Context.MODE_PRIVATE);
    String username=preferences.getString("username", "defaultname");

      SharedPreferences 本身是一个接口,用来获取和修改程序的配置数据,位于:android.content.SharedPreferences。程序无法直接创建SharedPreferences实例,只能通过conext的getSharedPreferences(String, int)的获取接口实例。

      注意:当前类不支持跨进程调用,将会在之后的版本中支持。

      它提供了如下方法来访问 perferences 数据:

      boolean contains(String key) :判断当前preferences是否包含key所对应的数据。

      abstract SharedPreferences.Editor edit():为preferences创建一个新的Editor,因此你可以修改preferences的数据并且提交给SharedPreferences对象。

      abstract Map<String, ?> getAll() :获取preferences中所包含的所有数据。

      abstract XXX getXXX(String key, boolean defValue):获取perferences里指定的key对应的value。如果该key不存在,则返回默认defValue .其中XXX是基础数据类型:boolean、float、int、long、String等。

      SharedPreferences接口本身并没有提供写入数据的能力,而是通过SharedPreferences的内部接口,SharedPreferences调用edit()方法即可获取它所对应的Editor对象。

      Editor提供了如下方法来写向perferences入数据:

      abstract SharedPreferences.Editor clear()

      在Editor中标记出:清除所有preferences保存的数据。(注意此方法并没有实质性的清除,只是在Editor上进行了标记,需要commit后才可以进行真正的清除)

      abstract boolean commit():将Editor对preferences的修改提交给SharedPreferences对象,完成对preferences中数据的修改。

      abstract SharedPreferences.Editor putXXX(String key, boolean value)

      向preferences中存入key及其所对应的数据 <key-value>。其中xxx可以是boolean、float、int、long、String等各种基本类型的数值。

      abstract SharedPreferences.Editor remove(String key):

      在Editor中标记出preference中以key以键的键值对应该被移除,而实际的移除动作将会在commit()执行之后才会作用于真正的preferences。

       读取其它应用的SharedPreferences:

      如上所述,如果想读、写其它应用的SharedPreferences,前提是创建该SharedPreferences的应用程序指定相应的访问权限,例如指定了MODE_WORLD_READABLE , 这表明该SharedPreferences可被其它应用程序读取。指定了MODE_WORLD_WRITEABLE,这表明该SharedPreferences可被其它程序写入。

      为了读取其它程序对应的Context,可按照如下步骤进行:

      1、需要创建其它程序对应的Context,例如如下代码:

      Context userCount  = createPackageContext(“com.sharedpreferencesdemo.zhanggeng” , Context.CONTEXT_IGNORE_SECURITY);

      上面的程序中:com.sharedpreferencesdemo.zhanggeng 就是其他程序的包名——实际上Android系统就是用应用程序的包名来作为程序的标识的。

      2、调用其它程序的Conext的getSharedPreferences(String name , int mode) 即可获取相应的SharedPreferences对象。

      3、调用SharedPreferences的edit()方法获取相应的Editor即可。

      private void readOtherAppSp() {  
            Context useCount null;  
      
            try {  
                //获取其它程序对应的Context  
                useCount = createPackageContext("com.sharedpreferencesdemo.zhanggeng" , Context.CONTEXT_IGNORE_SECURITY);  
            } catch (PackageManager.NameNotFoundException e) {  
                e.printStackTrace();  
            }  
            //使用其它程序的Context获取对应的SharedPreferences  
            SharedPreferences prefs = useCount.getSharedPreferences("count" , Context.MODE_WORLD_READABLE);  
            //读取数据  
            int count = prefs.getInt("count" , 0);  
            //后续处理.....  
        }  

      正确的使用 SharedPreferences 总结以下几点注意:

      1、设置相应的权限:如果只供本程序或者有相同user id的程序使用,使用Context.MODE_PRIVATE权限;如果允许其它程序可读设置Context.MODE_WORLD_READABLE权限;如果允许其它程序可写设置Context.MODE_WORLD_WRITEABLE权限。

      2、SharedPreferences保存的数据最好是基础数据类型(当然也可以用来保存用户配置,官方推荐PreferenceActivtiy )。

      3、如果想让程序有多个preferences文件使用getSharedPreferences(xxx , xxx);如果想让程序只有一个preferences使用getPreferences()。

      4、SharedPreferences最好不要用来保存多个程序交互使用的共享数据,建议使用ContentProvider, BroadcastReceiver, and Service 来完成多个程序之间的数据共享。

  • 相关阅读:
    (转)【web前端培训之前后端的配合(中)】继续昨日的故事
    ural(Timus) 1136. Parliament
    scau Josephus Problem
    ACMICPC Live Archive 6204 Poker End Games
    uva 10391 Compound Words
    ACMICPC Live Archive 3222 Joke with Turtles
    uva 10132 File Fragmentation
    uva 270 Lining Up
    【转】各种字符串哈希函数比较
    uva 10905 Children's Game
  • 原文地址:https://www.cnblogs.com/xinaixia/p/6898023.html
Copyright © 2020-2023  润新知