进程:是系统进行分配调度的独立程序 ,它的数据变量只属于它自己;
线程:进程中某个单独运行的程序,存在于进程中,一个进程由一个或多个线程组成,且同一进程中的线程能够共享数据;
当一个Android程序组件(四大组件)启动的时候,如果这个程序的其他组件没有启动,那么默认同一应用程序下的组件都运行在相同的进程(android:process可指定进程)和相同的线程(被称为"主线程",也可以通过开线程的方式去开worker线程,但是worker线程不能直接操作更新UI,只能在主线程中操作);
进程体现在Android中就是:一个程序或一个应用,如果是多进程(IPC)的话,就表示这个应用指定了多个进程process;
android四大组件都支持在配置清单文件中设置 android:process 属性,让这个应用在指定的进程中运行,但是如果当系统内存不够,会根据进程重要性从低往高依次kill,直到内存够用;
进程分五类:前台,可见,服务,后台,空进程
可见进程 :包含了处于OnPause的Activity;(无焦点但依旧可见,比如一个dialog弹在一个activity前面,这个activity就是onPause)
服务进程:一般是service类的进程(比如在后台播放音乐或者下载网络数据)
后台进程:包含了很多处于OnStop的Activity的进程(activity已经不可见,按下home)
空进程:最容易被杀死的进程;
Android中的多线程:
- 继承Thread类
- 实现Runnable接口
- Handler
- AsyncTask
线程的通信四种方式(子线程和UI线程间):
1.Handler
2.AsyncTask
3.通过View或者子View的post(runnable)方法,会重新刷新一下view
4.runOnUiThread
5.THreadPoolExecutor 线程池
6.IntentService
进程通信方式:
区分一下Linux的进程间通信的方式:管道,Binder,socket,共享内存;
1.Intent(显示一般用于同一程序,隐式一般都是跨进程)
intent/Bundle支持传递类型:
1.八大基本数据类型
2.String、Character引用类型
3.实现了Serializable和Parcelable接口的对象
action指动作,可以多个,但跳转的activity中的infiter一定要包含这个action;
category(0个或多个):比如指定默认登录主界面:CATEGORY_LAUNCHER;
data(只有一个)的scheme指的是前缀http等;
host指的是主机名google.com等
port指url端口号
2.Content Provider
3.广播
4.AIDL
首先AIDL支持的类型有(没有Serializable对象):
八大基本类型;
String,Character,List,Map;
实现了Parcelable接口的对象;
步骤:
1.创建一个服务端(在OnBind方法中返回一个IBinder对象,这个对象是是通过AIDL接口名.Stub来得到的)
2.创建一个客户端;(在服务端调用OnBind方法后,客户端就可以和服务端连接了;怎么连?实现ServiceConnection类,里面也要用到AIDL接口名来获取各种服务端传过来的值(即把Binder对象转为ADIL接口))
3.创建AIDL接口文件(直接新建一个普通文件(New->File),取名为 ABXXXService.aidl的aidl后缀文件)
首先,先创建一个service子类
客户端:
AIDL文件:
Android多进程优点:
分担主进程内存压力;
Android 多进程缺点:
每一个进程,都有自己的一个方法区,其中的静态变量都是相互独立的,因此静态变量不同进程间是不能共享的,保持两份。
多虚拟机潜在的问题
由于每个进程创建以后,都会拥有独立的空间,独立的VM,所以,很多Java特性都会在多进程开发中失效。
1.静态变量和单例模式完全失效
因为进程间,内存空间是相互独立的,所以VM方法区内的静态变量也都是相互独立的。因为单利模式是基于静态变量的,所以单例也会失效。在两个不同进程访问一个相同类的静态变量,所得的值未必相同,所以在开发中请避免此类代码。
2.线程同步机制完全失效
由于Java的同步机制是VM来进行调度的,两个进程拥有两个不同的VM,所以,同步也会在多进程开发中失效。synchronized关键字、voliate关键字等都是基于VM级别的同步,所以请不要跨进程去使用线程同步。比如主进程有个生产者,子进程的消费者是无法正常使用消费功能的,只能通过跨进程通信,让主进程的消费者去消费,然后再回调。
3.Application会多次创建
每个新进程在创建的时候,都会新建一个Application,所以多进程还会面临着Application多次创建的问题,onCreate
方法会多次被调用。解决的办法其实也不是很麻烦,因为Application会多次创建,所以我们可以根据进程名来区分不同的进程,进行不同的初始化,同时,不要在Application中设置过多的静态变量,导致内存增加。
【Android】Android工程含有多个进程时,Application中onCreate执行多次解决方案_ScriptGirl的博客-CSDN博客_application oncreate多次
4.文件读写潜在的问题
这里的文件指的泛指所有需要并发访问的文件,例如:本地文件,数据库文件,sharepreference等。由于Java中,文件锁、队列机制都是VM级别的,所以不同进程访问同一个文件锁是不管用的。(通过C++可以实现多进程文件锁机制,不过不在文本讨论范围内。)所以在实际开发过程中,还是避免多进程同时访问统一文件,多利用Android中IPC的C/S思想,提供服务,接口调用,避免直接去访问对方进程的文件或者数据库,提升设计美感,同时也能提升代码的稳定性。