Android Activity生命周期

Android Activity生命周期图谱
Paste_Image.png
Paste_Image.png
  • activity类处于android.app包中,继承体系如下:
  1. java.lang.Object
  2. android.content.Context
  3. android.app.ApplicationContext
  4. android.app.Activity
  • 从上图中可以看出Activity的生命周期包含两层循环,

    onPasue -> onResume -> onPause
    此为activity的焦点生命周期,意思是在activity焦点的获得与失去的过程中循环,在这过程中,activity始终是  可见的
    
    onStop -> onRestart -> onStart ->onResume -> onPause -> onStop
    activity可见与不可见的过程中循环,此过程伴随着焦点的失去与获得,也就是说activity首先会被显示,或得焦点,失去焦点,最后由于弹出其它activity,使当前的activity变成不可见,由此出现3种生命周期
    1.整体生命周期:onCreate -> ... ... ->onDestroy
    2.可视生命周期:onStop -> ... ... -> onPasue
    3.焦点生命周期:onPause -> ... ... -> onResume
    
    • 详细说明
      开始Activity:在这个阶段执行3个生命周期的方法:onCreate() -> onStart() -> onResume()
      Activity失去焦点:如果Activity失去焦点的场景下进入其它的Activity,这时当前Activity失去焦点,在这个阶段,会执行onPause() - > onStop()方法
      Activity重新获得焦点:如果Activity重新获得焦点,会依次执行3个生命周期:onRestart() -> onStart() -> onResume()
      关闭Activity:当Activity被关闭时,系统会依次执行3个生命周期方法:onPause() -> onStop ->onDestroy()
    • 七个生命周期方法及说明:
      1. protected void onCreate(Bundle savedInstanceState)
      当Activity被第首次加载时执行。我们新启动一个程序的时候其主窗体的onCreate事件就会被执行。如果Activity被销毁后(onDestroy后),再重新加载进Task时,其onCreate事件也会被重新执行。注意这里的参数 savedInstanceState(Bundle类型是一个键值对集合,大家可以看成是.Net中的Dictionary)是一个很有用的设计,由于前面已经说到的手机应用的特殊性,一个Activity很可能被强制交换到后台(交换到后台就是指该窗体不再对用户可见,但实际上又还是存在于某个Task中的,比如一个新的Activity压入了当前的Task从而“遮盖”住了当前的 Activity,或者用户按了Home键回到桌面,又或者其他重要事件发生导致新的Activity出现在当前Activity之上,比如来电界面),而如果此后用户在一段时间内没有重新查看该窗体(Android通过长按Home键可以选择最近运行的6个程序,或者用户直接再次点击程序的运行图标,如果窗体所在的Task和进程没有被系统销毁,则不用重新加载,直接重新显示Task顶部的Activity,这就称之为重新查看某个程序的窗体),该窗体连同其所在的 Task和Process则可能已经被系统自动销毁了,此时如果再次查看该窗体,则要重新执行 onCreate事件初始化窗体。而这个时候我们可能希望用户继续上次打开该窗体时的操作状态进行操作,而不是一切从头开始。例如用户在编辑短信时突然来电,接完电话后用户又去做了一些其他的事情,比如保存来电号码到联系人,而没有立即回到短信编辑界面,导致了短信编辑界面被销毁,当用户重新进入短信程序时他可能希望继续上次的编辑。**这种情况我们就可以覆写Activity的void onSaveInstanceState(Bundle outState)事件,通过向outState中写入一些我们需要在窗体销毁前保存的状态或信息,这样在窗体重新执行onCreate的时候,则会通过 savedInstanceState将之前保存的信息传递进来,此时我们就可以有选择的利用这些信息来初始化窗体,而不是一切从头开始。 **
      
      2. protected void onStart() //activity变为在屏幕上对用户可见时调用
          onCreate事件之后执行。或者当前窗体被交换到后台后,在用户重新查看窗体前已经过去了一段时间,窗体已经执行了onStop事件,但是窗体和其所在进程并没有被销毁,用户再次重新查看窗体时会执行onRestart事件,之后会跳过onCreate事件,直接执行窗体的onStart事件
      
      3. protected void onResume()//activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)
          onStart事件之后执行。或者当前窗体被交换到后台后,在用户重新查看窗体时,窗体还没有被销毁,也没有执行过onStop事件(窗体还继续存在于Task中),则会跳过窗体的onCreate和onStart事件,直接执行onResume事件
      
      4. protected void onPause()//activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!
         窗体被交换到后台时执行
      
      5. protected void onStop()//activity被停止并转为不可见阶段及后续的生命周期事件时调用
          onPause事件之后执行。如果一段时间内用户还没有重新查看该窗体,则该窗体的onStop事件将会被执行;或者用户直接按了Back键,将该窗体从当前Task中移除,也会执行该窗体的onStop事件
      
      6. protected void onRestart()
         onStop事件执行后,如果窗体和其所在的进程没有被系统销毁,此时用户又重新查看该窗体,则会执行窗体的onRestart事件,onRestart事件后会跳过窗体的onCreate事件直接执行onStart事件
      
      7. protected void onDestroy()//activity被完全从系统内存中移除时调用,该方法被调用可能是因为有人直接调用onFinish()方法或者系统决定停止该活动以释放资源
         Activity被销毁的时候执行。在窗体的onStop事件之后,如果没有再次查看该窗体,Activity则会被销毁
      
  • 示例代码:

public class ActivityDemo extends Activity{
    private static final String TAG = "ActivityDemo";
    private EditText mEditText;
    private String mString;//定义一个String类型用来存取我们的EditText输入值

    ////当Activity第一次被创建时调用,我们可以在这进行初始化操作
    public void onCreate(Bundle saveInstanceState){
        super.onCreate(saveInstanceState);
        setContentView(R.layout.activity_main);
        mEditText = (EditText)findViewById(R.id.editText);
        Log.e(TAG,"start onCreate...");
    }
    //onStart()方法在Activity开始被执行时调用,它紧随onCreate()方法之后调用
    @Override
    protected void onStart(){
        super.onStart();
        Log.e(TAG,"start onStart...");
    }
    //当按HOME键,在启动应用程勋,要恢复当前的状态
    //当Activity从stopped状态启动时会调用onRestart(),后面总是调用onStart()方法
    @Override
    protected void onRestart(){
        super.onRestart();
        mEditText.setText(mString);
        Log.e(TAG,"start onRestart...");
    }
    //onResume()方法在Activity即将与用户交互时调用
    @Override
    protected void onResume(){
        super.onResume();
        Log.e(TAG,"start onResume...");
    }
    //按HOME键,在onPause,将输入的值赋给mString
    //在一个Activity启动另一个Activity时调用,它通常被用来持久化数据、停止动画或其他耗费资源的动作,
    //下一个Activity必须等待这个方法返回后在启动,所以在这里做过多的操作
    @Override
    protected void onPause(){
        super.onPause();
        mString = mEditText.getText().toString();
        Log.e(TAG,"start onPause...");
    }
    //onStop()方法在一个新的Activity启动、其他的Activity切换到前台、当天Activity被销毁时都会被调用
    @Override
    protected void onStop(){
        super.onStop();
        Log.e(TAG,"start onStop...");
    }
    //Activitybe被销毁时调用
    @Override
    protected void onDestroy(){
        super.onDestroy();
        Log.e(TAG,"start onDestroy...");
    }
}
  • 启动程序调用方法:


    Paste_Image.png
  • 按Home键,失去焦点被测程序放置后台挂起,方法如下:


    Paste_Image.png
  • 当从后台挂起变更为前台展示,Activity获得焦点,方法如下:


    Paste_Image.png
  • 关闭Avtivity时调用的方法:


    Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,846评论 2 374
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,146评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,789评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,656评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,467评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,870评论 3 389
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,500评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,790评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,828评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,628评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,449评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,881评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,077评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,376评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,879评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,089评论 2 338

推荐阅读更多精彩内容