Android中 线程进程介绍 多线程多进程 线程通信方式 进程通信方式IPC

进程:是系统进行分配调度的独立程序 ,它的数据变量只属于它自己;

线程:进程中某个单独运行的程序,存在于进程中,一个进程由一个或多个线程组成,且同一进程中的线程能够共享数据;

当一个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中的多线程:

  1. 继承Thread类
  2. 实现Runnable接口
  3. Handler
  4. 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思想,提供服务,接口调用,避免直接去访问对方进程的文件或者数据库,提升设计美感,同时也能提升代码的稳定性

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值