生命周期
正常情况下的生命周期:
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保存和恢复。
启动模式
- standard:标准模式,每次都会新建一个Activity实例,并进入启动它的那个Activity的任务栈
Tips:
如果是由非Activity类型的context启动一个standard模式的Activity,如 ApplicationContext,由于此时的context是没有任务栈的,所以会报错,解决方法是:给待启动的Activity指定 FLAG_ACTIVITY_NEW_TASK 标记。这样启动时,就会给它新建一个新的任务栈,其实此时实际是以 singleTask模式去启动的。
-
singleTop: 栈顶复用模式,如果新的Activity已经位于任务栈的栈顶,则不会重新创建,同时 onNewIntent会被调用(不会调用onCreate、onStart)。
-
singleTask:栈内复用模式,只要Activty在任务栈内存在,则不会重新创建,同时 onNewIntent会被调用(不会调用onCreate、onStart)。此模式默认带有clearTop功能,会把要复用的Activity上面的其他Activity从栈顶出栈。
-
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时才算成功。
-
action 匹配
Intent必须有一个action存在 且必须和IntentFilter中的其中一个action相同。 -
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
网友评论