很多程序都是从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. hello MemSQL 入门安装演示样例

    一,介绍 MemSQL号称世界上最快的分布式关系型数据库,兼容mysql但快30倍,能实现每秒150万次事务.原理是仅用内存并将SQL预编译为C++. 二,部署 官网下载地址:http://www.m ...

  2. Linux中下载,压缩,解压等命令

    查看是否和还有一台Linux机器相通命令:ssh    主机名@Ip地址    ,提示输入password.就可以查看远程文件的文件夹 下载远程机器上的文件:scp  主机名@Ip地址:/path/s ...

  3. 第一章. ActionScript 语言基础

    第一章. ActionScript 语言基础 1.0. ActionScript 3.0 Cookbook 概述 1.1. 新建一个 ActionScript project 1.2. 自己定义应用程 ...

  4. Android清理设备内存具体完整演示样例(一)

    MainActivity例如以下: package come.on; import android.app.Activity; import android.content.Context; impo ...

  5. zzu--2014年11月16日月潭赛 B称号

    1229: Rational Resistance Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 8  Solved: 4 [id=1229" ...

  6. 读书笔记:《梦断代码Dreaming in Code》

    读书笔记:<梦断代码Dreaming in Code> 拿到<梦断代码>书后,一口气翻了一遍,然后又用了3天时间仔细读了一遍,也不禁掩卷长叹一声,做软件难.虽难,仍要继续走下去 ...

  7. hdu3899(树形dp)

    题意:给一树,每个结点有人数,边有权值,表示经过这条边所需时间, 问取某个结点作为开会地点,所有人全部到达此结点最少所需总时间? 分析:val[u]表示以u为根节点的总人数,num[u]表示以u为根节 ...

  8. 一个用js写的接口http调试程序

    公司有非常多手机app的项目.手机app又要常常訪问后台提交与查询数据. 所曾经端app与后台的开发与測试过程中接口调试是一个常常要做的工作. 而每当出现一个BUG,前端appproject师与后台p ...

  9. 《软件project》课程报告 —国土资源执法监察管理信息系统建模

    ***********************************************声明*************************************************** ...

  10. Eclipse插件基础篇一

    名词翻译 有一些名词在翻译的过程中可能会出现歧义,在这里统一一下. アーキテクチャ=architecture=架构 プラットフォーム=platform=平台 コンポーネント=component=组件 ...