`

Android杂谈--Android生命周期

 
阅读更多

引言

应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束 实例被销毁。在这期间,他们有时候处于激活状态,有时候处于非激活状态;对于活动,对用户有时候可见,有时候不可见。组件生命周期将讨论活动、服务、广播 接收者的生命周期——包括在生命周期中他们可能的状态、通知状态改变的方法、及这些状态的组件寄宿的进程被终结和实例被销毁的可能性。

本文主要讨论活动的生命周期及他们可能的状态、通知状态改变的方法。分为以下三部分:

  • 1、活动生命周期
  • 2、保存活动状态
  • 3、协调活动

1、活动生命周期

一个活动有三个基本状态:

  • 激活状态 运行状态 ,这时它运行在屏幕的前台(处于当前任务活动栈的最上面)。这个活动有用户的操作的焦点。
  • 暂停状态 ,这时活动失去焦点但是它对用户仍可见。也就是说,另一个活动在它的上面且那个活动是透明的或者没有覆盖整个屏幕,因此通过它可以看见暂停状态的活动。一个暂停的活动完全是活着的(它维护着所有的状态和成员信息,且仍然依附在窗口管理器),但是当内存极小时 可以被系统杀掉。
  • 停止状态 ,这时活动完全被其他活动掩盖。它仍然保留所有状态和成员信息,但是对用户它不可见,因此它的窗口时隐藏的且当其他地方需要内存时 它往往被系统杀掉。

如果一个活动被暂停或停止,系统可以将它从内存移除,通过要求它结束(通过调用它的finish() 方法),或简单地杀掉它的进程。当它再次显示给用户时,必须要完全重新启动和恢复到之前的状态。随着活动从一个状态转为另一个状态,通过调用下面的受保护的方法通知该改变:

  • void onCreate(Bundle saveInstanceState )
  • void onStart()
  • void onRestart()
  • void onResume()
  • void onPause()
  • void onStop()
  • void onDestroy()

所有这些方法都是钩子,你可以重写当状态改变时做适当的工作。所有的活动必须要实现onCreate() 去做一些初始化的设置,当对象第一次实例化的时候。很多活动也会实现onPause() 去提交数据修改或准备停止与用户交互。

将他们合并在一起,这七个方法定义了活动的整个生命周期。有三个嵌套的循环,你可以通过这七个方法监视:

  • 活动的整个生命时间 ,从第一次调用onCreate() 开始直到调用onDestroy() 结束。一个活动在onCreate() 中做所有的“全局”状态的初始设置,在onDestroy() 中释放所有保留的资源。举例来说,有一个线程运行在后台从网络上下载数据,它可能会在onCreate() 中创建线程,在onDestroy() 中结束线程。
  • 活动的可视生命时间 ,从调用 onStart() 到相应的调用onStop() 。在这期间,用户可以在屏幕上看见活动,虽然它可能不是运行在前台且与用户交互。在这两个方法之间,你可以保持显示活动所需要的资源。举例来说,你可以在onStart() 中注册一个广播接收者监视影响你的UI的改变,在onStop() 中注销。因为活动在可视和隐藏之间来回切换,onStart()onStop()   可以调用多次。
  • 活动的前台生命时间 ,从调用onResume() 到相应的调用onPause() 。在这期间,频繁地在重用和暂停状态转换——例如,当设备进入睡眠状态或一个新的活动启动时调用onPause() ,当一个活动返回或一个新的意图被传输时调用onResume() 。因此,这两个方法的代码应当是相当轻量级的。

下面这个图解释了这三个循环和状态之间状态的可能路径。着色的椭圆表示活动的主要状态,矩形表示当活动在状态之间转换时你可以执行的回调方法。



 

图1、活动生命周期(来源:Android SDK)

下面的表格对每个方法更详细的描述和在活动的整个生命周期中的定位。

t1t2

注意上面表格的Killable 列,它表示当方法返回时没有执行活动的其它代码,系统是否能杀死活动寄宿的进程。三个方法(onPause()onStop()onDestroy() )标记为Yes 。因为onPause() 是唯一一个保证在进程被杀之前会调用的,因此你应该使用onPause() 来写任何持久化存储数据。

被标记为No 的方法保护活动寄宿的进程在他们调用的时候不会被杀掉。因此活动是可杀掉状态,例如onPause() 返回到onResume() 调用期间。直到onPause() 再次返回,活动是不可杀掉的。其实,没有标记为Killable 的活动也是可以系统被杀掉的,不过这仅仅发生在极端困难的情况下,没有有任何其他资源可用。

2、保存活动状态

当系统而不是用户关闭一个活动来节省内存时,用户可能希望返回到活动且是它之前的状态。为了获得活动被杀之前的状态,你可以执行活动的onSaveInstanceState() 方法。Android在活动容易被销毁前调用这个方法,也就是调用onPause() 之前。该方法的参数是一个Bundle 对象,在这个对象你可以以名值对记录活动的动态状态。当活动再次启动时,Bundle 同时被传递到onCreate() 和调用onCreate() 之后的方法,onRestoreInstanceState() ,因此使用一个或两个可以重新创建捕获的状态。

因为onSaveInstanceState() 方法不总是被调用,你应该仅使用onSaveInstanceState() 它来记录活动的临时状态,而不是持久的数据。应该使用onPause() 来存储持久数据。

3、协调活动

当一个活动启动另一个活动,他们都经历生命周期转换。一个暂停或许是停止,然而另一个启动。有时,你可能需要协调这些活动。生命周期的回调顺序是明确界定的,特别是当这两个活动在同一个进程中:

  1. 当前活动的onPause() 方法被调用。
  2. 接下来,启动活动的onCreate()onStart()onResume() 方法按序被调用。
  3. 然后,如果获得不再在屏幕上可见,它的onStop() 方法被调用。

修正 :第一节—— 活动生命周期中的表格第一、二行中的第二列(description)中的onRestart()应该为onStart()。
1000多的点击,居然没有人发现这个错误,看了大家根本就没认真看或者说根本没有静心看园子里的任何博文,心痛!还是水帖比较受欢迎。

 

下面是一个简单的例子:

package com.android.lifetest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class AndroidLifeActivity extends Activity {
    private String TAGS = "life";
    private Button clickme;
    private Button one;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.d(TAGS, "onCreate...");
        clickme = (Button)findViewById(R.id.clickme);
        one = (Button)findViewById(R.id.oneactivity);
        
        clickme.setOnClickListener(new Button.OnClickListener()
        {

			@Override
			public void onClick(View v) {
				Intent intent = new Intent();
				intent.setClass(AndroidLifeActivity.this, Another.class);
				startActivity(intent);
			}
        	
        });
        
        one.setOnClickListener(new Button.OnClickListener()
        {

			@Override
			public void onClick(View v) {
				Intent intent = new Intent();
				intent.setClass(AndroidLifeActivity.this, One.class);
				startActivity(intent);
			}
        	
        });
        
        
    }
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		 Log.d(TAGS, "onDestroy...");
	}
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		 Log.d(TAGS, "onPause...");
	}
	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
		super.onRestart();
		 Log.d(TAGS, "onRestart...");
	}
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		 Log.d(TAGS, "onResume...");
	}
	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		 Log.d(TAGS, "onStart...");
	}
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		 Log.d(TAGS, "onStop...");
	}
    
}

运行效果如下:



 



1、当用户首次运行时,打印如下,onCreate方法其实只调用一次



 2、当用户点击第一个按钮时,弹出一个Dialog形式的Activity,这时只调用onPause方法


3、用户点击back键返回,恢复来前一个


4、用户锁屏后



 5、用户解锁屏



 6、用户点击第二个按钮,进入另一个视图



 
 7、用户返回上一个视图,点击back键



 8、用户再次点击back键,退出应用程序



转自:http://www.cnblogs.com/skynet/archive/2010/05/05/1727645.html

  • 大小: 64.6 KB
  • 大小: 4.3 KB
  • 大小: 23.6 KB
  • 大小: 1.3 KB
  • 大小: 21.9 KB
  • 大小: 1.4 KB
  • 大小: 15 KB
  • 大小: 1.9 KB
  • 大小: 2.4 KB
  • 大小: 2.6 KB
分享到:
评论

相关推荐

    Android杂谈---Nexus S的ROOT教程

    这篇“Android杂谈---Nexus S的ROOT教程”显然是针对想要获取Nexus S手机ROOT权限的用户,提供了一条详细的操作路径。Nexus S是由Google与三星联合推出的旗舰设备,因其开源特性而深受开发者喜爱。 首先,我们需要...

    Android杂谈--闹钟详谈

    在Android系统中,闹钟(Alarm)是一种非常重要的功能,它允许应用在特定的时间执行一些操作,如唤醒设备、发送通知或执行后台任务。本文将深入探讨Android中的闹钟实现,涉及源码分析以及如何使用相关工具进行调试...

    计算机汇编杂谈-理解原理

    计算机汇编杂谈-理解其中的原理

    杂谈----1 显示横向滚动条

    标题中的“杂谈----1 显示横向滚动条”暗示了我们将会探讨的是关于在界面设计中如何实现或处理横向滚动条的技术问题。这通常涉及到前端开发,特别是网页或应用程序的用户界面(UI)部分,其中可能包括HTML、CSS和...

    项目管理故事2-实施策略杂谈-开元项目实施.ppt

    "项目管理故事2-实施策略杂谈-开元项目实施" 本文是基于赵磊项目经理的项目管理故事,分享实施成功经验。赵磊担任过多个项目经理职位,负责开元旅业NC项目财务实施、苏州好孩子NC财务项目实施、合肥公交NC财务第一...

    「安全管理」Linux_HIDS杂谈 - WEB应用防火墙.zip

    「安全管理」Linux_HIDS杂谈 - WEB应用防火墙 安全管理 安全资讯 安全开发 零信任 身份管理

    swing开发杂谈--初版本程序源码

    在"swing开发杂谈--初版本程序源码"中,可能包含了上述部分或全部知识点的实际应用,通过分析`netHelper`这个子文件夹,我们可以看到可能的网络辅助类或其他功能模块的实现。这个源码可能会演示如何使用Swing构建一...

    软件工程历史杂谈-杨东屏

    ### 软件工程历史概览 #### 一、程序设计的起源与始祖 - **十七世纪的计算器发展**:十七世纪初,人类开始尝试制造计算器,这标志着早期计算机科学的萌芽。1623年,德国的博学者Wilhelm Schickard制造了世界上第一...

    程序设计经验杂谈-给予帮助

    这份“程序设计经验杂谈”文档,据说是出自一位大师之手,无疑为我们提供了宝贵的洞见。在本文中,我们将探讨几个关键的程序设计经验,希望能对你在编程旅程中提供一些帮助。 首先,我们来谈谈问题解决策略。在编程...

    嵌入式开发杂谈-薛立功经典之作

    ### 嵌入式开发杂谈—薛立功经典之作:关键知识点解析 #### 一、引言 在嵌入式开发领域,《嵌入式开发杂谈》是薛立功先生的经典著作之一,该作品旨在解答新手在入门阶段遇到的各种问题。通过作者的经验分享,帮助...

    (免费)杂谈-我眼中的FPGA与DSP.docx

    在设计过程中,FPGA允许工程师通过原理图输入或硬件描述语言进行设计,然后通过软件仿真验证其正确性,大大缩短了设计周期,减少了PCB面积,提高了系统的可靠性。 相反,DSP是一种专门用于数字信号处理的微处理器,...

    (免费)杂谈-我眼中的FPGA与DSP.pdf

    在嵌入式开发领域,FPGA(Field Programmable Gate Array)和DSP(Digital Signal Processor)是两种非常重要的处理器,它们各自具有独特的特性和优势。FPGA是一种可编程的硬件平台,能够根据用户的需求配置出不同的...

    java杂谈-一个计算机专业学生几年的编程经验汇总谈.pdf

    【Java动态加载机制】 Java的动态加载机制是其设计的一大亮点,它允许程序在运行时按需加载类,而不是一次性加载所有类。这种机制降低了内存消耗,并提高了程序的灵活性。当我们编写Java程序并运行时,只有当我们...

    java杂谈-一个计算机专业学生几年的编程经验汇总谈实用.pdf

    在本文中,作者分享了作为一名计算机专业学生的编程经验,主要关注Java语言。文章分为三个部分,分别讨论了Java的动态加载机制、查找class文件的原理以及JDK和JRE的区别。 1. 动态加载机制: Java的动态加载机制...

    学术环境模拟PYTHON代码,参考:《星辰杂谈-学术圈最近怎么了?》

    为了解学术界东西方思维习惯的演变,本文建立了以随机概率论为基础的数学模型,考虑东西价值观差异,以揭示政府管制和道德引导在学术界树立正确价值观和文化自信中的影响以及必要性。数学模型都不是完全真实的,需要...

Global site tag (gtag.js) - Google Analytics