Activity生命周期

1 阅读5分钟

一. Activity

先展示一张Activity的生命周期图:

activity lifecycle

1.1 Activity状态

只有下面三个状态是静态的,可以存在较长的时间内保持状态不变。(其它状态只是过渡状态,系统快速执行并切换到下一个状态)   

  • 运行(Resumed):

    • 当前activity在最上方,用户可以与它进行交互。(通常也被理解为”running” 状态)
    • 此状态由onResume()进入,由onPause()退出
  • 暂停(Paused):

    • 当前activity仍然是可见的。但被另一个activity处在最上方,最上方的activity是半透明的,或者是部分覆盖整个屏幕。被暂停的activity不会再接受用户的输入。
    • 处于活着的状态(Activity对象存留在内存,保持着所有的状态和成员信息,仍然吸附在window manager)。
    • 当处于极度低内存的状态时,系统会杀掉该activity,释放相应资源。
    • 此状态由onPause()进入,退出可能onResume()或者onCreate()重新唤醒,或者被onStop()结束
  • 停止(Stopped):

    • 当前activity完全被隐藏,不被用户可见。可以认为是处于在后台。
    • 处于活着的状态(Activity对象存留在内存,保持着所有的状态和成员信息,不再吸附在window manager)。
    • 由于对用户不再可见,只要有内存的需要,系统就会清理该activity用以释放内存资源。
    • 该状态由onStop()进入,或onRestart()或者onCreate()重新唤醒,或者被onDestroy()彻底死亡。
    • 其它状态 (Created与Started)都是短暂的,系统快速的执行那些回调函数并通过。

当acitivty处于暂停或者停止状态,系统可以通过finish()或 android.os.Process.killProcess(android.os.Process.myPid())来杀死其进程。当该activity再次被打开时(结束或杀死后),需要重新创建Ativity,走一遍完整的流程。

1.2 Activities调用流程

当Activity A 启动 Activity B时,两个activity都有自个的生命周期。Activity A暂停或者停止,Activity B被创建。记住,在Activity B创建之前,Activity A并不会完全停止,流程如下:

  1. Activity A 进入onPause();
  2. Activity B 依次 onCreate(), onStart(), onResume()。(此时Activity B得到了用户焦点)
  3. 如果Activity A不再可见,则进入onStop().

1.3 代码实践

利用下面的DemoActivity代码,可亲自感受每一个阶段的状态。比如点返回键,home键,menu键等操作,可以借助通过logcat查看该activity到底处于哪种状态,这里就不说结果了,自己动手,丰衣足食。

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class DemoActivity extends Activity {
    private static final String TAG = "demo";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG,"onCreate::The activity is being created.");
    }
    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG, "onStart::The activity is about to become visible.");
    }
    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, "onResume::The activity has become visible.");
    }
    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "onPause:: Another activity is taking focus.");
    }
    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, "onStop::The activity is no longer visible");
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "onDestroy::The activity is about to be destroyed");
    }
}

二. 简单故事理解Activity生命周期

《小熊猫的奇妙一天:Activity生命周期大冒险》

从前有只叫安迪的小熊猫,他住在一个叫"手机乐园"的神奇世界里。每天,安迪都会经历七次神奇的变身,就像变魔术一样!让我们跟着安迪看看他的一天吧~

🌅 清晨6点:onCreate魔法苏醒
"叮铃铃!"闹钟响起,安迪揉揉眼睛从床上坐起来。这时,他的房间突然亮起温柔的晨光,所有家具都自己排列整齐(初始化布局),妈妈准备的早餐自动飘到桌上(加载数据)。妈妈说:"安迪,今天要记得整理房间哦!"(设置监听器)

☀️ 早上7点半:onStart冒险开始
安迪背上书包推开家门。整个街道突然变得热闹起来,邻居家的小动物们都出门了(界面变得可见)。但安迪还不能和小伙伴玩,因为他要赶去学校(界面尚未获得焦点)。

🎒 早上8点:onResume课堂时间
"叮咚!"安迪冲进教室的瞬间,全身亮起金光!他的小爪子能碰到黑板上的字了(获得焦点),可以举手回答问题(处理触摸事件),连老师讲的每个字都像星星一样钻进耳朵(开始播放动画)。

🌳 上午10点:onPause课间时光
突然!窗外飞来一只彩色蝴蝶,全班同学都挤到窗边。安迪的身体变得半透明(失去焦点),但还能看到教室里的课桌(界面仍然部分可见)。他踮着脚尖往外看,心里想着:"等会儿要回来继续听课呢!"

🏠 中午12点:onStop放学回家
当安迪坐上校车,教室突然"咻"地消失了!街道上的小动物们也都回家吃饭了(界面完全不可见)。但安迪知道,只要明天再来学校,教室还会在原地等着他(保留状态)。

🌙 晚上9点:onDestroy晚安时间
"晚安安迪~"妈妈关灯后,整个房间开始旋转缩小,最后变成一颗小星星飞向夜空(进程被杀死)。不过别担心,第二天闹钟响起时,星星又会变回安迪的房间!

🎉 特别惊喜:onRestart魔法重现
有时候安迪正在看故事书,突然被叫去帮忙拿快递。他赶紧在书上折个角(保存当前状态),等回来时轻轻一抖,书页自动翻到折角处,故事继续播放!(从停止状态恢复)

小朋友,现在你知道了吗?每个App都像安迪一样,会经历起床、上学、玩耍、回家的完整一天。当你打开游戏时,就是小英雄在苏醒;当你切出去回消息时,他就在原地等你;即使不小心睡着了,第二天还会带着昨天的宝藏重新开始冒险呢!

试试看:下次用手机时,猜猜你的小熊猫现在正在经历哪个魔法时刻吧!🐾