我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android使用文件进行IPC

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android使用文件进行IPC

一、文件进行IPC介绍

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

二、使用方法

1.数据类实现Parcelable或Serializable接口


public class User implements Parcelable, Serializable {
public User() {
  }
  public User(int userId, String userName, boolean isMale) {
    ...
  }
  @Override
  public int describeContents() {
    return 0;
  }
  @Override
  public void writeToParcel(Parcel dest, int flags) {
    ...
  }
  public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {
    @Override
    public User createFromParcel(Parcel source) {
      return ...;
    }
    @Override
    public User[] newArray(int size) {
      return ...;
    }
  };
  private User(Parcel in) {
    ...
  }
  @Override
  public String toString() {
    return ...;
  }
}

2.序列化一个对象到sd卡上的一个文件里


private void persistToFile() {
    new Thread(new Runnable() {
      @Override
      public void run() {
        User user = new User(1, "hello world", false);
        File dir = new File(MyConstants.CHAPTER_2_PATH);
        if (!dir.exists()) {
          dir.mkdirs();
        }
        File cachedFile = new File(MyConstants.CACHE_FILE_PATH);
        ObjectOutputStream objectOutputStream = null;
        try {
          objectOutputStream = new ObjectOutputStream(new FileOutputStream(cachedFile));
          objectOutputStream.writeObject(user);
          Log.d(TAG, "persist user:" + user);
          mTextView.setText("persist user:" + user);
        } catch (IOException e) {
          e.printStackTrace();
        } finally {
          MyUtils.close(objectOutputStream);
        }
      }
    }).start();
  }

3.在另外的进程中反序列化


private void recoverFromFile(){
    new Thread(new Runnable() {
      @Override
      public void run() {
        User user = null;
        File cachedFile = new File(MyConstants.CACHE_FILE_PATH);
        if(cachedFile.exists()){
          ObjectInputStream objectInputStream = null;
          try{
            objectInputStream = new ObjectInputStream(new FileInputStream(cachedFile));
            user = (User)objectInputStream.readObject();
            Log.d(TAG,"recover user:"+user);
            mTextView.setText("recover user:"+user);
          }catch (IOException e) {
            e.printStackTrace();
          }catch (ClassNotFoundException e){
            e.printStackTrace();
          }finally {
            MyUtils.close(objectInputStream);
          }
        }
      }
    }).start();
  }

4.在AndroidManifest.xml中开启多进程


   <activity
      ...
      android:process=":remote" />

三、小案例

1.修改activity_main.xml文件


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  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"
  android:fitsSystemWindows="true"
  tools:context="com.zhangmiao.ipcdemo.MainActivity"
  android:orientation="vertical"
  >
  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:text="File">
  </TextView>
  <Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="open activity B"
    />
  <TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="A">
  </TextView>
</LinearLayout>

2.添加activity_second.xml文件


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="at activity B"
    android:layout_gravity="center_horizontal"
    />
  <TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Activity B"
    />
</LinearLayout>

3.添加MyUtils类与MyConstants类(辅助类)


package com.zhangmiao.ipcdemo;
import android.app.ActivityManager;
import android.content.Context;
import java.io.Closeable;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.RecursiveTask;

public class MyUtils {
  public static void close(Closeable closeable) {
    try {
      if (closeable != null) {
        closeable.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

package com.zhangmiao.ipcdemo;
import android.os.Environment;

public class MyConstants {
  public static final String CHAPTER_2_PATH = Environment.getExternalStorageDirectory().getPath() + "/zhangmiao/charpter_2/";
  public static final String CACHE_FILE_PATH = CHAPTER_2_PATH + "usercache";
  public static final int MSG_FROM_CLIENT = 0;
  public static final int MSG_FROM_SERVICE = 1;
}

4.添加User类


package com.zhangmiao.ipcdemo;
import android.os.Parcel;
import android.os.Parcelable;
import java.io.Serializable;

public class User implements Parcelable, Serializable {
  public static int sUserId = 1;
  private int userId;
  private String userName;
  private Boolean isMale;
  public User() {
  }
  public User(int userId, String userName, boolean isMale) {
    this.userId = userId;
    this.userName = userName;
    this.isMale = isMale;
  }
  @Override
  public int describeContents() {
    return 0;
  }
  @Override
  public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(userId);
    dest.writeString(userName);
    dest.writeInt(isMale ? 1 : 0);
  }
  public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {
    @Override
    public User createFromParcel(Parcel source) {
      return new User(source);
    }
    @Override
    public User[] newArray(int size) {
      return new User[size];
    }
  };
  private User(Parcel in) {
    userId = in.readInt();
    userName = in.readString();
    isMale = in.readInt() == 1;
  }
  @Override
  public String toString() {
    return String.format(
        "User:{userId:%s, userName:%s, isMale:%s},",userId, userName, isMale
    );
  }
}

5.添加SecondActivity类


package com.zhangmiao.ipcdemo;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class SecondActivity extends Activity {
  private static final String TAG = "SecondActivity";
  private TextView mTextView;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
    Log.d(TAG, "onCreate");
    mTextView = (TextView)findViewById(R.id.textView1);
  }
  @Override
  protected void onResume() {
    Log.d(TAG,"onResume");
    super.onResume();
    User user = (User)getIntent().getSerializableExtra("extra_user");
    Log.d(TAG,"user:"+user.toString());
    recoverFromFile();
  }
  private void recoverFromFile(){
    new Thread(new Runnable() {
      @Override
      public void run() {
        User user = null;
        File cachedFile = new File(MyConstants.CACHE_FILE_PATH);
        if(cachedFile.exists()){
          ObjectInputStream objectInputStream = null;
          try{
            objectInputStream = new ObjectInputStream(new FileInputStream(cachedFile));
            user = (User)objectInputStream.readObject();
            Log.d(TAG,"recover user:"+user);
            mTextView.setText("recover user:"+user);
          }catch (IOException e) {
            e.printStackTrace();
          }catch (ClassNotFoundException e){
            e.printStackTrace();
          }finally {
            MyUtils.close(objectInputStream);
          }
        }
      }
    }).start();
  }
}

6.修改MainActivity类


package com.zhangmiao.ipcdemo;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class MainActivity extends AppCompatActivity {
  private static final String TAG = "MainActivity";
  private TextView mTextView;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    User.sUserId = 2;
    findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Intent intent = new Intent();
        intent.setClass(MainActivity.this, SecondActivity.class);
        User user = new User(0, "jake", true);
        intent.putExtra("extra_user", (Serializable) user);
        startActivity(intent);
      }
    });
    mTextView = (TextView) findViewById(R.id.textView1);
  }
  @Override
  protected void onResume() {
    super.onResume();
    Log.d(TAG, "UserManager.sUserId=" + User.sUserId);
    super.onStart();
    persistToFile();
  }
  private void persistToFile() {
    new Thread(new Runnable() {
      @Override
      public void run() {
        User user = new User(1, "hello world", false);
        File dir = new File(MyConstants.CHAPTER_2_PATH);
        if (!dir.exists()) {
          dir.mkdirs();
        }
        File cachedFile = new File(MyConstants.CACHE_FILE_PATH);
        ObjectOutputStream objectOutputStream = null;
        try {
          objectOutputStream = new ObjectOutputStream(new FileOutputStream(cachedFile));
          objectOutputStream.writeObject(user);
          Log.d(TAG, "persist user:" + user);
          mTextView.setText("persist user:" + user);
        } catch (IOException e) {
          e.printStackTrace();
        } finally {
          MyUtils.close(objectOutputStream);
        }
      }
    }).start();
  }
}

7.修改AndroidManifest.xml文件


<?xml version="1.0" encoding="utf-8"?>
<manifest 
  xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.zhangmiao.ipcdemo">
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
      android:name=".MainActivity"
      android:label="@string/app_name"
      android:launchMode="standard"
      android:theme="@style/AppTheme.NoActionBar">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity
      android:name=".SecondActivity"
      android:configChanges="screenLayout"
      android:label="@string/app_name"
      android:process=":remote" />
  </application>
</manifest>

完整代码下载地址:https://github.com/ZhangMiao147/IPCDemo

您可能感兴趣的文章:Android IPC进程间通信详解最新AndroidStudio的AIDL操作)Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路Android进程间通信(IPC)机制Binder简要介绍Android IPC机制利用Messenger实现跨进程通信Android IPC机制绑定Service实现本地通信android IPC之binder通信机制开放IPC$共享


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android使用文件进行IPC

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android使用文件进行IPC

一、文件进行IPC介绍 共享文件也是一种不错的进程间通信方式,两个进程通过读/写同一个文件来交换数据。在Windows上,一个文件如果被加了排斥锁将会导致其他线程无法对其进行访问,包括读写,而由于Android系统基于Linux,使其并发读
2022-06-06

Android之使用Bundle进行IPC详解

一、Bundle进行IPC介绍四大组件中的三大组件(Activity、Service、Receiver)都是支持在Intent中传递Bundle数据的,由于Bundle实现了Parcelable接口,所以它可以方便地在不同的进程之间传输。当
2022-06-06

Android使用okhttp3和retrofit2进行单文件和多文件上传

这篇文章主要介绍了Android使用okhttp3和retrofit2进行单文件和多文件上传,开发项目中需要进行单文件多文件的上传功能,下面演示的ApiResponse是自己分装的返回值,要根据自己的项目来完成,需要的朋友可以参考下
2022-11-13

Android使用文件进行数据存储的方法

本文实例讲述了Android使用文件进行数据存储的方法。分享给大家供大家参考。具体如下: 很多时候我们开发的软件需要对处理后的数据进行存储,以供再次访问。Android为数据存储提供了如下几种方式: 文件 SharedPreferences
2022-06-06

详解Android使用Socket对大文件进行加密传输

前言数据加密,是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。它的核心是密码学。数据加密目前仍是计算机系统对信息进行保护的一种最可靠的办法。它利用密码技术对信息进行加密,实现
2023-05-31

Android IPC机制利用Messenger实现跨进程通信

写作原因:跨进程通信的实现和理解是Android进阶中重要的一环。下面博主分享IPC一些相关知识、操作及自己在学习IPC过程中的一些理解。这一章使用Messenger实现跨进程通信,其中bindService基础部分参见Android IP
2022-06-06

android怎么运行二进制文件

在Android上运行二进制文件,需要通过终端或者使用相关的应用程序来执行。以下是一种常见的方法:1. 打开终端或者使用一个支持运行二进制文件的应用程序,例如Termux。2. 导航到包含二进制文件的目录,可以使用`cd`命令切换目录。3.
2023-08-14

在Android中使用InputManagerService进行事件传递

在Android中使用InputManagerService进行事件传递?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。InputManagerServicepublic voi
2023-05-31

如何使用netcat进行文件传输

这篇文章将为大家详细讲解有关如何使用netcat进行文件传输,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先看一下帮助信息。$ nc -hOpenBSD netcat (Debian patchleve
2023-06-09

怎样使用Shell进行文件监控

怎样使用Shell进行文件监控,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。文件监控可以配合rsync实现文件自动同步,例如监听某个目录,当文件变化时,使用rsync命令将变化
2023-06-28

如何使用C++进行文件操作?

如何使用C++进行文件操作?文件操作是编程中非常重要的一部分。在C++中,我们可以利用文件操作来读取和写入文件,以对文件进行处理和管理。本文将介绍如何使用C++进行文件操作的基本知识和常用函数。C++提供了一个fstream库,它包含了各种
如何使用C++进行文件操作?
2023-11-02

Android应用中怎么对SDCARD文件进行遍历

今天就跟大家聊聊有关Android应用中怎么对SDCARD文件进行遍历,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android 遍历SDCARD的文件夹并显示目录信息privat
2023-05-31

Android下如何使用JUnit进行软件测试

软件测试作为程序员必备的一项技能是决定软件开发周期长短以及软件运行成败的关键,可以说好的软件不是代码写得好而是有效的测试决定的。本文将介绍在android下利用eclipse进行开发时如何使用JUnit进行单元测试。一、测试的分类(仅举例其
2022-06-06

使用Python怎么对文件进行操作

使用Python怎么对文件进行操作?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。文件的存储方式在计算机中,文件是以 二进制的方式保存在磁盘上的文本文件和二进制文
2023-06-15

怎么进行Linux中patch文件的使用

怎么进行Linux中patch文件的使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。diff的功能就是用来比较两个文件的不同,然后记录下来,也就是所谓的diff补丁,patc
2023-06-28

Android进程间使用Intent进行通信

Android进程间通信(IPC,Inter-ProcessCommunication)底层采用的是Binder机制,具体到应用层有网友根据安卓四大组件将进程间通信方式分为对应的四种方式Activity,Broadcast,ContentProvider,Service
2023-02-28

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录