Android中的进程与线程

基本知识:

如果某个应用程序组件是第一次被启动,且这时应用程序也没有其他组件在运行,则Android系统会为应用程序创建一个包含单个线程的linux进程。默认情况下,同一个应用程序的所有组件都运行在同一个进程和线程里(叫做“main”主线程)。如果组件启动时,已经存在应用程序的进程了(因为应用程序的其它组件已经在运行了),则此组件会在已有的进程和线程中启动运行。不过,可以指定组件运行在其他进程里,也可以为任何进程创建额外的线程

什么是进程?

  • 一个正在进行中的程序。
    进程是分配资源的最小单位。

什么是线程?

  • 在一个进程中执行的一套功能流程,称为线程
  • 在一个进程中执行的多套功能流程,称为多线程
    线程是CPU调度运行中最小单位
    在这里插入图片描述

进程的分类(根据进程的重要性, 从高到低)和生命周期

1.前台进程

用户当前操作所必须的进程。满足以下任一条件时,进程被视作处于前台:

  • 其中运行着正与用户交互的Activity(Activity对象的 onResume() 方法已被调用)。
  • 其中运行着被正与用户交互的activity绑定的服务Service。
  • 其中运行着“前台”服务Service——服务以startForeground()方式被调用。
  • 其中运行着正在执行生命周期回调方法(onCreate()、onStart()或onDestroy())的服务Service。
  • 其中运行着正在执行onReceive()方法的BroadcastReceiver。

绝大情况下不会终止此类进程, 当内存不足以维持它们同时运行时——才会被终止

2.可见进程

没有前台组件、但仍会影响用户在屏幕上所见内容的进程

  • 其中运行着不在前台的Activity,但用户仍然可见到此activity(onPause()方法被调用了)

  • 其中运行着被可见(或前台)activity绑定的服务Service。

    可见进程被认为是非常重要的进程,除非无法维持所有前台进程同时运行了,它们是不会被终止的。

3.服务进程

此进程运行着由startService()方法启动的服务
除非内存不足以维持所有前台、可见进程同时运行,系统会保持服务进程的运行。

4.后台进程

包含目前用户不可见activity(Activity对象的onStop()方法已被调用)的进程
这些进程对用户体验没有直接的影响,系统可能在任意时间终止它们,以回收内存供前台进程、可见进程及服务进程使用

5. 空进程

不含任何活动应用程序组件的进程
保留这种进程的唯一目的就是用作缓存,以改善下次在此进程中运行组件的启动时间。
为了在进程缓存和内核缓存间平衡系统整体资源,系统经常会终止这种进程

关于线程

  • 应用程序启动时,系统会为它创建一个名为“main”的主线程, 也称为"UI Thread"
  • UI Thread特点重要, 组件的回调方法, 事件的分发和回调, UI的更新都是在线程执行的
  • 一些长时间的工作(如联网)不能在UI Thread中执行, 只能在分线程(worker Thread)中执行

Android 进程间数据共享

  • BroadcastReceiver 广播
    优点:简单易用实时通信
    缺点:只支持数据单向传递,效率低且安全性不高
    场景: 一对多的低频率单向通信

  • ContentProvider 内容提供者
    优点:支持一对多的实时并发通信,在数据源共享方面功能强大,可通过Call方法扩展其它操作
    缺点:可以理解为受约束的AIDL,主要提供对数据源的CRUD操作
    场景: 一对多的进程间数据共享

  • AIDL
    优点:功能强大,支持一对多实时并发通信
    缺点:使用稍复杂,需要处理好线程间的关系
    场景: 一对多通信且有RPC需求

  • 文件共享
    优点:简单易用
    缺点:不适用高并发场景,并且无法做到进程间即时通信
    场景:适用于无并发的情况下,交换简单的数据,对实时性要求不高的场景。

  • Bundle
    优点:简单易用
    缺点:只能传输Bundle支持的数据类型
    场景: 四大组件间进程通信

  • Socket
    优点:功能强大,可通过网络传输字节流,支持一对多实时并发通信
    缺点:传输效率低,开销大,实现细节步骤稍繁琐,不支持直接的RPC
    场景: 网络间的数据交换

  • Messenger
    优点:功能一般,支持一对多串行通信,支持实时通信
    缺点:不能很好地处理高并发的情形,不支持RPC,由于数据通过Message传输,因此只能传输Bundle支持的数据类型
    场景: 低并发的一对多实时通信,无RPC需求,或者无需要返回结果的RPC需求

Bundle传输数据类型

Bundle主要用于传递数据;它保存的数据,是以key-value(键值对)的形式存在的。

使用Bundle在Activity之间传递数据,传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组,也可以是对象或对象数组。

当Bundle传递的是对象或对象数组时,必须实现Serializable或Parcelable接口。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值