[笔记] Activity tips

生命周期

正常情况下的生命周期:

onCreate - onStart - onResume - onPause - onStop - onDestroy
| --------- onRestart --------|

Tips:
onStart 和 onStop 配对,一般标示着Activity是否 可见
onResume 和 onPause 配对,一般标示着Activity是否处于 前台
onPause中的操作尽量轻量,因为只有上一个Activity onPause之后, 新的Activity才能启动。

第一次启动:

onCreate - onStart - onResume

打开新的Activity或切换到桌面:

onPause - onStop
如果新的Activity采用了透明主题,那么当前的Activity不会回调onStop

再次返回到Activity

onRestart - onStart - onResume

back键退出时

onPause - onStop - onDestory

异常情况下的生命周期:

资源相关的配置发生变化导致Activty被杀死重建

系统配置变化导致Activity被杀死时,onPause、onStop和ondestory都会被调用,同时会调用onSaveInstanceState来保存当前状态,调用的时机是在onStop之前,与onPause没有明确的先后关系。当Activity重建时,会在onStart之后调用onRestoreInstanceState,并且把之前onSaveInstanceState时保存的状态以Bundle参数传递给onCreate和onRestoreInstanceState, 我们可以在其中恢复之前保存的状态。
系统会在onSaveInstanceState 和 onRestoreInstanceState 帮我们做很多工作,如文本框的输入内容,listView位置等。

如果系统配置发生变化时,而我们不想重新创建Activity,可以在AndroidManifest中给Activity指定configChanges属性.

常用的configChanges属性:
locale、keyboardHidden、orientation、screenSize等
在SDK大于13时,screenSize会导致屏幕旋转式重建Activity,所以在避免屏幕旋转重构时,需要加上此属性。

内存不足导致Activity被杀死

当内存不足时,系统会从 后台Activity、可见但非前台Activity、前台Activity的优先级顺序去杀死Activity,并通过onSaveInstanceState 和 onRestoreInstanceState保存和恢复。

启动模式

  1. standard:标准模式,每次都会新建一个Activity实例,并进入启动它的那个Activity的任务栈

Tips:
如果是由非Activity类型的context启动一个standard模式的Activity,如 ApplicationContext,由于此时的context是没有任务栈的,所以会报错,解决方法是:给待启动的Activity指定 FLAG_ACTIVITY_NEW_TASK 标记。这样启动时,就会给它新建一个新的任务栈,其实此时实际是以 singleTask模式去启动的。

  1. singleTop: 栈顶复用模式,如果新的Activity已经位于任务栈的栈顶,则不会重新创建,同时 onNewIntent会被调用(不会调用onCreate、onStart)。

  2. singleTask:栈内复用模式,只要Activty在任务栈内存在,则不会重新创建,同时 onNewIntent会被调用(不会调用onCreate、onStart)。此模式默认带有clearTop功能,会把要复用的Activity上面的其他Activity从栈顶出栈。

  3. singleInstance:单实例模式,加强版singleTask,在singleTask特性上,Activity只能单独的在一个任务栈中。当 singleInstance Activity创建时,系统会给它一个单独的任务栈。

什么是任务栈?
任务栈是一个具有栈结构的容器,可以放置多个Activity实例。启动一个应用,系统就会为之创建一个任务栈,来放置根Activity;默认情况下,一个Activity启动另一个Activity时,两个Activity是放置在同一个任务栈中的,后者被压入前者所在的任务栈,当用户按下后退键,后者从任务栈被弹出,前者又显示在幕前,特别是启动其他应用中的Activity时,两个Activity对用户来说就好像是属于同一个应用;任务栈任务栈之间是互相独立的,当我们运行一个应用时,按下Home键回到主屏,启动另一个应用,这个过程中,之前的任务栈被转移到后台,新的任务栈被转移到前台,其根Activity也会显示到幕前,过了一会之后,在此按下Home键回到主屏,再选择之前的应用,之前的任务栈会被转移到前台,系统仍然保留着任务栈内的所有Activity实例,而那个新的任务栈会被转移到后台,如果这时用户再做后退等动作,就是针对该任务栈内部进行操作了。

默认情况下,应用内所有的Activity都是运行在一个与应用包名相同的任务栈下,那要怎么改变Activity的任务栈呢?可以使用TaskAffinity,它可以指定Activity所在的栈。

IntentFilter 匹配规则

Activity启动分为显式和隐式,显式指明确指定要启动的Activity,隐式则通过Intent来匹配目标Activity的IntentFilter,匹配成功才能启动。

IntentFilter中的匹配信息有 action、category、data,一个IntentFilter中的action、category、data可以有多个,只有同时陪陪action、category、data时才算成功。

  1. action 匹配
    Intent必须有一个action存在 且必须和IntentFilter中的其中一个action相同。

  2. category 匹配
    如果有category存在,不管有多少个,都必须要和IntentFilter中的category相同。
    在隐式启动时,系统会默认给一个android.intent.category.DEFAULT的category,所以可以被隐式启动的Activity需要在IntentFilter中加上 android.intent.category.DEFAULT, 否则会匹配不上。

3.data 匹配
data由mimeType和URI组成, mimeType指定媒体类型,如 image/jpeg
URI包含 scheme、host、port、path;URI中只有指定了scheme和host才有效,注意:默认的scheme是 file和content。

Tips: IntentFilter 匹配规则对Service和BroadcastReceiver也是一样的
android.intent.action.MAIN
android.intent.category.LAUNCHER

这两个一起使用表明时应用的入口Activity

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Activity 一、四种形态 运行状态: 当 Activity 处于栈的顶层,可见,并可与用户进行交互 onRe...
    任教主来也阅读 1,737评论 1 10
  • 本篇博客是笔者看过《Android开发艺术探索》才写的,有些是借鉴了此本书的内容,当有些内容进行了精进。 Acti...
    ClAndEllen阅读 3,477评论 1 27
  • 一本android开发程序员必读的一本书,感谢任玉刚大佬的分享 一、Activity的生命周期全面分析 典型情况下...
    kongjn阅读 562评论 1 3
  • 这是我第三遍看《Android开发艺术探索》这本书了,从第一遍看的云里雾里,第二遍略微明白之后,我决定看第三遍,并...
    陈添阅读 884评论 2 8
  • 最小的App 纯粹使用代码(而不需要Storyboard)来创建一个iOS App是可行的。 首先做些操作性的工作...
    1000copy阅读 843评论 0 1