要点提炼|开发艺术之 Activity

本系列专题以提炼要点的方式总结知识点,而不作具体展开,对应的会附上我的较喜欢的文章连接供你们详细了解和学习。第一个板块“开发艺术”是对任老师的《Android开发艺术探索》著做的学习和扩展,此书的目录也是该板块的主线,那么就先从咱们熟悉的Activity开始吧~html

在以前的Activity篇主要学习Activity的生命周期、建立和页面跳转的实现,本篇将深刻了解Activity,学习清单:

  • 生命周期全解析
  • 四种启动模式
  • IntentFilter匹配规则

一.生命周期全解析android

1.Q:典型状况下Activity生命周期网络

A:post

a.onCreate():学习

  • 状态:Activity 正在建立
  • 任务:作初始化工做,如setViewContent界面资源、初始化数据
  • 注意:此方法的传参Bundle为该Activity上次被异常状况销毁时保存的状态信息。

b.onStart():动画

  • 状态:Activity 正在启动,这时Activity 可见但不在前台,没法和用户交互。

c.onResume():3d

  • 状态:Activity 得到焦点,此时Activity 可见且在前台并开始活动。

d.onPause():code

  • 状态: Activity 正在中止
  • 任务:可作 数据存储、中止动画等操做。
  • 注意:Activity切换时,旧Activity的onPause会先执行,而后才会启动新的Activity。

e.onStop():cdn

  • 状态:Activity 即将中止
  • 任务:可作稍微重量级回收工做,如取消网络链接、注销广播接收器等。
  • 注意:新Activity是透明主题时,旧Activity都不会走onStop。

f.onDestroy():xml

  • 状态:Activity 即将销毁
  • 任务:作回收工做、资源释放

g.onRestart():

  • 状态:Activity 从新启动,Activity由后台切换到前台,由不可见到可见。

onStart()和onResume()、onPause()和onStop()的区别: onStart与onStop是从Activity是否可见这个角度调用的,onResume和onPause是从Activity是否显示在前台这个角度来回调的,在实际使用没其余明显区别。

推荐阅读:对Activity生命周期方法的感性理解

2.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()-->onDestroy()

⑧销毁Activity1:

  • onPause()-->onStop()-->onDestroy()

参考文章:实际体验Activity生命周期

3.Q:生命周期的各阶段

A:

a.完整生命周期: Activity在onCreate()和onDestroy()之间所经历的。 在onCreate()中完成各初始化操做,在onDestroy()中释放资源。

b.可见生命周期: Activity在onStart()和onStop()之间所经历的。 活动对于用户是可见的,但仍没法与用户进行交互。

c.前台生命周期: Activity在onResume()和onPause()之间所经历的。 活动可见,且可交互。

4.onSaveInstanceState和onRestoreInstanceState

a.出现时机:异常 状况下Activity 重建,非用户主动去销毁

b.系统异常终止时,调用onSavaInstanceState来保存状态。该方法调用在onStop以前,但和onPause没有时序关系。

onSaveInstanceState与onPause的区别: 前者适用于对临时性状态的保存,然后者适用于对数据的持久化保存。

c.Activity被从新建立时,调用onRestoreInstanceState(该方法在onStart以后),并将onSavaInstanceState保存的Bundle对象做为参数传到onRestoreInstanceState与onCreate方法。

可经过onRestoreInstanceState(Bundle savedInstanceState)和onCreate((Bundle savedInstanceState)来判断Activity是否被重建,并取出数据进行恢复。但须要注意的是,在onCreate取出数据时必定要先判断savedInstanceState是否为空。另外,谷歌更推荐使用onRestoreInstanceState进行数据恢复。

推荐阅读onSaveInstanceState和onRestoreInstanceState详解

5.Activity异常状况下生命周期分析

a.因为资源相关配置发生改变,致使Activity被杀死和从新建立

例如屏幕发生旋转:当竖屏切换到横屏时,会先调用onSaveInstanceState来保存切换时的数据,接着销毁当前的Activity,而后从新建立一个Activity,再调用onRestoreInstanceState恢复数据。

  • onSaveInstanceState-->onPause(不定)-->onStop--> onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume

为了不因为配置改变致使Activity重建,可在AndroidManifest.xml中对应的Activity中设置android:configChanges="orientation|keyboardHidden|screenSize"。此时再次旋转屏幕时,该Activity不会被系统杀死和重建,只会调用onConfigurationChanged。所以,当配置程序须要响应配置改变,指定configChanges属性,重写onConfigurationChanged方法便可。

b.因为系统资源不足,致使优先级低的Activity被回收

①Activity优先级排序:

  • 前台可见Activity>前台可见不可交互Activity(前台Activity弹出Dialog)>后台Activity(用户按下Home键、切换到其余应用)

②当系统内存不足时,会按照Activity优先级从低到高去杀死目标Activity所在的进程。

③若一个进程没有四大组件在执行,那么这个进程将很快被系统杀死。

推荐阅读异常状况下的生命周期分析


二.Activity四种启动模式

1.Q:设置Activity启动模式的方法

A:

a.在AndroidManifest.xml中给对应的Activity设定属性android:launchMode="standard|singleInstance|single Task|singleTop"。

b.经过标记位设定,方法是intent.addFlags(Intent.xxx)

2.Q:Activity的四种LaunchMode

A:

a.standard:标准模式、默认模式

  • 含义:每次启动一个Activity就会建立一个新的实例。
  • 注意:使用ApplicationContext去启动standard模式Activity就会报错。由于standard模式的Activity会默认进入启动它所属的任务栈,可是因为非Activity的Context没有所谓的任务栈。

b.singleTop:栈顶复用模式

  • 含义:若是新Activity已经位于任务栈的栈顶,就不会从新建立,并回调 onNewIntent(intent) 方法。

c.singleTask:栈内复用模式

  • 含义:只要该Activity在一个任务栈中存在,都不会从新建立,并回调onNewIntent(intent) 方法。若是不存在,系统会先寻找是否存在须要的栈,若是不存在该栈,就建立一个任务栈,并把该Activity放进去;若是存在,就会建立到已经存在的栈中。

d.singleInstance:单实例模式

  • 含义: 具备此模式的Activity只能单独位于一个任务栈中,且此任务栈中只有惟一一个实例。

标识Activity任务栈名称的属性:android:taskAffinity,默认为应用包名。

推荐阅读:Activity的四种LaunchMode详解

3.经常使用的可设定Activity启动模式的标记位

FLAG_ACTIVITY_SINGLE_TOP:对应singleTop启动模式。

FLAG_ACTIVITY_NEW_TASK :对应singleTask模式。


三.IntentFilter匹配规则

原则: ①一个intent只有同时匹配某个Activity的intent-filter中的action、category、data才算彻底匹配,才能启动该Activity。 ② 一个Activity能够有多个 intent-filter,一个 intent只要成功匹配任意一组 intent-filter,就能够启动该Activity。

a. action匹配规则:

  • 要求intent中的action 存在且必须和intent-filter中的其中一个 action相同。
  • 区分大小写。

b. category匹配规则:

  • intent中的category能够不存在,这是由于此时系统给该Activity 默认 加上了 < category android:name="android.intent.category.DEAFAULT" /> 属性值。
  • 除上述状况外,有其余category,则要求intent中的category和intent-filter中的全部category 相同。

c. data匹配规则:

  • 若是intent-filter中有定义data,那么Intent中也必须也要定义date。
  • data主要由mimeType(媒体类型)和URI组成。在匹配时经过intent.setDataAndType(Uri data, String type) 方法对date进行设置。
  • 要求和action类似:若是没有指定URI,默认值为content和file; 有多组data规则时,匹配其中一组便可。

采用隐式方式启动Activity时,能够用PackageManager的resolveActivity方法或者Intent的resolveActivity方法判断是否有Activity匹配该隐式Intent。

推荐阅读:Intent和IntentFilter


但愿这篇文章对你有帮助~

相关文章
相关标签/搜索