美文网首页我爱编程
Android IPC(跨进程间通信)机制开启多进程

Android IPC(跨进程间通信)机制开启多进程

作者: 涛涛123759 | 来源:发表于2018-04-09 14:45 被阅读39次

一、Android IPC简介

IPC是Inter-Process Communication的缩写,含义就是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。那么什么是进程,什么是线程,进程和线程是两个截然不同的概念。在操作系统中,线程是CPU调度的最小单元,同时线程是一种有限的系统资源。而进程指的一个执行单元,在PC和移动设备上指的是一个程序或者一个应用。一个进程可以包含多个线程,因此进程和线程是包含被包含的关系,最简单情况下,一个进程可以只有一个线程,即主线程,在Android里面也叫UI线程,在UI线程里才能操作界面元素。

那么在Android中,有特色的进程间通信方式就是Binder了,通过Binder可以轻松实现进程间通信。除了Binder,Android还支持Socket,通过Socket也可以实现任意两个终端之间的通信,当然一个设备上的两个进程之间通过Socket通信自然也是可以的。

说到IPC的使用场景就必须提到多进程,只有面对多进程这种场景下,才需要考虑进程间通信。所有运行在不同进程中的四大组件,只要它们之间需要通过内存来共享数据,都会共享失败,这也是多进程所带来的主要影响。正常情况下,四大组件中间不可能不通过一些中间层来共享数据,那么通过简单地指定进程名来开启多进程都会无法正确运行。一般来说,使用多进程会造成如下几方面的问题:

静态成员和单例模式完全失效
线程同步机制完全失效
SharedPreferences的可靠性下降
Application会多次创建
为了解决这个问题,系统提供了很多跨进程通信方法,虽然说不能直接地共享内存,但是通过跨进程通信我们还是可以实现数据交互。实现跨进程通信的方式有很多,比如通过Intent来传递数据,共享文件SharedPreference,基于Binder的Messenger和AIDL以及Socket等。

二、为何要开启多进程

为何开启android应用要开启多进程,主要有以下几点:

1、单进程所分配的内存不够,需要更多的内存。在早期android系统只为一个单进程的应用分配了16M的可用内存,随着手机的硬件的提升和android系统的改进,虽然可分配内存越来越多,但仍旧可以通过开启多进程来获取更多的内存来处理自己App的业务

2、独立运行的组件,比如个推,它的服务会另开一个进程。

3、运行一些”不可见人”的操作,比如获取用户的隐私数据,比如双守护进程来防止被用户杀掉

开启多进程需要我们在在AndroidManifest.xml中的配置 android:process就可以了

   <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:configChanges="screenLayout"
        android:label="@string/app_name"
        android:process=":second" />

    <service
        android:name=".MyService"
        android:process=":server"></service>

这里选择“server”这个名字是随意主观的,你也可以取其他的名字。冒号“:”则代替当前应用的包名,所以MyService跑在进程名为“com.example.bearhunting.myapplication:server”的进程中。我们也可以设置 android:process=”com.example.bearhunting.myapplication.server”,这样MyService跑在进程名为“com.example.bearhunting.myapplication.server”的进程中。这两种命名也是有区别的,如果被设置的进程名是以一个冒号开头的,则这个新的进程对于这个应用来说是私有的,当它被需要或者这个服务需要在新进程中运行的时候,这个新进程将会被创建。如果这个进程的名字是以小写字符开头的,则这个服务将运行在一个以这个名字命名的全局的进程中,当然前提是它有相应的权限。这将允许在不同应用中的各种组件可以共享一个进程,从而减少资源的占用。

我们可以通过 adb shell ps 发现:开启了的进程

三、开启多进程引出的问题
开启多进程会使Application运行多次,我们继承Application,在oncreate方法中打log并运行程序

public class MyApplication extends Application {
    private static final String TAG = "MyApplication";
    @Override
    public void onCreate() {
        super.onCreate();
        int pid = android.os.Process.myPid();
        Log.i(TAG, "MyApplication is oncreate====="+"pid="+pid);
 }

在log中我们发现我们开启的两个进程都会执行oncreate方法。现在很多开发者都习惯在Application中做初始化操作以及数据的传递操作,这显然是不妥当的,解决的方法就是得到每个进程的名称,如果进程的名称和我们应用的进程名称相同则做我们应用的操作,如果不是则做其他进程的操作

public class MyApplication extends Application {
    private static final String TAG = "MyApplication ";
    @Override
    public void onCreate() {
        super.onCreate();
        int pid = android.os.Process.myPid();
        Log.i(TAG, "MyApplication is oncreate====="+"pid="+pid);
        String processNameString = "";
        ActivityManager mActivityManager = (ActivityManager)this.getSystemService(getApplicationContext().ACTIVITY_SERVICE);
        for (ActivityManager.RunningAppProcessInfo appProcess : mActivityManager.getRunningAppProcesses()) {
            if (appProcess.pid == pid) {
                processNameString = appProcess.processName;
            }
        }
        if("com.example.liuwangshu.myprogress".equals(processNameString)){
            Log.i(TAG, "processName="+processNameString+"-----work");
        }else{
            Log.i(TAG, "processName="+processNameString+"-----work");
        }
    }
}

相关文章

  • IPC、Window小结

    1、IPC机制 1、Android IPC简介 IPC:含义为进程间通信或者跨进程通信。 2、Android中的多...

  • Android面试Android基础(十一)

    问:Android中的IPC(进程间通信)机制? 答:进程间通信即:跨进程的通信。有以下几种:1、使用Bundle...

  • Android进阶笔记-5. IPC机制 & Binder 原理

    IPC机制 一次进程间通信至少包含两个进程,由于进程隔离机制的存在,通信双方必然需要借助 IPC(进程间通信,in...

  • 6. 进程间通信

    参考链接:1. 进程间通信及使用场景2. 进程间通信机制IPC3. 看图理解进程间通信IPC==重点4. 进程间通...

  • 笔记:IPC机制

    IPC机制 IPC简介Inter-Process Communication 进程间通信/跨进程通信----指两个...

  • IPC机制和binder

    ipc(Inter-Process Communication)含义是进程间通信或者跨进程通信,ipc机制不是An...

  • Android的IPC机制

    什么是IPC机制? IPC(Inter-Process Communication)是指进程间通信或跨进程通信,也...

  • Android进程间通信

    3.5 Android进程间通信 3.5.1 背景知识 传统IPC Linux传统的IPC机制分为如下几种:管道、...

  • Binder机制

    进程间通信方式 Android Binder框架图 Android系统框架 IPC 进程通信原理 Binder原理...

  • android核心知识点学习资料

    Binder学习指南 Android Bander设计与实现 - 设计篇 Android进程间通信(IPC)机制B...

网友评论

    本文标题:Android IPC(跨进程间通信)机制开启多进程

    本文链接:https://www.haomeiwen.com/subject/zblihftx.html