Android-多进程初识

学习自

《Android开发艺术探索》

https://baike.baidu.com/item/%E8%BF%9B%E7%A8%8B/382503?fr=aladdin#1

https://blog.csdn.net/cmyperson/article/details/56278433

进程与线程

IPC(Inter-Process Communication)指的是进程间通信,指的是两个进程之间交换数据的过程。在学习IPC之前我们得先了解一下什么是进程,什么是线程。

进程是应用程序的实例,是操作系统进行资源分配和调度的最小单元,每个进程都代表着应用的一个实例

线程是程序执行的最小单元,线程本身是不占有资源的(除了维持本身的资源除外),线程与进程贡献资源。

一个进程最少包括一个线程(UI线程),但是如果在UI线程中执行大量耗时的操作的话,那么就会造成UI无响应。当然这是不可取的。

采用多进程的好处

虽然使用了多进程以后在数据通信方面变的比较繁杂并且可能会遇到各种各样的问题,但是多进程也有自己的好处。众所周知Android的每个应用程序可以调用的内存是有限制的,但是如果分配的内存不够我们的应用程序的话,那么我们就可以通过多进程的方式来获取更多的内存资源。

还有如果我们的应用程序如果需要一些独立的模块的话,也需要采用多进程。

Dalvik 虚拟机

Android系统为每个进程都单独的分配了一个 Dalvik 不同的虚拟机在内存有不同的内存空间。在不同的进程之间访问相同的类的对象,会创建不同的 副本 。这些副本之间相互独立,互不干涉。这也是为何如果我们想在多进程的模式在两个不同的进程之间通过内存来共享数据,显然是不会成功的。如果想要在进程间通信就必须要用到IPC技术。

开启多进程

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="top.littledavid.studyipc"> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
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="top.littledavid.studyipc.remote" />
</application> </manifest>

四大组件都可以运行在不同的进程中,通过 process 属性在 manifest 文件中为四大组件指定进程即可。

调用Activity

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
this.startActivity(android.content.Intent(this, SecondActivity::class.java))
}
}
class SecondActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
startActivity(Intent(this, ThirdActivity::class.java))
}
}

在上面的三个Activity中MainActivity没有指定进程,那么MainActivity采用的就是默认进程,默认进程的命名就是程序的 包名 ,如果想要修改默认进程,请给 Application 节点通过 process 属性指定进程。 SecondActivity的进程是 top.littledavid.studyipc:remote ,ThirdActivity的进程是 top.littledavid.studyipc.remote ,当在运行不同的Activity的时候就会创建不同的进程。通过ADB命名或者DDMS都可以查看已经处于运行状态的进程。

adb shell ps ##查看所有进程
### 下面的进程是我们程序的进程
u0_a84 4022 1377 1416356 49952 SyS_epoll_ 00000000 S top.littledavid.studyipc
u0_a84 4039 1377 1415804 49424 SyS_epoll_ 00000000 S top.littledavid.studyipc:remote
u0_a84 4056 1377 1418396 50172 SyS_epoll_ 00000000 S top.littledavid.studyipc.remote

上面就是我们开启的进程。其中 top.littledavid.studyipc 是我们的默认进程,而其余的两个则使我们新创建的进程。其中除了默认的进程之外,剩下的两个进程在声明的时候也不相同,一个是 :remote 一个是 <包名>.remote 。其中 : 有两个作用

  1. 最明显的一个: 省略包名,是一种简写的方式

    Android-多进程初识的更多相关文章

    1. Android 多进程编程 15问15答!

      ps:阅读本文 需要对android 多进程编程有一定了解. 1.Android中总共有几种方式进行IPC? 答:一共有两种,一种是binder 还有一种是socket.Binder 大家用的比较多. ...

    2. android 多进程 Binder AIDL Service

      本文參考http://blog.csdn.net/saintswordsman/article/details/5130947 android的多进程是通过Binder来实现的,一个类,继承了Bind ...

    3. 【转】Android多进程总结一:生成多进程(android:process属性)

      前言 正常情况下,一个apk启动后只会运行在一个进程中,其进程名为apk的包名,所有的组件都会在这个进程中运行,以下为DDMS的进程截屏: com.biyou.multiprocess为进程名,也是a ...

    4. Android开发——Android多进程以及使用场景介绍

      个层级,具体可以查看Android开发--Android进程保活招式大全中1.1部分的内容,这里就不赘述了. 根据进程中当前活动组件的重要程度,Android 会将进程评定为它可能达到的最高级别.例如 ...

    5. android 多进程

      韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha android应用中 可以通过 清单文件的属性配置,创建出一个新进程. 多进程的好处,当 ...

    6. 小议Android多进程以致Application多次初始化

      最近遇到一个bug,当应用加了多进程后,比如总共进程数为N,会出现在`startService()`时`onStartCommand()`方法会被重复调用`(N-1)`次的奇怪现象. ***## 祸起 ...

    7. android开发------初识Activity

      之前我们简单说过,Activity实际上是一个窗体,用来存放我们的程序外观. 我们先来创建一个空的Activity,不加载任何layout.要做的是,定义自己的类,继承android的Activity ...

    8. 利用Android多进程机制来分割组件

      android对于内存有一定的限制,很多手机上对内存的限制是完全不同的.我们的应用程序其实就是一个进程,这个进程是完全独立的,这个进程分配的内存是一定的,所以我们经常会遇到OOM的问题.但,你可能不知 ...

    9. Android多进程需要注意的一个地方

      可能很多项目都会有一个自定义的Application,做一些初始化操作以及全局化的一些数据保存,这时如果程序中定义了远程服务(android:process=":remote"), ...

    10. android之初识Intent

      首先修改values\strings.xml文件 代码如下: <resources> <string name="app_name">mytab</s ...

    随机推荐

    1. linux中eth0原何变成了eth1

      Linux的网卡由eth0变成了eth1,如何修复使用wmware安装了linux,安装成功后,使用的网卡是eth0,没有eth1.但是用过一段时间后,不知道为什么eth0无法使用,系统却自动生成了e ...

    2. Centos7.4+openvpn-2.4.4+easy-rsa-3.0物理机安装教程

      完整CentOS搭建OpenVPN服务环境图文教程 大福技术 关注 2016.02.17 09:28* 字数 3017 阅读 34000评论 18喜欢 21赞赏 3 对于OpenVPN环境有什么用途老 ...

    3. 获取SQL Server数据库中的表和字段描述

      获取所有dbo表的扩展属性: SELECT * FROM fn_listextendedproperty (NULL, 'schema', 'dbo', 'table', default, NULL, ...

    4. Sortable.js

      拖拽的时候主要由这几个事件完成, ondragstart 事件:当拖拽元素开始被拖拽的时候触发的事件,此事件作用在被拖曳元素上 ondragenter 事件:当拖曳元素进入目标元素的时候触发的事件,此 ...

    5. 正则匹配URL地址

      import re u = "http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]) ...

    6. Oracle 数据库和监听器开机自启动两种实现方法

      数据库和监听器开机自启动   编辑oratab文件: 修改:orcl:/u01/app/oracle/product/11.2.0/db_1:N            orcl:/u01/app/or ...

    7. 解决windows10 里vs2017 直接开始执行提示“此任务要求应用程序有提升的权限”1.

      1.打开vs的安装路径,我的是 C:\Program Files (x86)\Common Files\Microsoft Shared\MSEnv\ ,找到  VSLauncher.exe 右击该文 ...

    8. 【坐在马桶上看算法】算法6:只有五行的Floyd最短路算法

              暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程.         上图中有 ...

    9. apache本地配置多域名(wampserver本地配置多域名)

      我们在本地开发时,一般是在浏览器输入 http://localhost/项目文件夹名来测试网页文件,你有没有想过在本地在浏览器输入你自己设定的一个域名进入项目文件夹中去,本地配置多域名可以测试二级域名 ...

    10. 集合类List、Set、Map的区别、联系和遍历方式

      说集合之前,先说说数组和集合: 1.数组长度是固定的,当超过容量后会在内存中重新创建一个原来数组1.5倍长度的新数组,再把元素存进去:数组既可以存储基本数据类型,又可以存储引用数据类型. 2.集合长度 ...