博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈Android中Activity的生命周期
阅读量:6137 次
发布时间:2019-06-21

本文共 4041 字,大约阅读时间需要 13 分钟。

引言

  我想对于Android开发人员来说,Activity是再熟悉不过了,今天我们就来探讨下Activity的生命周期。熟悉的掌握Activity对于开发健壮的Android应用程序来说至关重要。下面就开始我们的探索之旅吧。

Activity生命周期初探

  我们来看一下这一张经典的生命周期流程图:

   相信不少朋友也已经看过这个流程图了,也基本了解了Activity生命周期的几个过程,我们就来说一说这几个过程。

  1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。

  2.当前Activity被其他Activity覆盖(注意:此处是指当前Activity对于用户任然可见,只是上面覆盖了一层,典型的PopupWindow或者弹出的Activity是Dialog形式的)其上:系统会调用onPause方法,暂停当前Activity的执行。

  3.当前Activity由被覆盖状态回到前台:系统会调用onResume方法,再次进入运行状态。

  4.当前Activity转到新的Activity界面或按Home键回到主屏或者锁屏,自身退居后台(注意:此时Activity不可见):系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。

  5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。

  6.当前Activity处于被覆盖状态或者后台不可见状态,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。

  7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。

  下面我们就结合例子来亲自看一下整个Activity的生命周期。请看源代码:

1 public class MainActivity extends Activity { 2  3     private Context context=MainActivity.this; 4     private Button button; 5  6     @Override 7     protected void onCreate(Bundle savedInstanceState) { 8         super.onCreate(savedInstanceState); 9         setContentView(R.layout.activity_main);10         button=(Button)findViewById(R.id.button);11         Toast.makeText(context,"onCreate called",Toast.LENGTH_LONG).show();12 13 14         button.setOnClickListener(new View.OnClickListener() {15             @Override16             public void onClick(View v) {17                 Intent intent=new Intent();18                 intent.setClass(context,PopActivity.class);19                 MainActivity.this.startActivity(intent);20 21             }22         });23     }24 25 26     @Override27     public void onRestart() {28         super.onRestart();29         Toast.makeText(context,"onRestart called",Toast.LENGTH_LONG).show();30     }31 32 33     @Override34     public void onStart() {35         super.onStart();36         Toast.makeText(context,"onStart called",Toast.LENGTH_LONG).show();37     }38 39     @Override40     public void onResume() {41         super.onResume();42         Toast.makeText(context,"onResume called",Toast.LENGTH_LONG).show();43     }44 45     @Override46     public void onPause() {47         super.onPause();48         Toast.makeText(context,"onPause called",Toast.LENGTH_LONG).show();49     }50 51 52     @Override53     public void onStop() {54         super.onStop();55         Toast.makeText(context,"onStop called",Toast.LENGTH_LONG).show();56     }57 58     @Override59     public void onDestroy() {60         super.onDestroy();61         Toast.makeText(context,"onDestroy called",Toast.LENGTH_LONG).show();62     }63 }

  我们运行这个APP。

  第一个看到的当然是Activity的创建过程。整个过程和我们上面介绍的一致。分别是onCreate----->onStart----->onResume这个过程。

  然后我们点击回退按钮,退出Activity。这时我们看到当前执行的是Activity的销毁流程onPause----->onStop----->onDestroy这个过程。(注意:如果我们这时打开任务管理器选择Activity打开,那么这个Activity会进行重建。即从onCreate----->onStart----->onResume)。

  第三个步骤如果我们不点击回退按钮,点击Home键。退回到Android手机的主界面。这时Avtivity不进行销毁,只是停止。其流程是onPause----->onStop。(注意:锁屏流程的过程与点击Home键的流程一样。)。

  注意:凡是处于Stop状态的Activity,在重新回到主界面运行,都必须执行onRestart----->onStart----->onResume这个流程。

对Activity生命周期的扩展

  下面我们介绍onWindowFocusChanged、onSaveInstanceState、onRestoreInstanceState这几个方法。它们经常和Activity生命周期联系在一起。

  1.onWindowFocusChanged方法:在Activity窗口获得或失去焦点时被调用,例如创建时首次呈现在用户面前;当前Activity被其他Activity覆盖;当前Activity转到其他Activity或按Home键回到主屏,自身退居后台;用户退出当前Activity。以上几种情况都会调用onWindowFocusChanged,并且当Activity被创建时是在onResume之后被调用,当Activity被覆盖或者退居后台或者当前Activity退出时,它是在onPause之后被调用。

  2.onSaveInstanceState:(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,此方法会被调用;(2)在用户改变屏幕方向时,此方法会被调用;(3)在当前Activity跳转到其他Activity或者按Home键回到主屏,自身退居后台时,此方法会被调用。第一种情况我们无法保证什么时候发生,系统根据资源紧张程度去调度;第二种是屏幕翻转方向时,系统先销毁当前的Activity,然后再重建一个新的,调用此方法时,我们可以保存一些临时数据;第三种情况系统调用此方法是为了保存当前窗口各个View组件的状态。onSaveInstanceState的调用顺序是在onPause之前。

  3.onRestoreInstanceState:(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,然后用户又回到了此Activity,此方法会被调用;(2)在用户改变屏幕方向时,重建的过程中,此方法会被调用。我们可以重写此方法,以便可以恢复一些临时数据。onRestoreInstanceState的调用顺序是在onStart之后。

转载于:https://www.cnblogs.com/dreamGong/p/5166460.html

你可能感兴趣的文章
我的友情链接
查看>>
mysql日常命令一
查看>>
Virtualbox 4.2 下面Drag'n Drop功能实现
查看>>
安装Ubuntu 桌面显示太小
查看>>
CITRIX技术峰会,浦东香格里拉之旅
查看>>
VM挂起后无法打开
查看>>
我的友情链接
查看>>
监控介绍
查看>>
linux下logrotate配置
查看>>
后悔自己2013年错过的一切,只好在浪费了2014来弥补
查看>>
2 Linux 相关历史及基础
查看>>
子网的划分方法
查看>>
勤能补拙,拙有何用?
查看>>
Configuring InnoDB Buffer Pool Flushing
查看>>
webdriver 自动化测试初试
查看>>
maven依赖本地非repository中的jar包-依赖jar包放在WEB-INF/lib等目录下
查看>>
cacti PHP 少见错误 PHP Warning: session_start(): open(/var/lib/php/session/
查看>>
SQL Server 2016 Management Studio 安装
查看>>
KVM虚拟化的介绍与简单使用
查看>>
win7怎么设置自动关机
查看>>