安卓训练-开始-管理 Activity 生命周期-启动 Activity

来源:互联网 发布:手机添加网络怎么设置 编辑:程序博客网 时间:2024/04/30 12:10

启动 Activity

上一课
下一课
这节课教你
  1. 理解生命周期回调
  2. 指定你的应用的启动 Activity
  3. 创建一个新的实例
  4. 销毁 Activity
你还需要阅读
  • Activities
试试
下载示例

ActivityLifecycle.zip

不像其他的编程范式,应用通过 main() 方法启动,安卓系统通过调用与Activity 的生命周期的特定阶段相对应的特定的回调方法来初始化Activity 实例的代码。有一系列的方法用于启动 activity,还有一系列的方法用于拆除 activity。

这节课提供大部分重要的生命周期方法的概述并向你展示怎样处理创建你的 activity 的一个新实例的第一个生命周期回调。

理解生命周期回调


在一个 activity 的生命中,系统以类似于阶梯金字塔的顺序调用一系列核心生命周期方法。那就是说,activity 生命周期中的每个阶段就像金字塔上的一个单独的阶梯。当系统创建一个新的 activity 实例时,每个回调方法把 activity 的状态向金字塔的顶部移动一个阶梯。在金字塔的顶部,activity 运行在前台,并且用户可以与它交互。

当用户离开这个 activity,系统为了拆除这个 activity 会调用其他方法把 activity 的状态沿金字塔向下移。在某些情况下,activity 沿着金字塔向下移动到一半并等待(例如当用户切换到另一个应用),从那里 activity 可以移回顶部(如果用户回到这个 activity)并且恢复到用户离开的地方。

图 1. 生命周期简单示意图,用阶梯金字塔表示。这幅图显示了,对每个把 activity 向顶部的 Resumed 状态移动一步的回调方法,都有一个对应的回调方法把 activity 向下移一步。Activity 也可以从 Paused 和 Stopped 状态回到 resumed 状态。

取决于你的 activity 复杂度,你可能不需要实现所有的生命周期方法。但是,理解每个生命周期方法并实现它们对你来说很重要,这会确保你的应用按用户期望的方式运行。正确地实现你的 activity 的生命周期方法确保你的应用在几个方面运行良好,包括:

  • 如果用户收到一个电话或在使用你的应用时切换到另一个应用,不要崩溃。
  • 当用户不在活跃地使用它时,不要消耗宝贵的系统资源。
  • 如果用户离开你的应用一段时间后又回来了,不要丢失他们的进度。
  • 当屏幕在风景画和肖像画方向之间旋转时,不要丢失用户的进度或崩溃。

在后面的课程中你会学到,有很多中情况,activity 像 图 1 中展示的在不同的状态中转变。但是,只有三种状态可以是静止的。那就是说,activity 能在这三种状态中的一个持续一段时间:

Resumed
在这个状态,这个 activity 在前台,用户可以与它交互。(有时也被称为 "running" 状态。)
Paused
在这个状态,这个 activity 被另一个 activity 部分覆盖——另一个 activity 在前台是半透明的或每月盖住整个屏幕。暂停的 activity 不能接收用户输入不能执行任何代码。
Stopped
在这个状态,这个 activity 完全隐藏对用户不可见;它被认为是在后台。停止后,activity 实例和它的所有状态信息比如成员变量仍被保留,但它不能执行任何代码。

其他状态(Created 和 Started)是瞬间的,系统通过调用下一个生命周期回调方法迅速地从它们移到下一个状态。那就是说,当系统调用 onCreate() 后,它迅速调用onStart(),然后又迅速调用onResume()

基本的 activity 生命周期就是这样。现在,你将学习一些具体的生命周期行为。

指定你的应用的启动 Activity


当用户在主屏幕选中你的应用图标,系统调用你的应用中声明为"启动"(或"主")ActivityonCreate() 方法。这个 activity 是你的应用的用户界面的主入口。

你可以在你的工程的根目录下的安卓清单文件 AndroidManifest.xml 中定义哪个 activity 是主 activity。

你的应用的主 activity 必须在清单文件中定义,它有一个包含 MAIN 动作和LAUNCHER 类别的<intent-filter>。例如:

<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>

注意:当你使用安卓 SDK 工具创建了一个新的安卓工程,默认的工程文件中有一个在清单文件中定义的 Activity 类。

如果没有一个 activity 声明 MAIN 动作或LAUNCHER 类别,那么你的应用图标不会在主屏幕的应用列表中出现。

创建一个新的实例


大多数应用包含几个不同的 activity,允许用户执行不同的操作。不管是当用户点击你的应用图标时创建的主 activity 还是你的应用为了响应用户操作而启动的不同的 activity,系统通过调用ActivityonCreate() 方法创建每个新实例。

你必须实现onCreate() 方法,执行在 activity 的整个生命中只需发生一次的基本的应用程序启动逻辑。 例如,你实现onCreate() 定义用户界面并可能初始化一些类范围的变量。

例如,下面的 onCreate() 方法显示了一些为 activity 执行基本设置的代码,例如声明用户界面(在 XML 布局文件中定义),定义成员变量,配置一些 UI。

TextView mTextView; // 布局中文本视图的成员变量@Overridepublic void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    // 为这个 Activity 设置用户界面布局    // 布局在工程下的 res/layout/main_activity.xml 文件中定义    setContentView(R.layout.main_activity);        // 初始化 TextView 成员变量,后面我们可以使用它    mTextView = (TextView) findViewById(R.id.text_message);        // 为了使用 ActionBar API,需确保我们运行在 Honeycomb 或更高版本上    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {        // 对于主 activity,确保操作栏的应用图标不像一个按钮那样作出响应         ActionBar actionBar = getActionBar();        actionBar.setHomeButtonEnabled(false);    }}

警告:使用 SDK_INT 防止老系统执行新的 API,这种方式只在安卓 2.0(API 等级 5)或更高版本上可用。老版本会发生运行时异常。

一旦 onCreate() 执行结束,系统迅速地连续调用onStart()onResume() 方法。你的 activity 永远不会驻留在 Created or Started 状态。从技术上来讲,当onStart() 调用后,activity 变为用户可见,但是紧跟着迅速调用了onResume(),activity 保持 Resumed 状态直到发生某些事情而改变,比如接收到一个电话,用户导航到另一个 activity,或者设备的屏幕关闭了。

在接下来的其他课程中,你会看到其他的启动方法,onStart()onResume(),在你的 activity 的生命周期中从 Paused 或 Stopped 状态恢复 activity 时是怎样用的。

注意:onCreate() 方法包含一个称为savedInstanceState 的参数,在后面的课程重新创建 Activity 中会讨论它。

图 2. activity 生命周期结构的另一个示意图,强调了当创建 activity 的一个新实例时系统按顺序调用的三个主要回调方法:onCreate()onStart(),和onResume()。 一旦这个回调序列完成,activity 到达 Resumed 状态,用户可以和 activity 交互直到他们切换到另一个不同的 activity。

销毁 Activity


Activity 的第一个生命周期回调是 onCreate()。最后一个回调是onDestroy()。系统调用你的 activity 的这个方法,作为从系统内存中完全清除你的 activity 实例的最终信号。

大部分应用不需要实现这个方法,因为局部类引用会和这个 activity 一起销毁并且你的 activity 应该在 onPause()onStop() 中执行大部分的清理工作。但是,, 如果你的 activity 包含你在onCreate() 创建的后台线程或其他如果没有正确关闭就可能导致内存泄露的长期运行的资源,你需要在onDestroy() 中杀死它们。

@Overridepublic void onDestroy() {    super.onDestroy();  // 总是调用超类        // 停止 activity 在 onCreate() 启动的方法跟踪    android.os.Debug.stopMethodTracing();}

注意:系统在调用 onPause()onStop() 后,会调用onDestroy(),除了一种情况:你在onCreate() 方法中调用finish()。在某些情况下,比如当你的 activity 临时决定启动另一个 activity,你可能在onCreate() 中调用finish() 销毁 activity。 在这种情况下,系统立即调用onDestroy() 而不再调用任何其他生命周期方法。

上一课下一课
 
 
0 0
原创粉丝点击