HardBirch

SharedPreferences具体使用方法及createPackageContext方法(获取其他应用的共享文件)

时间:11-09-28 栏目:安卓源码解析与小应用 作者:张飞不张,文采横飞 评论:0 点击: 4,289 次

             很多时候我们开发的软件需要向用户提供软件参数设置功能,Android应用,我们最适合采用什么方式保存软件配置参数呢?在Android平台上,提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences保存数据,其背后是用xml文件存放数据,使用简易的键值对存储。文件存放在/data/data/<packagename>/shared_prefs目录下

下面我们给点代码,说下简单的使用:

//文件命名为demo,私有模式
SharedPreferences sharedPreferences = getSharedPreferences("demo", Context.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();//获取编辑器
editor.putString("name", "hello");
editor.putInt("age", 6);
editor.commit();//提交修改

这样,我们就把信息存储到了/data/data/<packagename>/shared_prefs/demo.xml文件里面,现在你打开这个文件,就可以看到内容已经被存储。如下:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="name">hello</string>
<int name="age" value="6" />
</map>

getSharedPreferences(name,mode)方法的第一个参数用于指定该文件的名称,最好定义为一个静态字符串,另外,名称如上面所示,不用带后缀名,后缀名会由系统自动加上。方法的第二个参数指定文件的操作模式,共有四种操作模式,这四种模式想必大家都有一定的了解。这里简单说一下:

MODE_APPEND File creation mode: for use with openFileOutput(String, int), if the file already exists then write data to the end of the existing file instead of erasing it.    如果文件已经存在,在文件内容后面添加

MODE_PRIVATE File creation mode: the default mode, where the created file can only be accessed by the calling application (or all applications sharing the same user ID).

设置为默认模式,在创建的文件只能该应用能够使用(或所有的应用程序共享同一个用户标识号)

MODE_WORLD_READABLE 	File creation mode: allow all other applications to have read access to the created file.

允许其他应用读该应用创建的文件。

MODE_WORLD_WRITEABLE 	File creation mode: allow all other applications to have write access to the created file.

允许其他应用写该应用创建的文件。

所以,如果你希望SharedPreferences背后使用的xml文件能被其他应用读和写,可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。
另外Activity还提供了另一个getPreferences(mode)方法操作SharedPreferences,这个方法默认使用当前类不带包名的类名作为文件的名称。

如果我们的模式设置为Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限,我们其他的应用是可以访问的,下面是其他应用访问的代码(假如上面代码的包名为cn.test.demo):

 

 

 

 

 

try{ Context context = createPackageContext("cn.test.demo", Context.CONTEXT_IGNORE_SECURITY);

} catch (NameNotFoundException e)
{        e.printStackTrace();}

SharedPreferences sharedPreferences = context.getSharedPreferences("demo", Context.MODE_WORLD_READABLE); //name 是里面存储的属性名,即:键,后面的参数是如果从sharePreferece里面取不到值,或者不存在该值的时候,获取的默认值。在这里设置为空。
String name = sharedPreferences.getString("name", ""); int age = sharedPreferences.getInt("age", 0);



CreatePackageContext这个方法有两个参数:
1.packageName 包名,要得到Context的包名
2.flags 标志位,有CONTEXT_INCLUDE_CODE和CONTEXT_IGNORE_SECURITY两个选项。CONTEXT_INCLUDE_CODE的意思是包括代码,也就是说可以执行这个包里面的代码。CONTEXT_IGNORE_SECURITY的意思是忽略安全警告,如果不加这个标志的话,有些功能是用不了的,会出现安全警告。

CreatePackageContext方法在找不到包名的时候会报NameNotFoundException异常,所以我们要捕获它。

 

SharedPreferences具体使用方法及createPackageContext方法(获取其他应用的共享文件):目前有

  1. 这个在4.0上面好像是无效的,访问其他包的数据,都是空

    2012-06-02 11:29 [回复]
  2. [reply]zhou123shao[/reply]
    那可能是4.0上面安全权限的问题吧,下午吃完饭,再给你回答吧,我试一下。。

    2012-06-02 12:05 [回复]
  3. [reply]zhou123shao[/reply]
    恩,在4.0.3上面试了下,果然不能取得数据。。。

    2012-06-02 15:18 [回复]
  4. 地板
    zhou123shao:

    我昨天研究了一下,用adb 看了一下文件的权限rw_rw_r_ _,如果我chmod 777 文件 。你要不试一下,安装一个触宝输入法,它默认手写模式是全屏的,我想默认为非全屏,你看看有什么办法。

    2012-06-03 11:10 [回复]
  5. [reply]zhou123shao[/reply]
    你要修改别人的输入法界面???介个比较难吧。。。

    2012-06-03 18:51 [回复]
  6. 沙发
    zhou123shao:

    这个可以修改的,以前2.3的系统,听说能改。我明天再去研究一下,如果可以的话,我再分享出来。

    2012-06-03 22:40 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐