Android要点提炼总结之Activity

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.


发布了31 篇原创文章 · 获赞 6 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章