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. Java基础-Java中的堆内存和离堆内存机制

      Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

    2. python---django中url访问方法

      只是了解,不推荐使用,毕竟干扰太多,任意冲突,也没有解耦,应该使用路由分发 在url匹配中支持正则匹配,例如: from django.conf.urls import include, urlfro ...

    3. 使用 maven 搭建web开发基本架构

      我觉得可能,对于还没有使用过 IDEA 进行开发的童鞋来说,直接撸代码是有些尴尬的.那么我会把示例代码之前的那些事再在这里写一遍 按图步骤进行即可进行基本项目结构搭建 现在基本流行 maven 管理项 ...

    4. HTML5 移动开发(移动设备检测及对HTML5的支持)

      1.如何选择要使用的特性以及所面向的浏览器 2.哪些浏览器支持HTML5 3.如何检测是否支持HTML5 4.如何开发贷容错性的Web应用程序 5.CSS3媒体查询如何增强检测脚本   使用HTML5 ...

    5. 第11月第31天 keyboardwillshow CGAffineTransformMakeTranslation

      1. - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (void)registerN ...

    6. 第5月第13天 node cnpm安装 babel

      1. https://nodejs.org/en/download/ http://www.runoob.com/react/react-install.html 2. npm install --s ...

    7. Python网络通信 (一)

      ISO(国际标准化组织)--->网络体系结构标准 OSI模型 OSI 七层模型 应用层 :提供用户服务,具体内容由特定程序规定 表示层 :提供数据的压缩解压和加密等 会话层 :建立程序级的连接, ...

    8. 关于golang的defer的练习

      golang的defer怎么说.大意就是在函数return后.函数关闭前.按照filo的顺序来执行的关键字 上代码: package main import ( "fmt" ) f ...

    9. MySQL灾备恢复在线主从复制变成主主复制及多源复制【转】

      生产主主复制(A<--->B),和灾备主从复制(B--->C).当生产出现问题时,数据写入切换到灾备数据库,待生产恢复后,将灾备回写到生产.步骤如下: 1.灾备与生产其中一台建立主主 ...

    10. win7下PHP+MySQL+CoreSeek中文检索引擎配置

      1.Windows下的coreseek安装测试 (64位win7旗舰版) 官方参考:http://www.coreseek.cn/products-install/install_on_windows ...