一、前言

前面几节已经讲了,基本数据及可序列化数据在进程间是如何传送的,也就是Messenger把装有Bundle的Message发送到别的进程,这样就完成进程间的通信了。

那么,还有其他的方式实现进程间的通信吗,当然有啦,之前讲过,进程间的通信方式有:Messenger,Bundle,文件共享,Content Provider……,我们这一节讲一下文件共享

二、文件共享

共享文件也是一种不错的进程间通信方式,两个进程通过读/写同一个文件来交换数据,比如 A 进程把数据写入文件,B 进程通过读取这个文件来获取数据。

我们知道,在 Windows 上,一个文件如果被加了排斥锁将会导致其他线程无法对其进行其他访问,包括读和写,而由于 Android 系统基于 Linux,使得其并发读/写文件可以没有限制的进行,甚至两个线程可以同时对一个文件进行写操作都是允许的,尽管这可能会出问题。通过文件交换数据很好使用,除了可以交换一些文本信息外,我们还可以序列化一个对象到文件系统中的同时从另一个进程中恢复这个对象。

三、使用文件共享

我们还是老样子,通过实例来加深理解,我们这个栗子要实现如下功能:在MusicActivity中写入文件Environment.getExternalStorageDirectory() + "/IPC_shareFile/usercache",并把MyUser的内容进去,然后在另一个进程的OtherActivity里把usercache的内容读出来,并且展示到TextView中。

好嘞,马上开始

1、在 MusicActivity 中的写文件:

主要代码如下

/**

* 作者:created by yufenfen on 2019/3/28:18:16

* 邮箱: ybyj1314@126.com

*/

public class MusicActivity extends Activity {

private static final String TAG = "MusicActivity";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.myprocesses_activity_layout);

ipcWriteFile();

}

...

/*******************************************************/

/************************ 共享文件 ********************/

/*******************************************************/

private void ipcWriteFile(){

new Thread(new Runnable() {

@Override

public void run() {

MyUser user = new MyUser("19870316", "雨纷纷", MyUser.SEX_MAN);

File dir = new File(Environment.getExternalStorageDirectory() + "/IPC_shareFile");

if (!dir.exists()) {

dir.mkdirs();

}

File cachedFile = new File(Environment.getExternalStorageDirectory() + "/IPC_shareFile/usercache");

ObjectOutputStream objectOutputStream = null;

try {

if (!cachedFile.exists()) {

cachedFile.createNewFile();

}

objectOutputStream = new ObjectOutputStream(new FileOutputStream(cachedFile));

objectOutputStream.writeObject(user);

} catch (IOException e) {

e.printStackTrace();

} finally {

try{

objectOutputStream.close();

} catch (Exception e){

e.printStackTrace();

}

}

}

}).start();

}

}

2、在 OtherActivity 中读文件

代码如下

/**

* Copyright (C), 2015-2019, 雨纷纷工作室

* FileName: OtherActivity

* Author: yufenfen

* Email: ybyj1314@126.com

* Date: 2019/4/4 6:37 PM

* Description: IPC共享文件方式读取方

*/

package yb.demo.myProcesses;

import android.app.Activity;

import android.os.Bundle;

import android.os.Environment;

import android.os.Handler;

import android.os.Message;

import android.os.Messenger;

import android.os.RemoteException;

import android.util.Log;

import android.view.View;

import android.widget.TextView;

import android.widget.Toast;

import org.w3c.dom.Text;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import yb.demo.yuffdemo.R;

/**

* @ClassName: OtherActivity

* @Description: java类作用描述

* @Author: yufenfen

* @Date: 2019/4/4 6:37 PM

*/

public class OtherActivity extends Activity {

private static final String TAG = "OtherActivity";

private static final int MSG_SHOW = 0;

private TextView mShow;

Messenger mMessenger = new Messenger(new Handler(){

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case MSG_SHOW:

MyUser user = (MyUser) msg.obj;

mShow.setText(user.toString());

break;

default:

break;

}

}

});

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.other_activity_layout);

mShow = (TextView) findViewById(R.id.showtext);

}

public void ipcReadFile(View view) {

// Toast.makeText(this, "没问题", Toast.LENGTH_SHORT).show();

new Thread(new Runnable() {

@Override

public void run() {

MyUser user = null;

File cachedFile = new File(Environment.getExternalStorageDirectory().getPath()+"/IPC_shareFile/usercache");

if (cachedFile.exists()) {

ObjectInputStream objectInputStream = null;

try {

objectInputStream = new ObjectInputStream(new FileInputStream(cachedFile));

user = (MyUser) objectInputStream.readObject();

Message msg = Message.obtain(null, MusicService.MSG_C2S_SING, user);

mMessenger.send(msg);

Log.d(TAG, "recover user:" + user);

} catch (IOException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch(RemoteException e){

e.printStackTrace();

} finally {

try{

objectInputStream.close();

} catch (Exception e){

e.printStackTrace();

}

}

}

}

}).start();

}

}

注意:

在 SecondActivity 中成功从文件中恢复的之前存储的 User 对象是反序列化得到的对象,虽然内容跟之前的 User 对象一样,但跟序列化之前的 User 对象并不是同一个对象实体,本质上还是两个对象。

三、SharedPreferences

当然,SharedPreferences 是个特例,它是 Android 中提供的轻量级存储方案,它通过键值对的方式来存储数据,在底层实现上采用 XML 文件来存储键值对,每个应用的 SharedPreferences 文件都可以在当前包所在的 data 目录下查看到。一般来说,它的目录位于 /data/data/ 包名 /shared_prefs 目录下。

从本质上来说,SharedPreferences 也属于文件的一种,但是由于系统对它的读/写有一定的缓存策略,即在内存中会有一份 SharedPreferences 文件的缓存,因此在多进程模式下,系统对它的读/写就变得不可靠,当面对高并发的读/写访问,SharedPreferences 有很大几率丢失数据,因此,不建议在进程间通信中使用 SharedPreferences 。

四、总结

通过文件共享这种方式来共享数据对文件格式是没有具体要求的,比如可以是文本文件,也可以是 XML 文件,只要读/写双方约定数据格式即可。通过文件共享的方式也是有局限性的,比如并发读/写的问题,因此我们要尽量避免并发读/写情况的发生或者考虑使用线程同步来限制多个线程的读/写操作。

android 程序 共享文件,026 Android多进程-文件共享相关推荐

  1. java写一个android程序_【Android开发笔记】3.编写第一个Android程序

    前言 上一节我们通过一个Demo熟悉了Eclipse的基本使用.如何在模拟器和手机中运行以及如何打包成APK,但没具体编写代码,相信很多同学已经按耐不住了吧,这一节我们会动手编写代码来熟悉Androi ...

  2. android 程序退出广播,android 利用广播实现程序的强制退出

    利用广播机制,实现程序的强制退出. 前面有篇博文,写到了一键退出,这里利用到了那里的ActivityCollector的集合和BaseActivity 功能:打开程序后,先登录,登录成功后,进入主页面 ...

  3. android程序root权限,android – 如何从源代码授予对特定应用程序的root访问权限而不是root权限?...

    我正在从源代码编译Android ROM,我有一个应用程序,我希望它预先安装并让它以root权限运行. 如何在不支持整个ROM的情况下授予对此特定应用程序的root访问权限? 解决方法: 希望你不需要 ...

  4. android程序导入虚拟机,android项目打包成apk应用程序后部署到虚拟机上测试

    一:打包成apk包 这个比较简单,如下 右键点击项目--> export -->  android Project -->  选择密钥等信息  --> 填写密钥信息  --&g ...

  5. android 程序更换字体,Android修改自己程序字体的方法详解

    Android提供三种字体:"Sans","serif"和"monospace". 1.在Android XML文件中设置字体可以采用and ...

  6. android 程序崩溃处理,Android应用崩溃的应急处理

    在我们开发Android应用程序的时候总是难免遇到程序崩溃的问题:(很抱歉,"××"已停止运行.) 每次看到这个问题心都是哇凉哇凉的 一般遇到这样问题,有两种可能: 1.自己的代码 ...

  7. 简单的Android程序多少钱,Android简单程序利息计算器

    我在编程Android的第一课,并为我的第一次尝试,我试图开发一个利息计算器.该应用程序启动,但然后崩溃.代码如下:Android简单程序利息计算器 package com.example.vitor ...

  8. 拼图android程序,可视化开发Android应用程序:拼图开发模式App Inventor

    可视化开发Android应用程序:拼图开发模式App Inventor 作 者:王向辉 等编著 出版时间:2013 内容简介 <可视化开发Android应用程序:拼图开发模式App Invent ...

  9. 如何在android程序使用toast,Android在退出应用程序时以及正在显示toast时...

    诀窍是跟踪显示的最后一个Toast,并取消那个. 我所做的是创建一个Toast包装器,它包含对显示的最后一个Toast的静态引用. 当我需要显示一个新的时,我首先取消静态引用,然后再显示新引用(并将其 ...

最新文章

  1. 引用次数在 19000 次+的,都是什么神仙论文?
  2. JS 设计模式四 -- 模块模式
  3. [C#-SQLite] SQLite一些奇怪的问题
  4. CDN服务技术架构图
  5. stl中unordered_map 和 map的区别 ?
  6. nginx一 之负载均衡介绍
  7. cacti及其相关插件的安装
  8. [vue] vue怎么改变插入模板的分隔符?
  9. 前端学习(1775):前端调试之session storage原理和查看
  10. thymeleaf 模板语言简介
  11. pandas输出到excel_学Python还不会处理Excel数据?带你用pandas玩转各种数据处理
  12. 基于图的图像分割(Graph-Based Image Segmentation)
  13. JQuery官方学习资料(译):类型
  14. [Manifest]关于version
  15. rk3399_android7.1平台调试sensor流程记录
  16. 广播的接收与U盘广播
  17. 【听课笔记】复旦大学遗传学_06基因组
  18. 浅谈Java设计之——Java初始化数组(List/Map)时为何要空数组而不是null
  19. (几何方面:正六边形面积)编写一个程序,提示用户输入正六边形的边长并显示它的面积。
  20. Syntax error parameterized types are only available if sourc

热门文章

  1. centos7(linux)使用心得
  2. Echarts数据可视化toolbox工具框,开发全解+完美注释
  3. AttributeError: module 'labelme.utils' has no attribute 'draw_label'
  4. python-django rest framework框架之序列化
  5. 三十五 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy分布式爬虫要点
  6. 表迁移工具的选型-复制ibd的方法
  7. wireshark帮你解析网络包
  8. 二值图像--形态学处理4 击中,边界提取,孔洞填充,连通分量提取,凸壳,细化,骨架,形态学重建...
  9. [NOIP2011]聪明的质检员
  10. [转载] Python编程之np.argmax()的用法