这是个需要细心处理的坑.

1 内存:

在manifest中可以对各个组件声明其所在的进程:

android:process=":name"

然后对应的Acitivity, Receiver, Service就会运行在相应的进程中.

但是有些类会在所有进程中运行, 比如一些Utils工具类, 比如Application类.

当遇到多个进程并行的时候, 厘清进程所对应的代码, 避免在进程A里跑了进程B的代码.

比如有一个工具类Utils_procA. 只需要在进程A中工作, 那对于进程B来说, 这个Utils_procA就没有作用, 是冗余的代码, 如果在B中初始化了Utils_procA, 那就消耗了cpu, 也占用了内存.


2 交互:

同一个app里, 有多个不同的进程, 通信是必须的.

进程之间可选的通信机制有很多:Aidl, broadcast, 这两个是android提供的, 比较好理解的通信机制.

使用broadcast, 要小心防范ANR, 避免在onReceive()里处理耗时逻辑.

使用Aidl, 要注意一些时序问题, bind Service需要时间. 这个时间不确定长短, 如果bind时服务进程还没有启动, 那最长需要等待服务进程启动完成. 所以bind后可能不能立刻使用aidl, 需要等待ServiceConnection.onServiceConnected()回调成功.

如果有立刻执行服务接口的需求, 要么回调, 要么另做一个线程, 轮循判断是否连接ok. 切切不可在主线程等待. 也会anr.


关于进程的基础概念不再赘述

首先讨论如果一个程序内存在多个进程时创建顺序

看如下代码

[java] view plaincopy

public class MyApplication extends Application{

public static int test = 0;
@Override
public void onCreate() {
super.onCreate();
Log.i("ydp", "MyApplication onCreate pid:"+Process.myPid());
startService(new Intent(this, ServiceA.class));
startService(new Intent(this, ServiceB.class));
}

}

MyApplication会在程序首次载入时运行onCreate方法,里面我开启了两个Service,

ServiceA在配置文件里标明了使用单独进程

[html] view plaincopy

<service android:name=".ServiceA" android:process=":service"></service>


大家是不是觉得步骤是这样,

MyApplication onCreate--->ServiceA onStart 并创建新进程 ---->ServiceB onStart 保持原进程

现实比想像严峻的多啊,先看看LOG输出

[html] view plaincopy

MyApplication onCreate pid:26660
MyApplication onCreate pid:26673
Service A onStart pid:26673
Service A onStart pid:26673
Service B onStart pid:26660
Service B onStart pid:26660


不难看出,实际实际情况是首先创建一个PID为26660的Application,在遇到startServiceA时,由于ServiceA采用了新的进程,则先要初始化该进程,所以又创建了一个PID为26673的Application实例,新进程实例出来,26660进程的startServiceA才得以继续,由于此时已经存在两个进程,两个独立的虚拟机,所以我们看到26673进程也执行了startServiceA,此时由于新进程已存在,所以不再重新创建,最后两个进程有互不干扰的执行了startServiceB


事实是android在遇到需要放在新进程的组件时,首先创建此进程,此时当前进程的当前线程是阻塞的,直到新进程创建。


所以当我们要启动单独进程组件时需要注意,进程的创建会影响继承了Application的实例,里面的方法会完全再执行一遍,很多认喜欢把大量初始化工作放在里面,尽管进程由于处于不同虚拟机,里面的所有内存私有,但一些影响文件、UI等无进程概念的问题会出现。

更多相关文章

  1. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  2. Android下的Service的基本用法
  3. 游走Android系列之Service
  4. Android(安卓)SDK 安装(升级)失败(A folder failed to be rename
  5. 查询方法android的CursorLoader用法小结
  6. Android初级教程理论知识(第六章广播接受者)
  7. 详解Android进程保活的方法
  8. Android调用安卓自带摄像头API开启双摄
  9. Android应用程序UI硬件加速渲染环境初始化过程分析

随机推荐

  1. 海创软件组--20200712--Butterknife与自
  2. Android(安卓)Resource介绍和使用(二)
  3. Android(安卓)L Preview 源码同步方法
  4. Android获得时间总结
  5. Android——编译release版签名系统
  6. android中加载assets中的资源文件
  7. 安卓开发10:常用控件-常用表单级别控件
  8. Android(安卓)[Camera 源码] 外接 USB 摄
  9. Android常用命令总结
  10. Android之有序广播