引言

  我想对于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的生命周期。请看源代码:

 public class MainActivity extends Activity {

     private Context context=MainActivity.this;
private Button button; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button)findViewById(R.id.button);
Toast.makeText(context,"onCreate called",Toast.LENGTH_LONG).show(); button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.setClass(context,PopActivity.class);
MainActivity.this.startActivity(intent); }
});
} @Override
public void onRestart() {
super.onRestart();
Toast.makeText(context,"onRestart called",Toast.LENGTH_LONG).show();
} @Override
public void onStart() {
super.onStart();
Toast.makeText(context,"onStart called",Toast.LENGTH_LONG).show();
} @Override
public void onResume() {
super.onResume();
Toast.makeText(context,"onResume called",Toast.LENGTH_LONG).show();
} @Override
public void onPause() {
super.onPause();
Toast.makeText(context,"onPause called",Toast.LENGTH_LONG).show();
} @Override
public void onStop() {
super.onStop();
Toast.makeText(context,"onStop called",Toast.LENGTH_LONG).show();
} @Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(context,"onDestroy called",Toast.LENGTH_LONG).show();
}
}

  我们运行这个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之后。

浅谈Android中Activity的生命周期的更多相关文章

  1. Android中Activity的生命周期

    简介: 这个基本是必问的问题了,说一下你对Activity生命周期的理解,呵呵… onCreate, onStart, onResume, onPause, onStop, onDestroy, on ...

  2. 【android】android中activity的生命周期

    activity生命周期: 实例代码: public class DemoActivity extends Activity { //1.activity第一次被创建的时候,执行 @Override ...

  3. Android应用程序中Activity的生命周期

    Android应用程序中Activity的生命周期 对于Android来说Activity的生命周期是非常的重要,尤其是对于新学者来说,只有充分了解了Activity的生命周期,才能写出优良用户体验的 ...

  4. 浅谈Android之Activity生命周期

     Activity作为四大组件之一,出现的频率相当高,基本上我们在android的各个地方都能看见它的踪影,因此深入了解Activity,对于开发高质量应用程序是很有帮助的.今天我们就来详细地聊聊Ac ...

  5. 浅谈Android中的startActivityForResult和setResult方法

    引言 我们知道,如果想打开一个新的Activity我们可以使用startActivity方法.今天我们介绍的startActivityForResult不仅可以打开全新的Activity,而且当新的A ...

  6. 每天一点Android干货-Activity的生命周期

    Activity Activity是这样一个程序组件,它为用户提供一个用于任务交互的画面. 一个应用程序通常由多个activity组成,它们彼此保持弱的绑定状态.典型的,当一个activity在一个应 ...

  7. Android之Activity的生命周期

    PS:写一发关于Activity的生命周期,也算是面试的重点内容. 学习内容: 1.Activity的生命周期 2.面对多种情况的时候Activity的生命周期 3.onSaveInstanceSta ...

  8. 无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)

    1.activity的生命周期 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: (1)Activity的完整生命周期 自第一次调用onCrea ...

  9. android学习——activity的生命周期

    Android中主要组件之Activity的生命周期,基本都是翻译Android API和个人的理解. 首先看一下Android api中所提供的Activity生命周期图: Activity其实是继 ...

随机推荐

  1. android 解决ListView点击与滑动事件冲突

    如果你的ListView的Item有滑动功能,但又点击Item跳转到其它activity,这样若是在Adapter里面写点击事件是会导致滑动事件获取不到焦点而失效: 解决方法:不要在adapter里面 ...

  2. 使用valgrind检查内存

    Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,是公认的最接近Purify的产品,它包含一个内核——一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务——调试 ...

  3. Struts核心技术简介

    Struts核心技术简介 1.Struts内部机制   Struts是一种基于MVC经典设计模式的开发源代码的应用框架,它通过把Servlet.JSP.JavaBean.自定义标签和信息资源整合到一个 ...

  4. oracle 倒库后insert id冲突的问题

    错误为:ORA-00001: unique constraint violated 把test库的数据导入到另一个库后,忘记修改自增id sequence的nextval了,因此,当前的数据库中数据和 ...

  5. 【2016-11-6】【坚持学习】【Day21】【主窗口关闭时,同步关闭它的子窗口】

    本来想用委托实现的.但是又觉得没有必要. 方法如下: public MainWindow() { InitializeComponent(); this.Closing += MainWindow_C ...

  6. python3使用pyqt5制作一个超简单浏览器

    我们使用的是QWebview模块,这里也主要是展示下QWebview的用法. 之前在网上找了半天的解析网页的内容,都不是很清楚. 这是核心代码: webview = Qwebview() webvie ...

  7. AJAX提交方法(GET)Demon

    AJAX作为一种异步的Javascript程序执行方法,极大的弥补了HTTP协议的不足(HTTP协议为无状态协议),可以无需加载整个页面,只需加载所需数据即可,浏览器内置的XMLHttp对象有open ...

  8. 嵌入式Linux驱动学习之路(十五)按键驱动-定时器防抖

    在之前的定时器驱动程序中,我们发现在连续按下按键的时候,正常情况下应该是一次按下对应一次松开.而程序有时候会显示是两次按下,一次松开.这个问题是因为在按下的时候,因为是机械按键,所以电压信号会产生一定 ...

  9. PHP开发环境搭建

    链接: Q&A1.Mac下的PHP环境搭建 Mac 下如何搭建 PHP 开发环境? [PHP] Mac下homebrew安装及php.mysql.nginx环境安装及配置个人PHP开发环境的选 ...

  10. 关于包含pom.xml的开源项目如何导入

    1. 开源项目导入eclipse的一般步骤 2. 使用Eclipse构建Maven项目 (step-by-step) 3. 第一次安装和使用maven