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

来源:互联网 发布:视频噪声消除软件 编辑:程序博客网 时间:2024/06/04 18:22

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

作者:Dimon

  • 微博:@Dimon-喰
  • GitHub:@Dimon94
  • LOFTER:@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


  • 邮箱 :elisabethzhen@163.com
  • Good Luck!
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 虎牙充值不到账怎么办 平安保险交20年怎么办 u盘里东西乱码了怎么办 手机指环支架松了怎么办 运动完放屁很臭怎么办 腾讯柒个我要会员怎么办 海风吹的变黑了怎么办 冻豆角炖不烂糊怎么办 腿被热水烫了怎么办 肉和冰箱冻住了怎么办 解冻的肉臭了怎么办 临时用电电缆线破皮怎么办 阳台按自来水墙面脱落怎么办 墙被暖气熏黑了怎么办 下水管比地砖低怎么办 马桶下水管短了怎么办 下水管比马桶低怎么办? 寻常疣液氮冷冻后该怎么办 寻常疣冷冻后起水泡胀痛怎么办 冷冻后大水泡痒怎么办 19岁的宫颈糜烂怎么办 发面酸了没有碱怎么办 面发时间长酸了怎么办 丽珠兰打完红肿怎么办 美的冰柜冷藏室结冰怎么办 胃下午和晚上痛怎么办 二胡弓毛粗拉外弦触到里弦怎么办 电视成黑白的了怎么办 城市居民无钱入社保医保怎么办 老婆说离婚又找不到怎么办 爱一个人太累了怎么办 车凹陷漏底漆了怎么办 燕子窝掉下来了怎么办 文科没考上一本怎么办 学校午休小学孩子吵闹怎么办 老鼠死在空调里怎么办 公务员老公四十岁想辞职怎么办 打胎5次又怀孕怎么办 墙纸颜色太淡了怎么办 皮子腺囊肿有点疼痛怎么办 地板颜色选浅了怎么办