Android Preference的使用总结(很全很详细)以及SharedPreferences多个程序之间共享数据

简介:

下面我我对Preference用法的总结,很全很详细。包括三个部分,分别为:

一、Android 中SharedPreferences使用。 这个是基本使用。

二、Preference的使用。这个是CheckBoxPreference,RingtonePreference等的使用,通常在设置时候的使用

三、SharedPreferences多个程序之间共享数据。顾名思义,不解释。 


一、Android 中SharedPreferences使用

这个是Preference最基本的用法了。

一、SharedPreferences使用1

protected  void  onCreate(Bundle savedInstanceState) {
    super .onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
   
    SharedPreferences mPerferences = PreferenceManager.getDefaultSharedPreferences( this );
   
    int  counter = mPerferences.getInt( "counter" , 1 );
   
    TextView mTextView = (TextView)findViewById(R.id.showMssage);
    mTextView.setText( "Counter is :"  + counter);
    Editor mEditor = mPerferences.edit();
   
    mEditor.putInt( "counter" , ++counter);
    mEditor.commit();
}

mEditor.putInt("counter", ++counter); 为写入counter的值为++counter,最后提交。

int counter = mPerferences.getInt("counter", 1);  获取写入couter的值,默认为1.

 

二. 下面会创建SPF.xml文件 并将数据写入xml文件中,最后读取xml中的数据。

protected  void  onCreate(Bundle savedInstanceState) {
    super .onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
   
    SharedPreferences sharedPreferences = this .getSharedPreferences( "SPF" ,MODE_PRIVATE);
   
    Editor editor = sharedPreferences.edit();
    editor.putString( "name" , "张三" );
    editor.putInt( "age" , 29 );
    editor.putBoolean( "boy" , true );
    editor.commit();
   
    Log.i( "name" , sharedPreferences.getString( "name" , "no name" ));
    Log.i( "age" , Integer.toString(sharedPreferences.getInt( "age" , 0 )));
    Log.i( "boy" , Boolean.toString(sharedPreferences.getBoolean( "boy" , false )));
}

参考:

SharedPreferences用法

 


二、Preference的使用

原文地址

这个是CheckBoxPreference,RingtonePreference等的使用,通常在设置时候的使用

Preference直译为偏好,博友建议翻译为首选项。一些配置数据,一些我们上次点击选择的内容,我们希望在下次应用调起的时候依然有效,无须用户再一次进行配置或选择。Android提供preference这个键值对的方式来处理这种情况,自动保存这些数据,并立时生效,同时Android提供一种类似的layout的方式来进行Prefernce的布局。

一个简单的Preferenece例子

步骤1:编写preference XML,在res/xml/下加入我们的preference XML文件,例如名字叫c21preference.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- preference的组织方式有PreferenceScreen和PreferenceCategory,PreferenceCategory是带层次组织关系,在后面的例子体验,而PreferenceScreen就是最平白和基础的方式 -->
<PreferenceScreen 
xmlns:android="http://schemas.android.com/apk/res/android">
   
<!-- 有四个基本组建,这个例子学习两个。里面的内容对照图,很容易理解,RingtonePreference是选择铃音,这里给出两个选择,系统默认的铃音和无声 -->
    <CheckBoxPreference android:key="
checkbox"
        android:title="
CheckBox Preference"
        android:summary="
Check it on , check it off"/>
    <RingtonePreference android:key="
ringtone"
        android:title="
Ringtone Preference"
        android:showDefault="
true"
        android:showSilent="
true"
        android:summary="
Pick a tone, any tone"/>
</PreferenceScreen>

步骤2:在java源代码中调用该xml,生成相应的preference界面

public class Chapter21Test1 extendsPreferenceActivity{
   
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.c21preference);
    }
}

和用layout方式一样,代码很简单。和以往界面最大的区别是,我们对checkbox进行选择或者对ringtone进行选择后,这个选择结果是被保留的,当我们退出actitvity后再次进入,上次的选项依然保留,我们重新向模拟器load应用,发现之前的选项仍然存在。我们可以利用preference,而无须人工对数据进行保存和读取,很是方便。

步骤3:获取preference的数据

处了在preference的界面中可以保留数据,我们也希望能够读出数据,以便这些数据可以用在其他的activity中。如果另一个activity和这些数据关联,而且希望能够实时进行同步,在onResume()中对preference保留的数据进行读取,而后进行相关的更新。

首先要获取preferences,然后通过键值对的获取方式根据key获取数值,在xml中checkbox的key为“checkbox”,值的类型为布尔值,而rintong的值为String,例如:

    protected void onResume() { //在另一个Activity中
        
super.onResume();
        SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ;
        System.out.println(new Boolean(prefs.getBoolean("
checkbox",false)).toString());//false表示没有查到checkbox这个key的返回值
        System.out.println(prefs.getString("
ringtone","<unset>"));//<unset>表示没有查到ringtong这个key的返回值
    }

获取preferences可以通过三种方式:
一、getPreferences():可以获取同一activity中的preference;
二、getSharedPreferences():可以获取映用级别的preferences(),在这个例子中由于我们封装在同一app中,也可以使用SharePreferences prefs = getSharedPreferences( "com.wei.android.learning_preferences" ,0);其中第一个参数name的格式是<package_name>_preferences;
三、getDefaultSharedPreferences():就是我们例子的方式,通过Android的偏好管理器来获取其所管理的preferences。

Preferenece数据的操作

在上面的例子中,preference的数值会被保留,而且可以在其他的activity中读取。如果需要清除数据,可以通过remove()清除某个名字的prefernece,clear()清除所有的preferences。我们可以通过edit()获取preferences的editor,进而进行编辑,修改后,通过commit()将修改值保存。

Preferenece XML

Preference的XML可以通过PreferenceCategory来进行组织。PreferenceCategory可以将几个组建组合在一起,并加上标题。我们依然用前面的xml例子,通过PreferenceCategory来进行组织,如下:和之前的例子比较,将chekcbox和rintong组织成为一个category,并加上了"simple Preferences"的标题。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen 
xmlns:android="http://schemas.android.com/apk/res/android">
       <PreferenceCategory android:title="Simple Preferences">
            <CheckBoxPreference android:key="checkbox" ..../>
            <RingtonePreference android:key="ringtone" ... />

       </PreferenceCategory
</PreferenceScreen>

PreferenceCategory也可以嵌套PreferenceScreen,PreferenceScreen中的内容,将通过另一屏来显示,我们在上面例子后面添加一个嵌套了PreferenceScreen的PreferenceCategory。整个PreferenceScreen作为一个组件出现,点击后新的一屏,由入PreferenceScreen定义。通过这个关系,我们可以组织自己的preference架构。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen 
xmlns:android="http://schemas.android.com/apk/res/android">
       <PreferenceCategory android:title="Simple Preferences">
            <CheckBoxPreference android:key="checkbox" ..../>
            <RingtonePreference android:key="ringtone" ... />
       </PreferenceCategory>

       <PreferenceCategory android:title="Detail Screens">
           <PreferenceScreen android:title="Detail"
               android:summary="Addtional preference help in another page">
               <CheckBoxPreference 
android:key="checkbox2"
                   android:title="Another Checkbox"
                   android:summary="On or Off, It's a problem...."
/>
           </PreferenceScreen>
       </PreferenceCategory>
</PreferenceScreen>

在前面的例子中我们使用了CheckBox和Ringtong,在下面的例子,我们实验另外的两个组建EditText和List,这两种都是已弹框的方式。在上面的例子我们继续增加内容

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

       <PreferenceCategory android:title="Other Preferences">
           <EditTextPreference android:key="text"
               android:title="
Text Entry Dialog"
               android:summary="
Click to pop up a field for entry"
               android:dialogTitle="
Enter something useful"/>
           <ListPreference android:key="list"
               android:title="
Selection Dialog"
               android:summary="
Click to pop yo a list for select"
               android:entries="@array/cities"
               android:entryValues="@array/airport_codes"

               android:dialogTitle="
Choose a City"/>
       </PreferenceCategory>
</PreferenceScreen>

在list中由两个引用@array/cities和@array/airport_codes,我们在资源文件中定义此两array。内容如下:
<resource>
     <string-array>
        <item>Pittsburgh</item>
        <item>Allentown/Bethlehem</item>
        <item>Erie</item>
        ... ... 
    </string-array>
    <string-array name="airport_codes">
        <item>PHL</item>
        <item>PIT</item>
        <item>ABE</item>
        ... ... 
    </string-array>
</resources>

运行结果如右图所示。对于EditText,键值对保存的值是String,即用户在输入框中输入的内容。List的情况稍微复杂一些,在设置ListPreference的属性有一个entires,这是在List显示给用户看的内容,如果我们去获取preference的值,在这个例子为prefs.getString("list", "<unset>");,则返回在entryValues对应的数值,例如我们选择了第一个item:Pittsburgh,则获取的值为PHL。entries和entryValues是一一对应的。

 

 

 


 

三、SharedPreferences多个程序之间共享数据

原文地址

这个可以在多个程序直接共享数据,很不错的功能。

 Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/包名/shared_prefs目录下:

 

1
2
3
4
5
SharedPreferences sharedPreferences = getSharedPreferences("config", Context.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();//获取编辑器
editor.putString("name", "NAME");
editor.putInt("age", 4);
editor.commit();//提交修改

 

因为SharedPreferences背后是使用xml文件保存数据,getSharedPreferences(name,mode)方法的第一个参数用于指定该文件的名称,名称不用带后缀,后缀会由Android自动加上。方法的第二个参数指定文件的操作模式,共有四种操作模式。如果希望SharedPreferences背后使用的xml文件能被其他应用读和写,可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。但是实际上即使用了MODE_WORLD_WRITEABLE权限,别的应用程序也是不能修改本程序的数据的 如果其他程序要修改本程序数据可以在配置文件中使用android:sharedUserId,加上shareduserid之后,写入其他程序的文件时,和权限没有关系 另外Activity还提供了另一个getPreferences(mode)方法操作SharedPreferences,这个方法默认使用当前类不带包名的类名作为文件的名称。 访问SharedPreferences中的数据代码如下:

 

1
2
3
4
SharedPreferences sharedPreferences = getSharedPreferences("config", Context.MODE_PRIVATE);
//getString()第二个参数为缺省值,如果preference中不存在该key,将返回缺省值
String name = sharedPreferences.getString("name", "");
int age = sharedPreferences.getInt("age", 1);

 

如果访问其他应用中的Preference,前提条件是:该preference创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE权限。如:有个为cn.itcast.action的应用使用下面语句创建了preference。 getSharedPreferences("config", Context.MODE_WORLD_READABLE); 其他应用要访问上面应用的preference,首先需要创建上面应用的Context,然后通过Context 访问preference,访问preference时会在应用所在包下的shared_prefs目录找到preference :

 

1
2
3
4
Context otherAppsContext = createPackageContext("cn.zql.action", Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("config", Context.MODE_WORLD_READABLE);
String name = sharedPreferences.getString("name", "");
int age = sharedPreferences.getInt("age", 0);

 

但是有一点值得注意,当使用这几种权限时,其他程序访问数据时启动本程序修改文件数据,其他程序得到的还是缓存数据得不到最新的数据, 其他程序要想得到最新数据,本程序在写文件时必须使用MODE_MULTI_PROCESS权限(参数是4)。 如果不通过创建Context访问其他应用的preference,可以以读取xml文件方式直接访问其他应用preference对应的xml文件,如: File xmlFile = new File(“/data/data//shared_prefs/config.xml”);//应替换成应用的包名.

 

转自:http://blog.sina.com.cn/s/blog_9e309d490101aoq0.html

最后是对SharedPreferences值改变是的一个监听,我表示还没用到,希望以后用得到。

补充: SharedPreferences也可以设置监 听器来监听changed, added, or removed,这三种变化。 public abstract void onSharedPreferenceChanged (SharedPreferences sharedPreferences, String key)

 

Since: API Level 1 Called when a shared preference is changed, added, or removed. This may be called even if a preference is set to its existing value.

 

This callback will be run on your main thread.

 

Parameters sharedPreferences   The SharedPreferences that received the change. key The key of the preference that was changed, added, or removed.



本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/archive/2013/04/01/2993759.html,如需转载请自行联系原作者

目录
相关文章
|
6月前
|
设计模式 算法 前端开发
Android面经分享,失业两个月,五一节前拿到Offer,设计思想与代码质量优化+程序性能优化+开发效率优化
Android面经分享,失业两个月,五一节前拿到Offer,设计思想与代码质量优化+程序性能优化+开发效率优化
|
3月前
|
开发工具 Android开发 开发者
Android平台如何不推RTMP|不发布RTSP流|不实时录像|不回传GB28181数据时实时快照?
本文介绍了一种在Android平台上实现实时截图快照的方法,尤其适用于无需依赖系统接口的情况,如在RTMP推送、RTSP服务或GB28181设备接入等场景下进行截图。通过底层模块(libSmartPublisher.so)实现了截图功能,封装了`SnapShotImpl.java`类来管理截图流程。此外,提供了关键代码片段展示初始化SDK实例、执行截图、以及在Activity销毁时释放资源的过程。此方案还考虑到了快照数据的灵活处理需求,符合GB/T28181-2022的技术规范。对于寻求更灵活快照机制的开发者来说,这是一个值得参考的设计思路。
|
5月前
|
XML 存储 JSON
51. 【Android教程】JSON 数据解析
51. 【Android教程】JSON 数据解析
152 2
|
5月前
|
存储 API 文件存储
47. 【Android教程】SharedPreferences 存储
47. 【Android教程】SharedPreferences 存储
63 2
|
5月前
|
安全 Java Android开发
05. 【Android教程】Android 程序签名打包
05. 【Android教程】Android 程序签名打包
61 1
|
6月前
|
数据库 Android开发
Android 通过升级SettingsProvider数据强制覆盖用户的设置项
Android 通过升级SettingsProvider数据强制覆盖用户的设置项 【5月更文挑战第7天】
158 5
|
1月前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
62 0
|
3月前
|
存储 安全 API
Android经典实战之存储方案对比:SharedPreferences vs MMKV vs DataStore
本文介绍了 Android 开发中常用的键值对存储方案,包括 SharedPreferences、MMKV 和 DataStore,并对比了它们在性能、并发处理、易用性和稳定性上的特点。通过实际代码示例,帮助开发者根据项目需求选择最适合的存储方案,提升应用性能和用户体验。
94 1
|
3月前
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
89 1
|
3月前
|
缓存 API Android开发
Android经典实战之Kotlin Flow中的3个数据相关的操作符:debounce、buffer和conflate
本文介绍了Kotlin中`Flow`的`debounce`、`buffer`及`conflate`三个操作符。`debounce`过滤快速连续数据,仅保留指定时间内的最后一个;`buffer`引入缓存减轻背压;`conflate`仅保留最新数据。通过示例展示了如何在搜索输入和数据流处理中应用这些操作符以提高程序效率和用户体验。
51 6