Activity生命周期和启动方式
2016-09-05 11:14:51 0 举报
AI智能生成
Activity生命周期是指一个Activity从创建、启动、运行、暂停、停止到销毁的整个过程。在这个过程中,系统会调用相应的回调方法来处理这些状态变化。Activity的启动方式有两种:显式Intent和隐式Intent。显式Intent是通过明确指定目标Activity的名称来启动,而隐式Intent是通过指定目标Activity需要处理的数据类型或操作来启动。在实际应用中,根据需求选择合适的启动方式可以提高应用的灵活性和扩展性。
作者其他创作
大纲/内容
生命周期
典型情况下的生命周期
综述
onCreate
这是生命周期的第一个方法。加载界面布局资源、初始化Activity所需数据;当高优先级的应用需要内存时,stop状态的activity会被销毁,若返回该actity会调用onCreate
onRestart
当前Activity 从不可见重新变为可见状态时, onRestart 就会被调用(前提是stop状态的activity没有因为内存不足被销毁),紧接着会调用onStart-->onResume。比如用户按Home 键切换到桌面或者打开了一个新的Activity. 接着用户又回到了这个Activity. 就会回调onRestart
onStart:
无法和用户交互。理解为Activity 已经在后台显示出来了,但是用户还看不到。
onResume
Activity 显示到前台。
onPause
方法体执行完,activity才不可见(进入后台);正常情况下,紧接着onStop 就会被调用。在特殊情况下,如果这个时候快速地再回到当前Activity. 那么onResume 会被调用。这种情况属于极端情况,用户操作很难重现这一场景。此时可以做一些存储数据、停止动画等工作,但是注意不能太耗时,因为这会影响到新Activity 的显示. onPause 必须先执行完,新Activity才会执行onCreate--...onResume,。
onStop
可以做一些稍微重量级的回收工作,同样不能太耗时。onStop在下个活动onResume结束后才会调用,故应当尽量把onPause的操作放在onStop ,从而使得新Activity 尽快显示出来并切换到前台。
onDestroy
这是Activity 生命周期中的最后一个回调;回收工作和最终的资源释放。
问题
1这些回调方法具有的特性是在什么时候生效的?如onResume重写的话,是在super执行的前还是后显示界面?还是完整的方法体走完才生效 ?如果有异步方法呢?会出现异步方法没完成回调,activity的回调方法生命周期已经结束的情况吗
onDestroy是activity对象被销毁吗,对象所持有的数据会丢失?
例子
3)当用户再次回到原Activity 时(前提未销毁,否则会重新调用onCreate),回调如下: onRestart -> onStart -> onResume 。
当用户按back 键回迫时,回调如下: onPause -> onStop -> onDestroyo
异常情况下的生命周期
是指Activity 被系统回收或者由于当前设备的Configuration (横竖屏切换)发生改变从而导致Activity 被销毁重建
当系统配置发生改变后或资源内存不足, Activity 会被销毁,其onPause 、onStop 、onDestroy 均会被调用,同时由于Activity 是在异常情况下终止的,系统会调用onSavelnstanceState 来保存当前Activity的状态到一个bundle对象里(包括视图结构,如edittext的焦点和输入内容)。这个方法的调用时机是在onStop 之前,它和onPause 执行顺序不定
接收的位置可以选择onRestorelnstanceState 或者onCreate. 二者的区别是: onRestorelnstanceState 一且被调用,
其参数Bundle savedlnstanceState 一定是有值的,我们不用额外地判断是否为空;官方文挡的建议是采用onRestorelnstanceState 去恢复数据
正常销毁时不会调用onSavelnstanceState
Activity的生命周期
Activity 按照优先级从高到低,可以分为如下三种:
(1)前台Activity一一正在和用户交互的Activity,优先级最高。
(2) 可见但非前台Activity一一·比如Activity 中弹出了一个对话框,导致Activity 可见但是位于后台无法和用户直接交互。
(3)后台Activity-一一已经被暂停的Activity ,比如执行了onStop , 优先级最低 当系统内存不足时,系统就会按照上述优先级去杀死目标Activity 所在的进程(如点开多个app,可见的这个app优先级最高最不可能被先销毁)。
如何取消重新创建activity
不想系统重新创建Activity 可给Activity 指定configChanges 属性
orientation
屏方向发生了改变比如旋转屏幕
locale
设备的本地位置发生丁改变. 一般切换f 系统语育
keyboardHidden
键盘的可访问件发生了改变,比如用户调出了键盘
设了属性后Activity 的确没有重新创建,并且也没有调用onSavelnstanceState和onRestoreInstanceState 来存储和恢复数据,取而代之的是系统调用了Activity 的onConfigurationChanged 方法,我们可以在这方法处理逻辑
启动方式
综述
子主题
四种Mode
standard
系统的默认模式。每次启动一个Activity 都会重新创
建一个新的实例放入任务栈;按下back 键就会有一个Activity 出栈;,当栈中无任何Activity的时候,系统就会回收这个任务战
谁启动了这个Activity ,那么这个Activity 就运行在启动它的那个Activity所在的栈中。一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈。
故ApplicationContext 去启动standard 模式的Activity 的时候会报错,由于非Activity 类型的Context (如Appl icationContext) 并没有任务栈。解决这个问题的方法是为待启动Activity 指定
FLAG-ACTMTY-NEW-TASK 标记位,这样启动的时候就会为它创建一个新的任务栈(singleTask),
singleTop
栈顶复用模式。在这种模式下,如果新Activity 已经位于任务栈的战顶,那么此Activity 不会被重新创建(ABCD--),同时它的onNewlntent 方法会被回调,通过此方法的参数我们可以取出当前请求的信息。2要注意的是,这个Activity 的onCreate 、onStart 不会被系统调用;若非栈顶则同仍会创建新对象
若第一次按返回键那还会到同一个页面吗
singleTask
栈内复用模式,只要Activity在一个栈中存在,那么多次启动此Activity 都不会重新创建实例,和singleTop 一样,系统也会回调其 onNewlntent
任务栈S1:ABC此时Activity D 以singleTask 模式请求启动,其所需任务栈为S2 ,由于S2 和D 的实例均不存在,所以系统会先创建
任务战S2 ,然后再创建D 的实例井将其入战到S2 。
另外一种情况,假设D 所需的任务战为S I,其他情况同上,那么由于S I 已经存在,所以系统会直接创建D 的实例井将其入栈到SI
如果D 所需的任务战为SI ,并且当前任务枝SI 的情况为ADBC ,此时D 不会主新创建,系统会把D 切换到战顶并调用其onNew Intent 方法,同时由于singleTask 默认具有clearTop 的效果,会导致械内所有在D 上面的Activity全部出栈,于是最终Sl 中的情况为AD。
singlelnstance
它除了具有sing1eTask模式的所街特性外,还加强了一点,那就是具有此种模式的Activity 只能单独地位于一个任务战中A为singleInstance,启动A,A会单独在一个任务栈
TaskAffinity
综述
此参数可以指定Activity所需的任务栈名字;,默认情况下为应用的包名。
主要和singleTask 或者allowTaskReparenting 属性配对使用,
0 条评论
下一页