zoukankan      html  css  js  c++  java
  • Android8_安卓的IPC机制

    理解IPC,进程间通信之前先聊一下进程和线程;

    进程是系统资源分配的单位,线程是系统调度的单位;

    进程与线程是包含与被包含关系;一个进程可以包含多个线程;

    最简单的情况下,一个进程中可以只有一个线程,即主线程;

    对于安卓来说,主线程也叫做UI线程;

    只有在UI线程里才能操作界面元素;

    很多时候一个进程需要执行大量的耗时任务,如果把这些任务都放在主线程中会导致无法对用户操作及时响应;

    这会严重影响用户体验,安卓是有个异常叫做ANR,Application Not Responding;

    为了解决这个问题,就需要用到线程,把一些耗时的任务放到线程中;

    ==================================================

    任何操作系统都需要有对应IPC机制,这不是安卓特有的;

    Windows上有剪贴板、管道、邮槽用于进程间通信;

    Linux上可以通过命名管道、共享内容、信号量等来进行进程间通信;

    不同的操作系统平台有着不同的进程间通信方式;

    对于安卓来说,是一个基于Linux内核的移动操作系统,它的进程间通信方式并不能完全继承自Linux;

    它有自己的进程间通信方式;

    最具特色的就是Binder,此外还有Socket,Socket也可以用于任意两个终端之间的通信。

    ==================================================

    多进程的场景:

    1、应用因为某些原因自身需要采用多进程模式来实现,原因可能有很多,例如有些模块可能由于特殊的原因需要运行在单独进程中等;

    2、当前应用需要向其他应用获取数据,由于是两个应用,所以必须跨进程的方式来获取数据。目前用的是ContentProvider,其实际上也是IPC通信,只不过实现细节被屏蔽了;

    ==================================================

    开启多进程模式

    这里讨论一下一个应用中存在多个进程的情况;

    在安卓中使用多进程只有一个办法,就是给四大组件在AndroidManifest中指定android:process属性;

    安卓系统会为每个应用分配一个唯一的UID,具有相同UID的应用才能共享数据;

    两个应用通过ShareUID跑在同一个进程中是有要求的,这两个应用有相同的ShareUID,并且签名相同;

    在这种情况下,它们可以互相访问对方的私有数据。

    进程名以“:”开头的进程,属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中;

    进程名不以:开头的进程属于全局进程,其他应用通过ShareUID可以和它跑在同一个进程中;

    android:process属性:

    如果不填写的话,默认用包名;

    :额外命名   表示当前进程名=包名+额外命名;是一种简写

    完整的写法:包名.额外命名=进程名

    ==================================================

    运行多进程模式

    安卓为每个应用分配了一个独立的虚拟机,或者说为每个进程都分配了一个独立的虚拟机;

    不同的虚拟机在内存分配上有不同的地址空间;

    这就导致了在不同的虚拟机中访问同一个类的对象会产生多份副本;

    所有运行在不同进程中的四大组件,只要它们之间需要通过内存来共享数据,都会共享失败;

    这也是多进程所带来的主要影响;

    正常情况下,四大组件中间不可能不通过一些中间层来共享数据;

    多进程模式会造成如下问题:

    1)静态成员和单例模式完全失效;

    2)线程同步机制完全失效;

    3)SharedPreferences的可靠性下降;

    4)Application会多次创建;//运行在同一个进程中的组件属于同一虚拟机和同一个Application

    ===================================================

    安卓系统有很多跨进程的通信方式:

    1)Intent传递数据

    2)共享文件和SharedPreferences

    3)基于Binder的Messenger和AIDL以及Socket

    此外要先熟悉Serializable和Parcelable接口,以及Binder的概念,熟悉完这些基础概念之后,再去理解IPC方式就比较简单了;

  • 相关阅读:
    各种文件的mime类型
    LeetCode_122. Best Time to Buy and Sell Stock II
    LeetCode_121. Best Time to Buy and Sell Stock
    LeetCode_119. Pascal's Triangle II
    LeetCode_118. Pascal's Triangle
    LeetCode_112. Path Sum
    LeetCode_111. Minimum Depth of Binary Tree
    LeetCode_110. Balanced Binary Tree
    LeetCode_108. Convert Sorted Array to Binary Search Tree
    LeetCode_107. Binary Tree Level Order Traversal II
  • 原文地址:https://www.cnblogs.com/grooovvve/p/12462286.html
Copyright © 2011-2022 走看看