Android - Acitivty生命周期 理解
来源:互联网 发布:南京江宁教育网络问政 编辑:程序博客网 时间:2024/05/23 14:33
1、Activity的四种状态
理解Activity的生命周期之前,先理解对android的生命周期的特点进行整理,从而归纳出的Activity的四种活动状态。
那么,通常来说,一个Activity的整个生命周期内,会经历如下的几种状态:
- 运行状态:
* 当一个Activity位于返回栈栈顶的时候,既是处于这种状态之下。
PS:系统最不愿意回收处于运行状态下的Activity,因为这回给用户造成很糟糕的体验
- 暂停状态:
* 当一个Activity不再位于栈顶,但却又处于“用户可见”的状态下的时候,既是位于暂停状态。
通常我们理解,一个Activity被另一个Activity“压栈”,而离开栈顶,既是有一个新的“界面视图”进入。
那么什么时候一个Activity会出现不再位于栈顶,却又被用户可见的情况呢?
Android中,并不是所有的活动都会占满整个屏幕,例如新压入栈顶的Activity是一个对话框形式的活动时,前一个Activity则会进入到这种所谓的暂停状态。
暂停状态下的Activity无法响应用户的操作,但仍然是被用户可见的,所以系统仍然不愿意去回收此状态下的Activity。
- 停止状态:
* 当一个Activity不再位于栈顶,并且不再被“用户可见”的时候,就进入到了停止状态。
PS:处于停止状态的活动最大的特点是:系统仍然为其保存相应的状态和成员变量,但这并不是绝对可靠的。
这是因为位于该种状态下的Activity,在一些其他优先级更高的程序需要内存的时候,系统会选择回收释放掉该状态下的Activity,以提供足够的内存。
所以,如果在你的某个Activity中,如果有一些该活动重新回到栈顶时,需要“重现”的数据的话,
为了避免这种状态下的意外发生,可以选择在onSaveInstanceState()方法中保存信息,在下次活动恢复的时候从onCreate()方法中进行恢复,避免数据丢失。
- 销毁状态:
* 当一个活动从返回栈中被移除时,就处于销毁状态了。系统最倾向于回收这种活动,以保存手机内存的充足。
2、Activity的7种生命周期方法的理解
前面说到了所谓的四种活动状态,其实就是根据Android的生命周期的各个阶段的特点归纳出来的,所以我们自然也应该理解这7种生命周期的特点,它们分别是:
- onCreate()
* 在一个活动初次被创建时调用.
* 通常应该在这个方法里完成活动的初始化事件,如:加载布局,初始化控件,绑定事件等等..
- onStart()
* 在活动由不可见变为可见时调用.
- onResume()
* 当一个活动准备好和用户进行交互时进行调用。此时的活动一定位于返回栈的顶端,处于运行状态。
- onPause()
* 在系统准备去启动或恢复另一个活动的时候调用。
* 通常在这个方法内将一些消耗CPU的资源释放,以及保存一些关键数据。
* 但该方法内的内容执行速度一定要快,也就是说不要在此方法内做耗时操作,否则会影响新的栈顶活动的使用。
- onStop()
* 在活动完全不可见的时候调用。
* 和onPause的调用特点类似,但最大的不同在于,例如:
从当前活动启动的是一个对话框形式的Activity,onPause会得到调用,而onStop不会调用。
- onRestart()
* 这个方法在活动由停止状态变为运行状态之前调用,也就是重新启动。
- onDestroy()
* 在活动即将被销毁之前调用,调用完毕后该活动进入销毁状态。
3、Activity生命周期图
为了更好的对Android中一个Activity在实际运行过程中,生命周期阶段变化的理解,我们结合官方的说明图加深印象。
从这张图中,我们可以归纳得到以下几种情况:
1、当一个Activity初次被创建时,会经过onCreate → onStart → onResume,此时该活动便已经压入栈顶,进入到了运行状态。
2、此时如果有另一个Activity来到前台,可分为我们上面说到的两种情况:
- 新进入前台的是“对话框式”的Activity,此时onPause方法被调用,活动进入到暂停状态。而当活动再次返回时,直接调用onResume方法后恢复到运行状态。
- 新进入前台的是普通的Activity,此时当前我们的Activity进入到不可见状态,经历onPause → onStop方法后,进入停止状态;若再次返回,则经历onRestart → onStart → onResume后,重新启动进入到运行状态。
import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;public class LifeCycleTestMainActivity extends Activity {private final String TAG = "LifeCycleTestMainActivity";private Button start_normal_activity;private Button start_dialog_activity;@Overrideprotected void onCreate(Bundle savedInstanceState) {Log.v(TAG, "onCreate...");super.onCreate(savedInstanceState);this.setContentView(R.layout.life_cycle_main_layout);// 恢复数据if (savedInstanceState != null) {String tempData = savedInstanceState.getString("tempData");// do something...}initView();}private void initView() {start_normal_activity = (Button) this.findViewById(R.id.start_normal_activity);start_dialog_activity = (Button) this.findViewById(R.id.start_dialog_activity);start_normal_activity.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(LifeCycleTestMainActivity.this, LifeCycleNormalActivity.class);startActivity(intent);}});start_dialog_activity.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(LifeCycleTestMainActivity.this, LifeCycleDialogActivity.class);startActivity(intent);}});}// 保存临时数据,避免活动进入到“停止状态”时,被系统回收,数据消失的问题@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);String tempDate = "some temp data have need saved";outState.putString("tempData", tempDate);}@Overrideprotected void onStart() {Log.v(TAG, "onStart...");super.onStart();}@Overrideprotected void onResume() {Log.v(TAG, "onResume...");super.onResume();}@Overrideprotected void onPause() {Log.v(TAG, "onPause...");super.onPause();}@Overrideprotected void onStop() {Log.v(TAG, "onStop...");super.onStop();}@Overrideprotected void onRestart() {Log.v(TAG, "onRestart...");super.onRestart();}@Overrideprotected void onDestroy() {Log.v(TAG, "onDestroy...");super.onDestroy();}}布局文件:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/start_normal_activity" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="start normal activity" android:textSize="20sp" /> <Button android:id="@+id/start_dialog_activity" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/start_normal_activity" android:text="start dialog activity" android:textSize="20sp" /> </RelativeLayout>
<activity android:name=".LifeCycleDialogActivity" android:theme="@android:style/Theme.Dialog"/>
搞定,接下来我们运行程序,进行测试:
很高兴,依然与我们料想的一样,从暂停状态中恢复,我们只经历了一步:onResume.
事实上,我们此时再次点击回退键的时候,我们最直观看到的就是:"屏幕返回到了系统的主界面"。
- Android - Acitivty生命周期 理解
- 1. Android Framework-Acitivty
- Android Acitivty 启动方式
- android acitivty 刷新频率 疑问
- [Android翻译]Acitivty中的KeyEvent.Callback接口
- Activity生命周期 之 停止和重启Acitivty
- Android Activity生命周期理解
- Android Activity生命周期理解
- android 理解Fragment生命周期
- android 理解Fragment生命周期
- android生命周期理解
- Android Activity生命周期理解
- Android生命周期的理解
- Android Service生命周期理解
- android 生命周期理解
- 深入理解Android Activity生命周期
- Android Activity生命周期的理解
- 深入理解android view 生命周期
- C++中const的使用
- NSURLSession
- Java操作HBase表入门
- 【2011集训队出题】圈地计划
- 三层基础知识梳理
- Android - Acitivty生命周期 理解
- 摘录 Multiple View Geometry in Computer Vision preface
- 快速排序
- Uva11292 The Dragon of Loowater
- HDOJ 2149 Public Sale 【巴什博弈】
- Python爬虫——爬取网站的图片
- 大数据下union all的视图分页解决方案
- lightoj 1026 - Critical Links 【DFS求块 + 边双连通求桥】
- mysql常见问题分享 - baidu