Android学习笔记-IPC机制浅析

很多人都写过IPC机制,但是我想再写一下自己的体会与感想。因为Andoird中的IPC机制应用到的地方非常广泛,而且很难一次掌握,所以想通过写一个系列博客。这样能够让自己更深切的理解IPC机制。
IPC即进程间通信,即两个进程间进行数据交换的过程。注意这里重点在于数据交换。两个进程之间通信最重要的目的就是为了进行数据的交换。
但在此之前想明白进程、线程是什么很重要。
先前写过一篇关于什么是进程,什么是线程的文章。但是现在看来写的还是有点绕。其实言简意赅的概括他们可以这样说:
进程:
一个执行单元。
在WIndows上理解为就是一个.exe文件就可以。在安卓上理解为一个应用APP(开启了多进程的除外,Android默认设置是一个APP就是一个进程)。
线程:
进程中的一个执行路径。
假设说进程是从山顶到山下的所有河流总和。那线程就是其中的一条河流。这就是线程。
当然从山顶到山下的河流至少有一条。如果只有一条,那这条就是主线程。如果有多条,那么河流的总和就有多条河流。其中还是有一条是主干道。
通过这个例子,可以具象化进程和线程的关系。
进程可以包含多个线程。也可以只有一个线程,即主线程。
这样,进程和线程是什么就更清楚明了了。

在android里面一个应用(进程)他的主线程就是UI线程。UI线程不能执行耗时的操作。因为一个线程是流水式的执行的,如果把耗时的操作放在UI线程,在执行到耗时任务的时,UI界面对用户的交互就会被打断失去对用户操作的响应。
这就好比你玩游戏的时候,你正在攻击对手狂按键盘,结果游戏软件告诉你,别急,我先做点耗时的任务,这个事儿必须执行,不执行你就玩不了游戏。这是狂按键盘的你肯定想砸了电脑对不对。
所以,Android系统就明确规定不能再UI线程执行耗时的操作!如果你有必须执行的耗时任务,那好,你自己开个线程跑不就完了。你占用我UI主线程搞什么?

IPC机制的前提就是有两个以及两个以上的进程,而且他们需要交换数据。
不管是Windows Linux Android多进程的情况无非两种。
1.一个应用因为特殊需要,自己持有多个进程。
比如LOL,你打开系统管理器,跑着的进程里LOL进程不止一个。还有移动端支付宝也是多个进程。
2.一个应用需要和其他应用交换数据
这种情况就是属于两个应用。由于是两个应用,所以需要跨进程通信。

Android怎么开多进程

正常理解下,Android多进程指的就是一个应用中存在多个进程的情况。
一句话说完怎么开多进程,唯一的开多进程的办法只有直接在Manifest.xml中给四大组件里你想开多进程的组件添加android:process属性。就这么简单。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.zharma.processtest">

    <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">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".SecondActivity"
            android:process=":remote" />
        <activity android:name=".ThirdActivity"
            android:process="com.zharma.processtest.remote"></activity>
    </application>

</manifest>

代码中我让MainActivity显式Intent启动SecondActivity,SecondActivity启动ThirdActivity。
MainActivity在默认进程, SecondActivity ThirdActivity 制定process属性,属性值不同,也就是分别给他们启了进程。
SecondActivity**启动时**跑在com.zharma.processtest:remote进程
ThirdActivity启动时跑在com.zharma.processtext.romote进程

:加进程名 = 当前包名附加上进程名 是一种简写。而且:开头的进程是当前应用的私有进程,其他外部应用组件不可以跟他跑在同一个进程。
ThirdAcvitity是完整命名方式,不会附加包名信息。这种命名方式是全局进程。其他应用通过ShareUID可以和他跑在一个进程。
要先让SecondActivity,ThirdActivity起来才有他们跑的进程。
用DDMS可以看到相应的进程名和id
Android中,系统自动为应用生成唯一的UID。相同UID的应用才能共享数据。
两个应用通过ShareUID跑在同一个进程中需要两个应用ShareUID相同且签名相同才行。这样他们可以相互访问私有数据比如data目录、组件信息等。
这只是进程间通信的开篇,IPC机制远没有这么简单。下一篇博客我想继续写学习IPC之前需要理解的知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值