很多程序都是从main()方法开始启动的,和其他程序不同,android是在activity生命周期的特定状态的特定回调方法中初始化代码的。activity启动和销毁的时候都用很多回调方法。

这里将要对生命周期中大多数重要的方法进行一个总体介绍以及如何处理生命周期中的第一个回调方法(这个回调方法创建了一个新的activity实例)。

理解生命周期回调方法

在activity的生命周期中,系统按照像金字塔的顺序调用了一系列的生命周期回调方法。也就是说,activity生命周期中的每个状态就像金字塔的一级。当系统创建一个信的activity实例时,回调方法把activity的状态一步一步调整到顶。金字塔的最顶端就时activity在前台运行并且可以与用户交互的点。

当用户备时离开activity,系统为了拆除activity,调用一些其他的方法让activity的状态走下金字塔。在有些情况下,activity只会往金字塔下走一部分然后等待(比如用户切换到其他程序),在那个点activity可以在再次到顶端(如果用户返回activity)然后恢复用户离开时的状态。

图1.一个activity生命周期的插图,像金字塔一样。这里展示了,把cativity带向最高点(Resumed状态)的每个回调方法,以及activity走下来的回调方法。activity也可以从Paused和Stopped状态回到Resumed状态。

取决于activity的复杂程度,你可能不需要实现所有的生命周期方法。但是理解每一个回调方法很重要,然后去实现他们来确保app的行为和用户期望的一致。正确的实现activity生命周期方法对于你的程序的正常运行有很多帮助,包括:

  • 用户在使用你的app时,接到一个电话或者切换到其他app后,不会crash

  • 不消耗用户没有使用的系统资源

  • 如果用户离开你的app然后过一会儿之后回来app,不会丢失用户的进度

  • 切换横竖屏时,不会crash也不会丢失用户的进度

如图1所示,在很多中情况下activity会在不同状态间切换,但是,只有三种状态会持续。也就是,activity可以在这三个状态中的一个停留很长一段时间

Resumed

在这个状态,activity在前台并且可以和用户交互。(有时候也叫“running”状态)

Paused

在这个状态,activity一部分北另一个activity挡住。另外一个在前台的activity是半透明的或者没有挡住整个屏幕。被暂停的activity不能接收用户的输入也不能执行代码

Stopped

在这个状态,activity是完全隐藏的而且用户不可见。它在后台运行。在stopped状态中,activity实例和所有的状态信息(比如成员变量)被保留了,但是不能执行人和代码。

其他的状态(Created 和 Started)是短暂的,系统会通过调用生命周期的回调方法很快就转移到下个状态。也就是,系统调用onCreate()之后,又马上调用onStart(), 很快又接着调用onResume()。

这些就是activity生命周期的基础。下面会开始介绍一些生命周期的特殊方法。

指定app的启动Activity

当用户选择主屏上的app图标之后,系统会调用app中声明的“launcher”(或者"main")activity的onCreate()方法。这个activity是app与用户交互的主进入点

你可以在工程的根目录下的Android manifest文件AndroidManifest.xml中定义那一个activity作为主activity

app中的主activity必须用<intent-filter>在manifest中声明并且报错MAIN action 和 LAUNCHER category.例如:

<activity android:name=".MainActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

注意:用Android SDK工具创建新的Android工程时,默认的工程文件中包含一个Activity类并且已经在manifest中声明。

如果MAIN action 或者 LAUNCHER category 没有为任何一个activity声明,app的icon将不会在主屏上显示。

创建一个新的实例

大多数app包含很多个不同的activity来让用户执行不同的操作。无论是用户点击app图标后创建的主activity还是app中为了响应用户操作开始的一个不同的activity,系统都会通过调用onCreate()方法来创建新的activity实例。

你必须实现onCreate()方法来实现程序启动的逻辑,onCreate()方法在activity的整个生命中只会调用一次。比如,你实现的onCreate()方法应该定义用户界面和可能用到的类中的全局变量。

例如,下面的onCreate()例子展示了一些activity基本设置的代码,比如声明用户界面(在XML layout文件中定义),定义成员变量,和配置一些UI。

TextView mTextView; // layout 中的 text view 成员变量

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // 设置activity的用户交互界面
// layout文件定义在工程的 res/layout/main_activity.xml 文件中
setContentView(R.layout.main_activity); // 初始化TextView变量以便于我们在后面使用
mTextView = (TextView) findViewById(R.id.text_message); // 为了使用 ActionBar APIs 需要确保我们在 Honeycomb or higher 版本中运行
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// For the main activity, make sure the app icon in the action bar
// does not behave as a button
ActionBar actionBar = getActionBar();
actionBar.setHomeButtonEnabled(false);
}
}

注意:使用SDK_INT来防止在旧版本的系统中执行新的API,这种方式只在Android 2.0(API level 5)或更高版本中适用。老版本会遇到runtime异常。

一旦onCreate()执行完,系统就会紧接着调用onStart()和onResume()方法。activity从来不会一直停留则会Created或者Started状态。从技术上说,activity在调用onStart()之后就可以被看到了,但是紧接着就会调用onResume(),然后activity一直停留在Resumed状态直到发生什么事来改变它,比如收到一个电话,用户切换到其他的activity, 或者设备的屏幕关闭了。

下面,你会看到其他的启动相关的方法onStart()和onResume(),他们在activity从Paused和Stopped状态重新激活时非常有用。

注意:onCreate方法包含一个叫做savedInstanceState的参数,这个在后面的重新创建Activity中会讲到。

图2.另外一张带有强调三个重要回调方法(创建的时候系统会逐一调用onCreate(), onStart(), 和onResume())的activity生命周期的图。一旦调用完成后,activity就会到大Resumed状态,用户j可以和activity交互直到切换到其他activity。

销毁Activity

activity生命周期中第一个回调方法是onCreate(), 最后一个回调方法是onDestroy()。当这个activity实例将要完全从系统内存中移除时,系统通过调用这个方法来发出最后的信号。

大多数app不需要实现这个方法因为本地类引用是和activity一起销毁的并且activity在onPause()和onStop()时已经做了大部分清理。但是,如果activity存在在onCreate()时创建的后台线程或者其他长时间运行,不正确关闭就会导致内存泄漏的资源,你应该在onDestroy()中清理他们。

@Override
public void onDestroy() {
super.onDestroy(); // Always call the superclass // Stop method tracing that the activity started during onCreate()
android.os.Debug.stopMethodTracing();
}

注意:在大部分情况下,系统在调用onPause()和onStop()之后才会调用onDestroy(),除了这种情况:在onCreate()中调用了finish()。在有些情况下,activity作为一个临时操作来启动另外一个activity,你就需要在onCreate()中调用finish()来销毁activity。在这种情况下,系统不会调用其他任何生命周期相关方法而会直接调用onDestroy()。

上一篇:Android-管理Activity生命周期

下一篇:Android-管理Activity生命周期 -暂停和恢复一个Activity

Android-管理Activity生命周期 -开始一个Activity的更多相关文章

  1. Android学习路线(十二)Activity生命周期——启动一个Activity

    DEMO下载地址:http://download.csdn.net/detail/sweetvvck/7728735 不像其他的编程模式那样应用是通过main()函数启动的.Android系统通过调用 ...

  2. android学习笔记 activity生命周期&任务栈&activity启动模式

    activity生命周期 完整生命周期 oncreate->onstart->onresume->onpause->onstop->ondestory 使用场景:应用程序 ...

  3. Activity 生命周期及其栈管理方式

    Activity 生命周期 Android 系统用栈的形式管理 Activity , 当新的 Activity 被创建是, 会被放置到栈顶, 这个 Activity 会进入到运行状态, 而前一个 Ac ...

  4. android --Activity生命周期具体解释

    一. 再探Activity生命周期 为了研究activity的生命周期,简单測试代码例如以下. package com.example.testactivity; import android.app ...

  5. 【Android 应用开发】Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  6. 05 Activity生命周期

    生命周期:一个Activity从创建到销毁经过的全部方法 1.onCreate() 创建一个Activity的时候执行的方法 2.onStart()Activity可以被看见到时候无法交互(没有焦点) ...

  7. Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  8. activity生命周期知识点整理

    activity生命周期知识点整理 Activity: 是一个应用组件,用户可与其提供的屏幕进行交互.窗口通常会充满屏幕,但也可以小于屏幕并浮动在其他窗口之上. 一个activity的什么周期: 启动 ...

  9. android开发之生命周期

    android开发之生命周期 一:Activity的生命周期: 这几天了了解了安卓Activity的生命周期,对于生命周期有了大概的理解: 一个Activity的生命周期也就是Activity从生成到 ...

  10. Android-管理Activity生命周期 -暂停和恢复一个Activity

    在正常的使用app时,前台的activity有时候会被可见的组件阻塞导致activity暂停.比如,当打开一个半透明的activity(就像打开了一个对话框),之前的activity就会暂停.只要ac ...

随机推荐

  1. 不可不知的DIP、IoC、DI以及IoC容器

    面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.当中.OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念. 本文首先用实例阐述四个概 ...

  2. hdu 1849 (尼姆博弈)

    http://acm.hdu.edu.cn/showproblem.php? pid=1849 简单的尼姆博弈: 代码例如以下: #include <iostream> #include ...

  3. Matlab实现PCA

    在主成分分析(PCA)中,介绍了PCA的数学原理,其有用Matlab能够非常方便地对矩阵进行操作! 比方,用Matlab求多个样本的协方差矩阵.求矩阵的特征根和特征向量等. 以下介绍用Matlab实现 ...

  4. VS2010,原来还有这些快捷键,果断记下来!

    一直认为VS的快捷键跟eclipse比起来差远了,那些由于不知道还有如此多有效却不知的快捷键阿 1. 检查括号匹配(在左右括号间切换): Ctrl +] 2. 选中从光标起到行首(尾)间的代码: Sh ...

  5. java中取得上下文路径的方法

    1.request.getContextPath(); 获得web根的上下文环境 如 /tree tree是web项目的root context 2.可以在servlet的init方法里 String ...

  6. Hibernate 配置详解(11)

    hibernate.session_factory_name_is_jndi 配置hibernate.cfg.xml中SessionFactory的name属性是否作为JNDI名称绑定.默认是true ...

  7. 将鼠标移到文本弹出一些字幕CSS达到,不及格JS达到

    使用css实施内容流行,否js代码,下面的代码,可直接使用复制, 需要背景图到下面的地址下载,谢谢! 住址:http://download.csdn.net/detail/zurich1979/722 ...

  8. android client随机验证码生成函数

    由于该项目使用验证码.自己找了一些资料.尽量把这个验证码做出来.代码不是很,較的简单,以下给大家看看我是怎么实现该功能的: 源代码地址下载:http://download.csdn.net/detai ...

  9. 赤裸裸的splay平衡树

    HYSBZ1588 http://www.lydsy.com/JudgeOnline/problem.php?id=1588 给我们n天的营业额, 要求出每天的最小波动值,然后加起来.  当天最小波动 ...

  10. UVALive 3890 Most Distant Point from the Sea(凸包最大内接园)

    一个n个点的凸多边形,求多边形中离多边形边界最远的距离.实际上就是求凸包最大内接圆的半径. 利用半平面交求解,每次二分枚举半径d,然后将凸包每条边所代表的半平面沿其垂直单位法向量平移d,看所有平移后的 ...