Activity的生命周期
Activity的生命周期
以往我们实现页面间的跳转都是实例化Intent类的对象,但是页面在我们眼前的出现与消失没有我们所看到的那么简单,它有一个复杂的生命周期,一个页面的出现,被覆盖,再次出现,被覆盖,甚至销毁.......这样周而复始的过程就是Activity的生命周期。下面是一张Activity的生命周期表:
解释图例:
1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。
2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。
3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。
4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。
声明周期方法调用表:
案例说明:实现三个界面之间的相互跳转,观察Activity的生命周期(只举一个Activity跳转的例子)
第一步:定义三个Activity,实现父类的方法
public class oneActivity extends Activity { private static final String TAG = "oneActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.oneactivity_main); //获取事件源对象 Button but = (Button)this.findViewById(R.id.one_two); Button but1 = (Button)this.findViewById(R.id.one_three); //实例化DrawListener事件处理类的对象 loginListener dl = new loginListener(this); //给事件源设置触屏监听方法,指定事件处理类的对象dl but.setOnClickListener(dl); but1.setOnClickListener(dl); } @Override protected void onStart() { super.onStart(); Log.i(TAG, " onStart~~~"); } @Override protected void onResume() { super.onResume(); Log.i(TAG, " onResume~~~"); } @Override protected void onPause() { super.onPause(); Log.i(TAG, " onPause~~~"); } @Override protected void onStop() { super.onStop(); Log.i(TAG, " onStop~~~"); } @Override protected void onRestart() { super.onRestart(); Log.i(TAG, " onRrstart~~~"); } @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, " onDestory~~~"); } }
第二步:给键盘加上监听方法,有几个Activity就有几个监听方法,实现三个Activity之间的跳转
public class loginListener implements android.view.View.OnClickListener { private oneActivity oa; public loginListener(oneActivity oa) {//构造方法传参 this.oa = oa; } public void onClick(View v) { // 获取事件源对象 Button but = (Button) v; // 实例化Intent类的对象 Intent intent = new Intent(); if(but.getId()==R.id.one_two){ // 从第一个界面跳转到第二个界面 intent.setClass(oa, twoActivity.class); }else{ // 从第一个界面跳转到第三个界面 intent.setClass(oa, threeActivity.class); } // 使用mainActivity来启动页面的跳转 oa.startActivity(intent); // ma.finish();//销毁当前ma对象 } }
注意:在我的程序中,第三个Activity不是满屏的状态,设置界面不是满屏状态的方法如下:
运行结果的分析:
我的第一个Activity:
我的第二个Activity:
我的第三个Activity:
从第一个Activity到第二个Activity:
第一个界面先暂停,第二个界面就开始创建,开始,呈现在眼前,最后第一个界面就停止了。
从第二个Activity到第三个Activity:
注意第二个界面是暂停的,因为第三个界面不是全屏,第二个界面依然可以看到,所以是暂停,不是停止。
从第三个Activity到第一个Activitty:
第二个界面先停止,第一个界面开始从创建,启动到呈现在眼前,最后第三个界面停止。
做一个返回的动作:(即又回到第二个和第三个界面叠加在一起的情况)
第二个界面启动,第三个界面重新启动,启动,呈现在眼前,第一个界面就停止消失并且被撤销了。
做一个Home的动作:
第三个界面先暂停,第二个界面消失,然后第三个界面也消失了。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具