应用间共享数据方法(一)---sharepreferce

SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。

SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下:

一、首先分析几个方法:

1、getSharedPreferences(name,mode)

方法的第一个参数用于指定该文件的名称,名称不用带后缀,后缀会由Android自动加上;

方法的第二个参数指定文件的操作模式,共有六种操作模式。

六种操作模式分别为:

1). MODE_APPEND: 追加方式存储

2). MODE_PRIVATE: 私有方式存储,其他应用无法访问

3). MODE_ENABLE_WRITE_AHEAD_LOGGING   数据库打开默认启用了写前日志记录

4). MODE_MULTI_PROCESS:多个进程间共享,但在2.3之后不再使用了

5). MODE_WORLD_READABLE: 表示当前文件可以被其他应用读取(不推荐使用)

6). MODE_WORLD_WRITEABLE: 表示当前文件可以被其他应用写入(不推荐使用)

SharedPreferences share = getSharedPreferences("lsf", MODE_PRIVATE);   

2、edit()方法获取editor对象

editor存储对象采用key-value键值对进行存放

通过commit()方法提交数据

 SharedPreferences share = getSharedPreferences("jackie", MODE_WORLD_READABLE);   //其他应用可以获得
 SharedPreferences.Editor edit = share.edit();
 edit.putString(“password”, ""+987654321);
 edit.putBoolean("pass_state",  true);
 edit.commit(); 

与之对应其他应用获取数据的方法:

otherAppsContext = createPackageContext("com.jackie.contextprovider", Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("jackie", Context.MODE_WORLD_READABLE);
String password= sharedPreferences.getString("password", "");
boolean pass_state= sharedPreferences.getBoolean("pass_state", false);   //第二个参数为缺省值,如果preference中不存在该key,将返回缺省值
mTextView.setText("password:"+password+"||||||||"+"pass_state:"+pass_state);

如果你想要删除通过SharedPreferences产生的文件,可以通过以下方法:

File file= new File("/data/data/"+getPackageName().toString()+"/shared_prefs","Activity.xml");
if(file.exists()){
    file.delete();
    Toast.makeText(TestActivity.this, "删除成功", Toast.LENGTH_LONG).show();
}

二、应用实例:

一个应用中设置一个按钮,可按下触发设置为共享或不共享其SharedPreferences产生的文件,

另一个应用通过按钮按下触发获得之前应用中的数据。

1、共享数据文件的应用:

package com.jackie.contextprovider;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

    public static final String NEW_LIFEFROM_DETECTED = "com.jackie.contextprovider";
    public static final String TAG = "testprovider";

    private Button snedButton;
    private boolean isShare = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        snedButton = (Button) findViewById(R.id.send_message);
    }

    public void sendMessage(View v){
        if(isShare){
            SharedPreferences share = getSharedPreferences("jackie", MODE_WORLD_READABLE);
            SharedPreferences.Editor edit = share.edit();
            edit.putString(“password”, ""+987654321);
            edit.putBoolean("pass_state",  true);
            edit.commit();
            isShare = false;
            snedButton.setText(R.string.no_send);
        }else{
            SharedPreferences share = getSharedPreferences("jackie", MODE_PRIVATE);
            SharedPreferences.Editor edit = share.edit();
            edit.clear();
            edit.commit();
            isShare = true;
            snedButton.setText(R.string.send);
        }
    }
}

布局配置文件

<RelativeLayout 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"
    tools:context="${relativePackage}.${activityClass}" >

    <Button
        android:id="@+id/send_message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="sendMessage"
        android:text="@string/send"
        />

</RelativeLayout>

2、读取共享数据的应用

package com.jackie.contextuser;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

    Button mButton;
    TextView mTextView;
    Context otherAppsContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = (Button) findViewById(R.id.get_message);
        mTextView = (TextView) findViewById(R.id.write_message);
        otherAppsContext = null;
    }

    @Override
    protected void onResume(){
        super.onResume();
        otherAppsContext = null;
    }

    @Override
    protected void onStop(){
        super.onStop();
        otherAppsContext = null;
    }

    public void getMessage(View v) throws NameNotFoundException{
        otherAppsContext = createPackageContext("com.tcl.contextprovider", Context.CONTEXT_IGNORE_SECURITY);
        SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("jackie", Context.MODE_WORLD_READABLE);
        String password = sharedPreferences.getString("password", "");
        boolean pass_state= sharedPreferences.getBoolean("pass_state", false);
        mTextView.setText("password :"+password +"||||||||"+"pass_state:"+pass_state);
    }
}

布局配置文件:

<RelativeLayout 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"
    tools:context="${relativePackage}.${activityClass}" >

    <Button
    android:id="@+id/get_message"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="getMessage"
    android:text="@string/get"/>

    <TextView
    android:id="@+id/write_message"
    android:layout_below="@id/get_message"
       android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

</RelativeLayout>

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

刚开始学习,写博客只是希望能记录自己的成长轨迹,欢迎大家指点。

时间: 2024-10-11 05:57:59

应用间共享数据方法(一)---sharepreferce的相关文章

利用内存映射文件在两个进程间共享数据 转

private hMapFile: THandle; MapFilePointer: Pointer; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin hMapFile := CreateFileMapping ( $FFFFFFFF, // 特殊内存映射句柄 nil, page_

windows核心编程之进程间共享数据

有时候我们会遇到window进程间共享数据的需求,例如说我想知道系统当前有多少某个进程的实例. 我们能够在程序中定义一个全局变量.初始化为0.每当程序启动后就加1.当然我们我们能够借助第三方介质来储存这个变量,然后解析. 这样做必须做到先写入后解析.不能实时更新数据.假设不考虑其它储存介质.仅仅是进程中的通信,应该怎么做呢?windows提供了一些可行的方法,以下介绍经常使用的两种. 一.共享数据段 #include "stdafx.h" #include <Windows.h&

【转】VC 利用DLL共享区间在进程间共享数据及进程间广播消息

1.http://blog.csdn.net/morewindows/article/details/6702342 在进程间共享数据有很多种方法,剪贴板,映射文件等都可以实现,这里介绍用DLL的共享区间在进程间共享数据,及共享数据有变化时及时的反馈给各相关进程. 一.在DLL中设置共享区间 在DLL中是用数据段来实现共享区间的,有了这个共享区间,各进程可以方便的共享数据. 1.先用#pragma data_seg(Name)设置名为Name的数据段. 2.再用#pragma comment(l

线程间共享数据的一个例子

[申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出. 联系邮箱:[email protected]] 题目:输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 题目分析: 一.如果数组中全部为负数,则返回最大负数值即可 二.当既有正数也有负数的时候: (1)从左往右叠加,如果当前叠加值小于或者等于0,则放弃,叠加总和清0(加一个负数或者0是毫无意义的),从此位置继续重新叠加 (

详解 Qt 线程间共享数据(用信号槽方式)

使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据从一个线程传递到另外一个线程. 第一种办法在各个编程语言都使用普遍,而第二种方式倒是QT的特有方式,下面主要学习一

详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)

使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据从一个线程传递到另外一个线程. 第一种办法在各个编程语言都使用普遍,而第二种方式倒是QT的特有方式,下面主要学习一

python 进程间共享数据 (二)

Python中进程间共享数据,除了基本的queue,pipe和value+array外,还提供了更高层次的封装.使用multiprocessing.Manager可以简单地使用这些高级接口. Manager()返回的manager对象控制了一个server进程,此进程包含的python对象可以被其他的进程通过proxies来访问.从而达到多进程间数据通信且安全. Manager支持的类型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaph

iOS应用程序间共享数据(转)

我们知道iOS由于沙盒的存在,应用程序不能越过自己的区域去访问别的存储空间的内容,不过可能有许多场景我们需要在应用程序之间共享数据,比如多个应用共用用户名密码进行登录等.虽然我们不能直接通过文件系统来分享数据,不过还是有些方法可以实现,为了方便说明,这里同时创建了两个工程Example1和Example2,实现这两个app之间的信息共享,Example1负责写数据,Example2负责读数据,具体的demo代码可以到这里获取 UIPasteboard 剪贴板是应用程序之间传递数据的简单方式,建议

在 App 扩展和主 App 间共享数据

tags: iOS 8,Swift,App Groups 随着 iOS 8 的发布,苹果为广大开发者很多新的 API,其中最突出显著的就非 App Extension 莫属了.这为开发者们又带来了很多机会. 而我们在开发 App Extension 的时候,基本大多数人都会遇到这样一个问题.就是由于 App Store 的规则是 App Extension 不能独立的发布,而是要跟随一个宿主应用一起发布. 比如奇妙清单: {% img figures /images/extension_1.jp