一. Activity
先展示一张Activity的生命周期图:
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并不会完全停止,流程如下:
- Activity A 进入onPause();
- Activity B 依次 onCreate(), onStart(), onResume()。(此时Activity B得到了用户焦点)
- 如果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都像安迪一样,会经历起床、上学、玩耍、回家的完整一天。当你打开游戏时,就是小英雄在苏醒;当你切出去回消息时,他就在原地等你;即使不小心睡着了,第二天还会带着昨天的宝藏重新开始冒险呢!
试试看:下次用手机时,猜猜你的小熊猫现在正在经历哪个魔法时刻吧!🐾