1、安卓四大组件:
四大组件详解
- Activity生命周期(正常、异常)
- Service
- Bind
- Unbind
- ContentProvider
- BroadcastReceiver
2、Fragment
3、Intent: 意图本身(一个 Intent 对象)是一个被动的数据结构,保存着要执行操作的抽象描述
- 显示启动
- 隐式启动
4、Bundle和Intent:
如果需要传递的数据比较多,还是用Bundle来存储数据比较好。毕竟人家是专门做这个的。还有一个好处就是,如果您在ABC三个页面中传值且顺序必须是ABC,直接传递Bundle的数据就好了。而不用在 B 将数据从Intent拿出来,然后封装到新的Intent,传递到C,多此一举。
5、操作系统------进程和线程:
- 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
- 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
- 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
- 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
- 区别:
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
6、操作系统------进程的通信方式
-
管道:管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区存取数据,管道一端的进程顺序的将数据写入缓冲区,另一端的进程则顺序的读出数据。
- 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道。
- 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);
- 缺点:效率低下,a进程给b进程传输数据,只能等b进程取了数据之后a才能返回。
优点:简单易用,常用于linux命令。能够保证数据一定被其他进程取走
具体:java进程间通信
-
消息队列
- 消息队列是存放在内核中的消息链表,每个消息队列由消息队列标识符表示。
- 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。比FIFO更有优势
- 缺点:如果a进程发送的数据占的内存比较大,并且进程之间通信比较频率,数据大会造成频繁的数据拷贝,这个是非常耗时。
优点:解决了进程等待的问题。
-
共享内存:内存映射文件 **NIO (MappedByteBuffer)**实现
上面我们说使用消息队列进行通信存在频繁的数据拷贝问题,而共享内存则是解决。
- 让两个进程各自拿出一块虚拟地址空间来,然后映射到相同的物理内存中,这样两个进程虽然有着各自独立的虚拟内存空间,但有一部分却是映射到相同的物理内存,这就实现了内存共享了。
- 缺点:多个进程共享一块内存地址,那么就存在竞争问题,就是我们通常说的线程安全问题。
优点:解决消息队列存在的拷贝问题。
具体:java共享内存实现
- 信号量
- 解决多进程的线程安全问题。
- 信号量的本质就是一个计数器,用来实现进程之间的互斥与同步。例如信号量的初始值是 1,然后 a 进程来访问内存1的时候,我们就把信号量的值设为 0,然后进程b 也要来访问内存1的时候,看到信号量的值为 0 就知道已经有进程在访问内存1了,这个时候进程 b 就会访问不了内存1。
- Socket
上面我们说的共享内存、管道、信号量、消息队列,他们都是多个进程在一台主机之间的通信,那么位于不同主机上的进程能够进行通信用socket.