Android-管理Activity生命周期 -开始一个Activity

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

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

理解生命周期回调方法

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

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

Android-管理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中会讲到。

Android-管理Activity生命周期 -开始一个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

上一篇:(转)Elasticsearch聚合初探——metric篇


下一篇:Qt5 UI信号、槽自动连接的控件重名大坑(UI生成的槽函数存在一个隐患,即控件重名。对很复杂的控件,不要在 designer 里做提升,而是等到程序启动后,再动态创建,可以避免很多问题)