Android开发艺术探索(研读笔记)——03-Android中的IPC机制(一)

Android开发艺术探索(研读笔记)

作者:Dimon

03-Android中的IPC机制(一)

1.Android IPC 简介

IPC(Inter-Process-Communication):含义为进程间通信,指两个进程之间进行数据交换的过程。

什么是进程:一般指一个执行单元,在PC和移动设备上的一个程序或者一个应用。

什么是线程:线程是CPU调度的最小单元,是一种有限的系统资源。

而一个进程可以包含多个线程。

2.Android中的多进程模式

只需要给四大组件指定 android:process 属性,就可以开启多进程模式。(非常规的方法,JNInative层去fork一个新的进程)

//没有定义默认进程的进程名为包名:"com.dimon"
android:process=":remote"  ->  进程名:"com.dimon:remote" 用":"开头的进程属于当前应用的私有进程
android:process="com.dimon.remote"  ->  进程名:"com.dimon.remote" 全局进程

私有进程:其他应用的组件不可以和它跑在同一个进程中。

全局进程:其他应用通过ShareUID(每个应用都有自己唯一的UID,具有相同UID的应用才能共享数据)方式可以和它跑在同一个进程。同个应用间的多进程可以理解为两个不同的应用采用了ShareUID模式。

除了DDMS视图查看进程外,还可以用shell来查看,命令为:adb shell ps 或者 adb shell ps|grep com.dimon(com.dimon是包名)

多进程会造成的问题

  • 静态成员和单例模式完全失效:主要是每个进程都分配了一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间;
  • 线程同步机制完全失效:因为不是同一块内存所以无法保证线程同步了;
  • SharePreferences的可靠性下降:SharePreferences底层是通过读/写XML文件来实现的,并发写可能会出现问题,也就是说其不支持两个进程同时去执行写操作;
  • Application会多次创建

Serializable接口

SerializableJava所提供的一个序列化接口。

public class User implements Serializable{
  private static final long serialVersionUID = 519067123721295773L;//反序列化的时候系统会检测是否版本相同,相同才可以算成功反序列化,不相同则会反序列化失败

  public int userId;
  public String uesrName;
  public boolean isMale;
  ...
}
//序列化过程
User user = new User(0, "jake", true);
ObjectOutputStream out = new ObjectOutputStream(
  new FileOutputStream("cache.txt"));
out.writeObject(user);
out.close();

//反序列化过程
ObjectInputStream in = new ObjectInputStream(
  new FileInputStream("cache.txt"));
User newUser = (User) in.readObject();
in.close();
  • 静态成员变量属于类不属于对象,所以不会参与序列化过程;
  • transient关键字标记的成员变量不参与序列化过程;

Parcelable接口

典型用法:

public class User implements Parcelable {
  public int uesrId;
  public String uesrName;
  public boolean isMale;

  public Book book;

  public User(int userId, String uesrName, boolean isMale) {
    this.userId = userId;
    this.uesrName = uesrName;
    this.isMale = isMale;
  }
// 内容描述功能:对象存在文件描述符时,方法1
  public int describeContents() {
    return 0;
  }

// 序列化功能
  public void writeToParcel(parcel out, int flags) {
    out.writeInt(userId);
    out.writeString(uesrName);
    out.writeInt(isMale ? 1 : 0 );
    out.writeParcelable(book, 0 );
  }

// 反序列化功能
  public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {
    public User createFromParcel(Parcel in) {
      return new User(in);

    public User[] newArray(int size) {
        return new User[size];
      }
    };

    private User(Parcel in) {
      userId = in.readInt();
      uesrName = in.readString();
      isMale = in.readInt() == 1;
      // 传递当前线程的上下文类加载器
      book = in.readParcelable(Thread.currentThread().getContextClassLoader());
    }
  }
}

parcelable 与 Serializable的对比

  • Serializable是Java中的序列化接口,其使用起来简单但是开销很大,序列化和反序列化过程需要大量I/O操作。
  • Parcelable是Android中的序列化方式,缺点就是使用起来稍微麻烦点,但是它的效率很高,是Android推荐的序列化方式。

Android平台上,推荐Parcelable,但在将对象序列化到存储设备或者将对象序列化后通过网络传输建议使用Serializable


  • 邮箱 :[email protected]
  • Good Luck!
时间: 2024-10-23 23:19:50

Android开发艺术探索(研读笔记)——03-Android中的IPC机制(一)的相关文章

android开发艺术探索读书笔记之-------view的事件分发机制

View的点击事件的分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生后,系统需要把这个事件传递给一个具体的View,而这个过程就是分发过程. 分发过程主要由以下3个方法共同完成: public boolean dispatchTouchEvent(MotionEvent event) 用来进行事件的分发.如果事件能够传递给当前的View,那么此方法一定会被调用,返回结果受当前的View的onTouchEvent和下级View的dispatchTouchEv

Android开发艺术探索读书笔记——进程间通信

1. 多进程使用场景 1) 应用某些模块因为特殊需求需要运行在单独进程中.如消息推送,使消息推送进程与应用进程能单独存活,消息推送进程不会因为应用程序进程crash而受影响. 2) 为加大一个应用可使用的内存,需要多进程来获取多份内存空间. 2. 如何开启多进程 给四大组件(Activity.Service.Receiver.ContentProvider)在AndroidMainfest中指定android:process属性指定. 如果进程以":"开头的进程,代表应用的私有进程,其

Android开发艺术探索学习笔记(十一)

第十一章  Android的线程和线程池 从用途上来说,线程分为子线程和主线程,主线程主要处理和界面相关的事情,而子线程往往用于执行耗时的操作.AsyncTask,IntentService,HandlerThread都可以扮演线程的角色. AsyncTask封装了线程池和Handler,主要是为了方便开发者在主线程中更新UI. HandlerThread是一种具有消息循环的线程,在它的内部可以使用Handler. IntentService是一个服务,系统对其进行了封装,使其可以更方便的执行后

《Android 开发艺术探索》笔记——(3)View 的事件体系

View 基础知识 View 是 Android 中所有控件的基类,ViewGroup 也继承了 View. Android 中,x 轴和 y 轴的正方向分别为右和下. 位置参数: (left , top ): View 左上角原始坐标 (right, bottom): View 右下角原始坐标 (x , y ): View 左上角最终坐标 translationX: View 左上角横向偏移量 translationY: View 左上角纵向偏移量 x = left + translation

《android开发艺术探索》读书笔记(五)--动画

接上篇<android开发艺术探索>读书笔记(五)--Drawable No1: 自定义动画:派生一种新动画只需要继承Animation这个抽象类,然后重写它的initialize和applyTransformation方法,在initialize方法中做一些初始化工作,在applyTransformation中进行相应的矩阵变换即可,很多时候需要采用Camera来简化矩阵变换的过程. No2: 属性动画PropertyAnimation 补间动画TweenAnimation 帧动画Frame

《android开发艺术探索》读书笔记(十三)--综合技术

接上篇<android开发艺术探索>读书笔记(十二)--Bitmap的加载和Cache No1: 使用CrashHandler来获取应用的crash信息 No2: 在Android中单个dex文件所能够包含的最大方法数为65536,这包含Android FrameWork.依赖的jar包以及应用本身的代码中的所有方法. No3: 使用multidex来解决方法数越界 apply plugin: 'com.android.application' android { compileSdkVers

《android开发艺术探索》读书笔记(十五)--Android性能优化

接上篇<android开发艺术探索>读书笔记(十四)--JNI和NDK编程 No1: 如果<include>制定了这个id属性,同时被包含的布局文件的根元素也制定了id属性,那么以<include>指定的id属性为准 No2: 绘制优化 1)onDraw中不要创建新的局部对象 2)onDraw方法中不要做耗时的任务 No3: 内存泄露优化 场景一:静态变量导致的内存泄露: 如果静态变量持有了一个Activity,会导致Activity无法及时释放. 解决办法:1使用Ap

【读书笔记】【Android 开发艺术探索】第4章 View 的工作原理

一.基础知识 1.ViewRoot 和 DecorView ViewRoot 对应 ViewRootImpl 类,它是连接 WindowManager 和 DecorView 的纽带,View 的三大流程都是通过 ViewRoot 来完成的.在ActivityThread 中,当 Activity 对象被创建完毕后,会将 DecorView 添加到 Window 中,同时会创建 ViewRoot 对象. DecorView 添加到窗口 Window 的过程. 图片来自https://yq.ali

Android 开发艺术探索——第十章 Android的消息机制

Android 开发艺术探索--第十章 Android的消息机制读书笔记 Handler并不是专门用于更新UI的,只是常被用来更新UI 概述 Android的消息机制主要值得就是Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑. MessageQueue即为消息队列,顾名思义,它的内部存储了一组消息,以队列的的形式对外提供插入和删除的工作.虽然叫队列,但内部存储结构并不是真正的队列,而是采用单链表的数据结构来存储消息列表. Looper意思为循