美文网首页
Android-多进程

Android-多进程

作者: 有腹肌的豌豆Z | 来源:发表于2020-09-03 10:29 被阅读0次

    什么是进程

    • 按照操作系统中的描述:进程一般指一个执行单元,在 PC 和移动设备上指一个程序或者一个应用。
    • 我们知道了app是运行在虚拟机上,Android为每一个app都单独分配了一个虚拟机,也就是说每个app都有自己的进程,每个进程都有自己的内存空间,这样做的好处就是当我们当前的app出现问题的时候,系统仅仅杀死当前进程,不会导致其他的app受到牵连,回收之后释放出内存给其他app使用。
    • 进程是指一个在内存中运行的应用程序,每个进程在内存中都有一块独立的内存空间。每个软件都可以启动多个进程。

    什么是多进程

    • 多进程指的是操作系统中同时运行的多个程序,多线程指的是同一个进程中同时运行的多个任务。
    • 操作系统中运行的每个任务就是一个进程,进程中的每个任务就是一个线程;操作系统就是一个多任务系统,它可以有多个进程,每个进程又可以有多个线程。

    为什么要使用多进程

    • 我们都知道,系统为 APP 每个进程分配的内存是有限的,超过系统分配的内存上限就会导致内存溢出,App被系统杀死。
    • 如果想获取更多内存分配,可以使用多进程,将一些看不见的服务、比较独立而又相当占用内存的功能运行在另外一个进程当中。

    如何创建多进程

    • Android中开启多进程只有一种方法,就是在AndroidManifest.xml中注册Service、Activity、Receiver、ContentProvider时指定android:process属性,例如:
    <service
        android:name=".MyService"
        android:process=":remote">
    </service>
    
    <activity
        android:name=".MyActivity"
        android:process="com.shark.ipctest.remote2">
    </activity>
    
    • :remote:以:开头是一种简写,系统会在当前进程名前附件当前包名,完整的进程名为:com.shark.ipctest:remote,同时以:开头的进程属于当前应用的私有进程,其它应用的组件不能和它跑在同一进程
    • com.shark.ipctest.remote2:这是完整的命名方式,不会附加包名,其它应用如果和该进程的ShareUID、签名相同,则可以和它跑在同一个进程,实现数据共享。全局进程

    多进程弊端

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

    对于前两个问题,可以这么理解,在Android中,系统会为每个应用或进程分配独立的虚拟机,不同的虚拟机自然占有不同的内存地址空间,所以同一个类的对象会产生不同的副本,导致共享数据失败,必然也不能实现线程的同步。

    由于SharedPreferences底层采用读写XML的文件的方式实现,多进程并发的的读写很可能导致数据异常。

    Application被多次创建和前两个问题类似,系统在分配多个虚拟机时相当于把同一个应用重新启动多次,必然会导致 Application 多次被创建,为了防止在 Application
    中出现无用的重复初始化,可使用进程名来做过滤,只让指定进程的才进行全局初始:

    public class MyApplication extends Application{
        @Override
        public void onCreate() {
            super.onCreate();
            String processName = "com.shark.ipctest";
            // if (getPackageName().equals(processName)){
            if (getPackageName().equals(getProcessName())){
                // do some init
            }
        }
    }
    
    public static String getProcessName() {
        try {
            File file = new File("/proc/" + android.os.Process.myPid() + "/" + "cmdline");
            BufferedReader mBufferedReader = new BufferedReader(new FileReader(file));
            String processName = mBufferedReader.readLine().trim();
            mBufferedReader.close();
            return processName;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    

    Android中的多进程通信方式

    Android中支持的多进程通信方式主要有以下几种,它们之间各有优缺点,可根据使用场景选择选择:

    • AIDL:功能强大,支持进程间一对多的实时并发通信,并可实现 RPC (远程过程调用)。
    • Messenger:支持一对多的串行实时通信, AIDL 的简化版本。
    • Bundle:四大组件的进程通信方式,只能传输 Bundle 支持的数据类型。
    • ContentProvider:强大的数据源访问支持,主要支持 CRUD 操作,一对多的进程间数据共享,例如我们的应用访问系统的通讯录数据。
    • BroadcastReceiver:即广播,但只能单向通信,接收者只能被动的接收消息。
    • 文件共享:在非高并发情况下共享简单的数据。
    • Socket:通过网络传输数据。

    相关文章

      网友评论

          本文标题:Android-多进程

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