Android之SharedPreferences 的用法

SharedPreferences存储类效率分析

SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceState保存一般使用SharedPreferences完成,它提供了Android平台常规的Long长整型、Int整型、String字符串型的保存,它是什么样的处理方式呢?

  SharedPreferences类似过去Windows系统上的ini配置文件,但是它分为多种权限,可以全局共享访问,android123提示最 终是以xml方式来保存,整体效率来看不是特别的高,对于常规的轻量级而言比SQLite要好不少,如果真的存储量不大可以考虑自己定义文件格式。xml 处理时Dalvik会通过自带底层的本地XML Parser解析,比如XMLpull方式,这样对于内存资源占用比较好。

--------------------------------------------------------------------------------------------------------------------------

SharedPreferences 的用法

2个activity 之间的数据传递除了可以他通过intent来传递,还可以使用SharedPreferences来共享数据的方式

SharedPreferences 用法很简单.

在A中

设置

    
Java代码   收藏代码
  1. Editor sharedata = getSharedPreferences("data"0).edit();  
  2.    sharedata.putString("item","hello getSharedPreferences");  
  3.    sharedata.commit();  
 

B中获取

Java代码   收藏代码
  1. SharedPreferences sharedata = getSharedPreferences("data"0);  
  2. String data = sharedata.getString("item"null);  
  3. Log.v("cola","data="+data);  
 

Android数据存取之Preferences

这种方式应该是用起来最简单的Android读写外部数据的方法了。他的用法基本上和 J2SE(java.util.prefs.Preferences)中的用法一样,以一种简单、 透明的方式来保存一些用户个性化设置的字体、颜色、位置等参数信息。一般的应用程序都会提供“设置”或者“首选项”的这样的界面,那么这些设置最后就可以 通过Preferences来保存,而程序员不需要知道它到底以什么形式保存的,保存在了什么地方。当然,如果你愿意保存其他的东西,也没有什么限制。只 是在性能上不知道会有什么问题。

在Android系统中,这些信息以XML文件的形式保存在 /data/data/PACKAGE_NAME /shared_prefs 目录下。

数据读取

Java代码   收藏代码
  1. String PREFS_NAME = "Note.sample.roiding.com";   
  2.   
  3. SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);   
  4.   
  5. boolean silent = settings.getBoolean("silentMode"false);   
  6.   
  7. String hello = settings.getString("hello""Hi");    
 
String PREFS_NAME = "Note.sample.roiding.com";
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
boolean silent = settings.getBoolean("silentMode", false);
String hello = settings.getString("hello", "Hi");
这段代码中:
  • SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    通过名称,得到一个SharedPreferences,顾名思义,这个Preferences是共享的,共享的范围据现在同一个Package中,这里 面说所的Package和Java里面的那个Package不同,貌似这里面的Package是指在AndroidManifest.xml文件中:
    Xml代码   收藏代码
    1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"   
    2. package="com.roiding.sample.note"   
    3. android:versionCode="1"   
    4. android:versionName="1.0.0">    
     
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.roiding.sample.note"
    android:versionCode="1"
    android:versionName="1.0.0">
    

    这里面的package。根据我目前的实验结果看,是这样的,欢迎指正。后面的那个int是用来声明读写模式,先不管那么多了,暂时就知道设为0(android.content.Context.MODE_PRIVATE)就可以了。

  • boolean silent = settings.getBoolean(”silentMode”, false);
    获得一个boolean值,这里就会看到用Preferences的好处了:可以提供一个缺省值。也就是说如果Preference中不存在这个值的话,那么就用后面的值作为返回指,这样就省去了我们的if什么什么为空的判断。

数据写入

Java代码   收藏代码
  1. String PREFS_NAME = "Note.sample.roiding.com";   
  2. SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);   
  3. SharedPreferences.Editor editor = settings.edit();   
  4. editor.putBoolean("silentMode"true);   
  5. editor.putString("hello""Hello~");   
  6. editor.commit();   
 
String PREFS_NAME = "Note.sample.roiding.com";
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", true);
editor.putString("hello", "Hello~");
editor.commit();

有了上面数据读取的代码,这里面的就容易理解了,只是别忘了最后的commit();


注意:

访问接口和优先修改数据,并由getSharedPreferences(String,int)返回数据,为了统一设置参数,有一个单例类供所有的客户 端共享.修改参数必须通过一个SharedPreferences.Editor对象,在存储他们时,以确保参数值有统一的状态和控制
目前此类不支持多线程,


SharedPreference 跨包读取数据

我们可以在一个应用程序中创建并编辑一个Preferences,然后在另外一个应用程序中读取它。当然有个前提是Preferences的权限至少是Context.MODE_WORLD_READABLE

比如在包名为com.teleca应用程序A中有一个名叫com.teleca_preferPreferences

finalstatic String preferName="com.teleca_prefer";

finalstatic String KEY_TIP="tip";

.......................................................

       prefsWorldRead = getSharedPreferences(preferName,

               Context.MODE_WORLD_READABLE);

       Editor prefsWorldReadEditor = prefsWorldRead.edit();

       prefsWorldReadEditor.putString(KEY_TIP, "Are youfine?");

       prefsWorldReadEditor.commit();

我们可以在包名为com.teleca.robin应用程序B中这样读取它:

privateSharedPreferences prefsWorldRead;

finalstatic String preferName="com.teleca_prefer";

finalstatic String KEY_TIP="tip";

....................................................................

         if(prefsWorldRead ==null)

         {

         Context otherContext=null;

         try {

otherContext=createPackageContext("com.teleca", Context.CONTEXT_IGNORE_SECURITY );

}catch (NameNotFoundException e) {

//TODO Auto-generated catch block

e.printStackTrace();

}

            prefsWorldRead =otherContext.getSharedPreferences(preferName,

                    Context.MODE_WORLD_READABLE);

         }

            Stringtip=prefsWorldRead.getString(KEY_TIP, "null2");

createPackageContextContext的方法,"com.teleca"A应用程序的包名,"com.teleca_prefer"为你要读取的A应用程序的Preferences名字。

public abstract Context createPackageContext (String packageName, int flags)

Since: API Level 1

Return a new Context objectfor the given application name. This Context is the same as what the namedapplication gets when it is launched, containing the same resources and classloader. Each call to this method returns a new instance of a Context object;Context objects are not shared, however they share common state (Resources,ClassLoader, etc) so the Context instance itself is fairly lightweight.

Throws PackageManager.NameNotFoundException if there is noapplication with the given package name.

Throws SecurityException if the Contextrequested can not be loaded into the caller's process for security reasons(see CONTEXT_INCLUDE_CODE for more information}.

Parameters

packageName

Name of the application's package.

flags

Option flags, one of CONTEXT_INCLUDE_CODE or CONTEXT_IGNORE_SECURITY.

Returns

·        AContext for the application.

Throws

 

 

java.lang.SecurityException

 

if there is no application with the given pack

 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值