1、Android的系统架构
Android架构分为5类,分别是应用层、框架层、系统运行库、硬件抽象层、Linux层
- 应用层:非系统级别的应用程序
- 框架层:给开发人员提供可以开发应用程序的API (如ActivityManager、PackageManager)
- 系统运行库:两部分组成,其一是C、C++运行库(Android中系统组件所调用),Android运行库(核心库和ART),其中ART是5.0系统以后,与Dalivak相比,应用程序在第一次安装的时候,就将字节码预编译为机器码,大大提高了运行效率
- 硬件抽象层:目的在于硬件抽象化,保护硬件厂商的知识产权
- Linux层:Android的核心服务在Linux内核,例如Binder IPC,USB等等,在这个基础上还添加了部分Android专用的驱动。
2、讲到上面的Binder IPC时候,那么就看看Binder IPC是个啥玩意儿。。
对,很对。这玩意就是Android中的进程之间通信的核心点,Android的源码也大部分都使用了Ibinder机制。
我们知道Android的核心服务是在Linux内核,而Linux里面为了达到进程间的通信,可以采用管道、Socket等技术手段,为什么Android选用Binder这种新型的IPC技术,放弃了原有成熟的技术呢?
主要有两个方面:
1、性能更加高效。传统的技术手段在数据拷贝的时候,要么拷贝两次,要么实现的难度又比较大
2、安全性更好,Socket手动输入IP,很容易被伪造,而Binder从协议本身就做身份验证
由上面的图,我们看出来,Client和Server之间的内核空间是可以共享的,所以Binder IPC机制就是利用这种方式来完成底层通信。
Android启动过程中,Android会初始化系统的各种Serviece,并将这些Service向ServiceManager注册。client想要获得具体的service,就可以直接向ServiceManager要就可以了。ServiceManager通过客户端过来的这个引用在向具体的服务端发送请求,服务端执行完成后返回
3、Activity生命周期的解析
onCreate()
- Activity正在创建,初始化工作,传参数Bundle为该Activity上次被异常情况销毁时保存的信息
onStart()
- Activity正在启动,可见,没有焦点
onResume()
- Activity获取到焦点,可见并开始活动
onPause()
- Activity正在停止,这里可以做一些数据保存、停止动画的工作
- 注意:Activity切换时,旧Activity的onPause先执行,然后才会启动新的Activity
onStop()
- Activity即将停止,可以做一些回收工作,如取消网络连接,注销广播等
- 注意:新Activity是透明的,就Activity不会走onStop。这是因为它依然与windowManager保持连接,系统继续维持它的内部状态。所以仍然可见,但是失去焦点不可交互
onDestroy()
- Activity即将销毁,做一些回收工作,资源释放
onReStart()
- Activity重新启动,由后台切换到前台,由不可见到可见
4、Activity生命周期的切换过程
启动一个Activity
- onCreate()–>onStart()–>onResume()
打开一个新的Activity
- 旧Activity的onPause()–新Activity的onCreate()–>onStart()–>onResume()–>旧Activity的onStop()
返回到旧的Activity
- 新Activity的onPause()–>旧Activity的onRestart()–>onStart()–>onResume()–>新Activity的onStop()–>onDestory()
Activity1弹出对话框Activity2
- Activity1的onPause()–>Activity2的onCreate()–>onStart()–>onResume()
关闭屏幕按Home键
- Activity2的onPause()–>onStop()–>Activity1的onStop()
点亮屏幕/回到前台
- Activity2的onRestart()–>onStart()–>Activity1的onRestart()–>onStart()–>Activity2的onResume()
关闭对话框Activity2
- Activity2的onPause()–>Activity1的onResume()—>Activity2的onStop()–>onDestory()
销毁Activity1
- onPause()–>onStop()–>onDestroy()
5、Activity生命周期分析
上面的图片已经说的非常明显了,就不在叙述了。
下面来看看onSaveInstanceState和onRestoreInstanceState的区别
首先,当异常情况出现的时候,Activity会重建,非用户主动去销毁。异常终止的时候,调用onSaveInstanceState来保存状态。这个方法调用在onStop之前,但是和onPause没有时序关系。
注意:onSaveInstanceState与onPause的区别:前者适用于对临时性状态的保存,后者适用对数据的持久化保存
当Activity被重新创建的时候,调用onRestoreInstanceState(该方法在onStart之后),并将onSaveInstance保存的bundle对象作为参数传到onRestoreInstanceState与onCreate方法。
注意:可通过onRestoreInstanceState(Bundle savedInstanceState)和onCreate((Bundle savedInstanceState)来判断Activity是否被重建,并取出数据进行恢复。但需要注意的是,在onCreate取出数据时一定要先判断savedInstanceState是否为空。另外,谷歌更推荐使用onRestoreInstanceState进行数据恢复。
6、Activity异常情况下的生命周期分析
Activity被杀死或者重建的原因分析
1、系统资源不足,导致优先级低的Activity被回收
这种情况不是很好模拟,大概把优先级的情况模拟一下。
- 前台Activity—正在和用户交互的Activity,优先级是最高的
- 可见但是非前台Activity–比如Activity中弹出了一个谈话框,导致Activity可见。但是位于后台无法交互
- 服务进程,除了符合前面的两种情况的Service,其他的Service都被归纳为服务进程
- 后台Activity–已经被暂停的Activity,比如执行了onStop,优先级回收最长时间没有使用过的进程
- 空进程不持有任何组件的情况,保持这种状态的目的是为了缓存,便于下一次启动能够得到更快的响应
注意:
1、如果一个进程为另外一个进程提供服务,那么这个进程的优先级就不会低于享受服务的进程
2、系统内存不足的时候,就会按照上面的顺序去杀死进程,并且后续会通过onSaveInstaceState()和onRestoreInstance来存储和恢复数据。
3、由于服务进程比后台进程要高一点,所以我们可以把后台的工作放在Service中去,保证一定的优先级
2、资源相关配置发生改变
默认情况下,如果我们队Activity不做特殊的处理,那么当系统配置发生改变的时候,Activity就会被销毁,并重新创建。
当系统配置发生改变的时候,Activity会被销毁。其中onPause、onStop、onDestory均会被调用。同时终止的时候,会调用onSaveInstanceState来保存Activity的状态。
例如:屏幕发生旋转的时候,会先调用onSaveInstanceState来保存切换时的数据,接着销毁Activity。然后重新创建一个Activity。在调用onRestoreInstanceState恢复数据
为了避免由于配置文件导致Activity重建,可在AndroidManifest.xml中对应的Activity设置
android:configChanges=”orientation|keyboardHidden|screenSize”。
此时在旋转的时候,Activity不会被杀死。只会调用onConfigChanged.此时重写onConfigChanged方法即可
7、如何让一个Activity变成一个窗口
在AndroidManifest.xml中设置Activity的主题
<!-- 使得Activity对话框的形式弹出来 -->
android :theme="@android:style/Theme.Dialog"
<!-- 变成半透明 -->
android:theme="@android:style/Theme.Translucent"
android:theme="@android:style/Theme.Translucent"
8、Activity四种启动模式
1、设置Activity启动模式的方法
//1、在AndroidManifest.xml中对应的Activity设定属性laucnMode
android:launchMode="standard|singleInstance|single Task|single Top"。
//2、通过标记为设定(addFlags)
intent.addFlags(Intent.XXX)
2、Activity的四种LaunchMode
- standard:标准模式、默认模式
(每次启动都会创建一个新的实例) - singleTop:栈顶复用模式
(如果新的Activity已经位于栈顶就不会重新创建,并回调onNewIntent(intent)方法) - singTask:栈内复用模式
(只要该Activity在一个任务栈存在,都不会重新创建,并回调onNewIntent(Intent)方法。如果不存在,系统会先寻找是否存在需要的栈,不存在就先创建这个栈,然后把Activity放进去。如果存在,就会创建到已经存在的栈中) - singleInstance:单实例模式
此模式的Activity只能单独位于一个任务栈中,且任务栈中只有唯一一个实例
标识Activity任务栈名称的属性:android:taskAffinity,默认为应用包名
3、IntentFilter匹配规则
原则:一个intent只有同时匹配某个Activity的intent-filter中的action、category、data算完全匹配;才能启动Activity
一个Activity可以有多个intent-filiter,一个intent只有成功匹配任意一组intent-filiter,就可以启动该Activity.