zoukankan      html  css  js  c++  java
  • 《安卓开发艺术探索》第二章 IPC机制—学习笔记

    这个文集中文章主要是自己在学习中记录的重要知识点,方便日后查阅。

    IPC简介

    IPC:Inter-Process Communication 进程间通信或者跨进程通信
    进程:在PC或者移动设备上一个程序或者应用,一个进程可以有多个线程
    线程:是CPU调度的最小单元

    Android里主线程也叫UI线程,只有在UI线程里才能操作界面元素

    Android中多进程模式

    Android中使用多进程只有一种方法:给四大组件在AndroidMenifest中指定android:process属性

    多进程模式带来的问题

    Android为每个进程都分配一个独立的虚拟机,不同的虚拟机在内存的分配上是不同的地址空间。这就导致在不同的虚拟机中访问同一个对象会产生多个副本,所有运行在不同进程的四大组件,只要他们之间需要通过内存来共享数据,都会共享失败。这是多进程带来的影响。

    多进程还会带下如下问题

    1. 静态成员和单例模式失效
    2. 线程同步机制完全失效
    3. SharedPreferences可靠性下降
    4. Application多次创建

    IPC基础概念

    1.Serializable接口

    这是Java提供的序列化接口,可以通过ObjectOutputStreamObjectInputStream进行序列化和反序列化操作
    注:通过Serializable进行序列化和反序列化的对象内容是完全一样的,但两者并不是同一个对象。

    2.Parcelable

    只要实现这个接口,一个类的对象就可以实现序列化并可以通过Intent和Binder传递。系统中的Intent、Bundle、Bitmap等已经实现了该接口,可以直接序列化。Lsit、Map也可序列化,只要它们中的每个元素都是可以序列化的。

    以上两种接口的异同

    Serializable接口是Java中接口,使用简单开销大
    Parcelable 接口是Android平台提供,使用略微复杂,效率高,优化使用此接口。
    但是要是将对象序列化到设备或者用网络传输,过程就会稍显复杂,建议使用Serializable

    3.Binder

    Binder是Android实现Ibinder的一个类。
    下面从不同角度来介绍Binder的概念:

    • IPC角度:是Android种跨进程通信的方式
    • 虚拟物理设备:设备驱动是/dev/binder
    • Android Framework角度:Binder是ServiceManager连接各种Manager和相应ManagerService的桥梁
    • Android应用层:是服务端和客户端通信的媒介。

    Android中的IPC方式

    1.使用Bundle

    Activity、Service、Receiver都支持在Intent传递Bundle数据,由于Bundle实现了Parcelable接口,可以在不同进程中传输数据。

    2.文件共享

    就是第一个进程中将一个对象序列化到sd卡上的文件里,在第二个进程再将sd卡中的对象内容重新反序列化成对象。这两个对象是一样的,但本质上还是一个对象。
    文件共享方式,适合对数据同步要求不高的进程间的通信,并要妥善处理并发读/写的问题。
    不建议在进程间通信使用SharedPreferences,因为在高并发的读/写访问中,很容易会丢失数据。

    3.使用Messenger

    在Messenger中放入要传递的数据,就可以实现数据的进程间传递了,它的底层实现的是AIDL。

    4.AIDL

    (看的不是很清楚,待补充)

    5.使用ContentProvider

    这就是Android中提供的专门用于不同应用间数据共享的方式。其底层实现同样也是Binder。

    6.使用Socket

    简单来说就是通过网络通信,来实现跨进程通信。

    Binder连接池

    主要作用就是将每个业务模块的Binder请求统一转发到远程Service中,避免重复创建Service。

  • 相关阅读:
    java struts2入门学习实例--用户注册
    java struts2入门学习实例--将客户端IP地址和访问方式输出到浏览器
    struts2基本配置详解2
    struts2基本配置详解
    使用maven+eclipse搭建最简单的struts2的HelloWorld
    2013年总结
    linux shell 脚本攻略学习20--awk命令入门详解
    linux shell 脚本攻略学习19--sed命令详解
    linux shell 脚本攻略学习18--grep命令详解
    linux shell 脚本攻略学习17--正则表达式入门
  • 原文地址:https://www.cnblogs.com/cloud9527/p/13161462.html
Copyright © 2011-2022 走看看