iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android使用文件进行IPC
  • 137
分享到

Android使用文件进行IPC

ipcAndroid 2022-06-06 05:06:40 137人浏览 安东尼
摘要

一、文件进行IPC介绍 共享文件也是一种不错的进程间通信方式,两个进程通过读/写同一个文件来交换数据。在windows上,一个文件如果被加了排斥锁将会导致其他线程无法对其进行访

一、文件进行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$共享


--结束END--

本文标题: Android使用文件进行IPC

本文链接: https://www.lsjlt.com/news/22759.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Android使用okhttp3和retrofit2进行单文件和多文件上传
    目录前言一、单文件上传1、apiService中2、acivity代码二、多文件上传 1、apiservice中2、acivity代码总结 前言 开发项目中需要进行单文件多...
    99+
    2022-11-13
    android 单文件 android多文件上传 android 使用 okhttp3和retrofit2 文件上传
  • 详解Android使用Socket对大文件进行加密传输
    前言数据加密,是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。它的核心是密码学。数据加密目前仍是计算机系统对信息进行保护的一种最可靠的办法。它利用密码技术对信息进行加密,实现...
    99+
    2023-05-31
    android 文件加密 对大
  • android怎么运行二进制文件
    在Android上运行二进制文件,需要通过终端或者使用相关的应用程序来执行。以下是一种常见的方法:1. 打开终端或者使用一个支持运行...
    99+
    2023-08-14
    android
  • 在Android中使用InputManagerService进行事件传递
    在Android中使用InputManagerService进行事件传递?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。InputManagerServicepublic voi...
    99+
    2023-05-31
    android 事件传递 inputmanagerservice
  • Android应用中怎么对SDCARD文件进行遍历
    今天就跟大家聊聊有关Android应用中怎么对SDCARD文件进行遍历,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android 遍历SDCARD的文件夹并显示目录信息privat...
    99+
    2023-05-31
    android 遍历 sdcard
  • 如何使用netcat进行文件传输
    这篇文章将为大家详细讲解有关如何使用netcat进行文件传输,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先看一下帮助信息。$ nc -hOpenBSD netcat&nb...
    99+
    2023-06-09
  • 如何使用C++进行文件操作?
    如何使用C++进行文件操作文件操作是编程中非常重要的一部分。在C++中,我们可以利用文件操作来读取和写入文件,以对文件进行处理和管理。本文将介绍如何使用C++进行文件操作的基本知识和常用函数。C++提供了一个fstream库,它包含了各种用...
    99+
    2023-11-02
    C++ 文件操作 使用。
  • 怎样使用Shell进行文件监控
    怎样使用Shell进行文件监控,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。文件监控可以配合rsync实现文件自动同步,例如监听某个目录,当文件变化时,使用rsync命令将变化...
    99+
    2023-06-28
  • Android进程间使用Intent进行通信
    安卓使用Intent来封装程序的“调用意图”,使用Intent可以让程序看起来更规范,更易于维护。 除此之外,使用Intent还有一个好处:有些时候我们只是想...
    99+
    2023-02-28
    Android Intent通信 Android进程通信
  • 如何使用 Linux 命令行进行文件处理?
    Linux命令行是一种非常强大的工具,它可以帮助您轻松地处理各种类型的文件,如文本文件、图像文件、音频文件等等。在本文中,我们将介绍如何使用Linux命令行进行文件处理,包括文件的创建、删除、复制、移动、搜索等操作。我们将使用一些常见的命令...
    99+
    2023-08-21
    编程算法 linux 文件
  • 使用Python怎么对文件进行操作
    使用Python怎么对文件进行操作?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。文件的存储方式在计算机中,文件是以 二进制的方式保存在磁盘上的文本文件和二进制文...
    99+
    2023-06-15
  • 怎么进行Linux中patch文件的使用
    怎么进行Linux中patch文件的使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。diff的功能就是用来比较两个文件的不同,然后记录下来,也就是所谓的diff补丁,patc...
    99+
    2023-06-28
  • Python怎么使用Netmiko进行文件传输
    传输配置文件、映像文件等是网络设备管理中常见的操作。Netmiko是一个Python库,可用于与各种网络设备进行交互,提供了一些用于传输文件的函数,其中包括SCP(Secure Copy Protocol)函数。Netmiko简介Netmi...
    99+
    2023-05-19
    Python netmiko
  • Android应用中怎么对本地pdf文件进行加载
    这篇文章给大家介绍Android应用中怎么对本地pdf文件进行加载,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。大部分app打开pdf文件是通过intent调起手机中能打开pdf文件的工具,来查看pdf文件,如果需求是...
    99+
    2023-05-31
    android roi
  • 关于使用Android自带的apksigner进行进行签名
    apksigner.jar是Android自带的 工具中的命令,放在SDK->build-tools工具中; 以往的使用 jarsigner、sign.jar的签名只支持V1签名; android 7...
    99+
    2023-09-15
    android android studio java
  • Android怎么使用GRPC进行通信
    这篇文章主要介绍“Android怎么使用GRPC进行通信”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么使用GRPC进行通信”文章能帮助大家解决问题。引言Android作为一个开发平...
    99+
    2023-07-05
  • 使用hutool进行ftp文件下载和上传
    1 引入依赖 cn.hutool hutool-all 5.8.15 commons-net commons-net 3.6 2 工具类 package ftp;...
    99+
    2023-10-20
    java
  • SpringBoot使用Minio进行文件存储的实现
    目录一、minio二、SpringBoot 使用 Minio 进行文件存储三、测试一、minio MinIO 是一个高性能的对象存储原生支持 Kubernetes 部署的解决方案。 ...
    99+
    2024-04-02
  • 如何使用Node.js对文件进行重命名
    这篇文章主要介绍如何使用Node.js对文件进行重命名,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言hexo的文章基本都是生成在_post文件夹下,若文章多了以后就不好管理,所就...
    99+
    2024-04-02
  • 如何使用PHP进行视频文件处理?
    视频文件处理是现代网络应用程序中必不可少的一部分,它包括裁剪、压缩、转码、添加水印和合并等操作。PHP 作为一种流行的服务器端编程语言,可以用于处理这些要求。在本文中,我们将介绍如何使用 PHP 处理视频文件。安装 FFMPEG 库FFMP...
    99+
    2023-05-14
    PHP 视频文件处理 处理技巧
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作