0%

Activity入门介绍

Activity基础

继承关系

3DBJII.png

简介

Activity专注于与用户交互,可以通过 setContentView(View) 来设置UI界面,通常情况下都是全屏显示的,当然也有其他形式如:

  1. 浮动窗口(R.attr.windowIsFloating)
  2. Multi-Window模式
  3. 内嵌其他窗口。

Acitivty是应用程序整个生命周期的重要组成部分,Activity的启动和组合方式是平台应用程序模型的基本部分.

生命周期

Activity被ActivityStacks管理.当启动一个新的Activity,它会出现在ActivityStacks的栈顶,旧的Activity将会入栈并等待新的Activity退出。

Acitivity状态

Activity拥有四个状态:

  1. Active:
    此时处于ActivityStacks栈顶位置。
  2. Visible:
    Activity失去焦点但仍处于可见状态(比如被一个Float模式的Acitivity遮挡但部分可见),那么此时是Visible状态.
  3. Stop:
    被其他Acitivity完全遮挡,那么此时是stop状态。它将保存所有状态信且不再显示。当系统其他地方需要内存时可能会将其kill而进行到4状态。
  4. Destroy:
    系统可以通过finish请求或者直接杀进程的方式来关闭Activity来使其达到destroy状态,再次启动时需要restart然后恢复状态。

    生命周期

    3Ds8Z4.png

其中有三个主要的循环点来理解Activity声明周期:

  1. 生命周期的过程都是以 onCreate 开始, 以 onDestroy 结束。所以Aciticty的初始化工作应放在onCreate中, 结束工作应放在onDestroy中。此周期适合创建和销毁用于后台数据处理的Thread.
  2. 生命周期中的可见范围是以 onStart开始, 以onStop 结束。适合创建和销毁监听系统消息而更新Activity的BroadcastReceiver.onStart和onStop在Activity的显示和隐藏过程中会持续被调用。
  3. 生命周期中活跃状态范围以onResume开始,onPause结束。

生命周期方法介绍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Activity extends ApplicationContext {

protected void onCreate(Bundle savedInstanceState);

protected void onStart();

protected void onRestart();

protected void onResume();

protected void onPause();

protected void onStop();

protected void onDestroy();
}
  1. onCreate: activity第一次创建时被调用,随后调用的是onStart
  2. onRestart: activity在被stop然后重新回到前台时调用,随后调用onStart
  3. onStart: Activity可见时调用,后接onResume或者onStop.
  4. onResume: 当Activity开始与用户交互时被调用,此时表示Activity已在Stack顶,随后跟onPause.
  5. onPause: 当Activity失去前台状态之前被调用, 包括失去焦点、停止、隐藏、销毁等状态. 此方法不能执行太多耗时操作。后接onResume或onStop.
  6. onStop: 当Activity不再显示时调用,后接onRestart或onDestroy.
  7. onDestroy: 当Activity被销毁时调用。

其中onStop和onDestroy返回之后,系统可能随时将Activity销毁并不去执行本应执行的代码,所以需要将一些必要的信息通过onPause 来存储在磁盘中。此外onSaveInstanceState(Bundle) 函数也具有保存信息以便下次恢复Activity的同时恢复数据的功能,但仅仅是当re-create状态并回调onCreate时才会有效,所以推荐保存状态使用onPause.

配置更改

通常情况下当系统配置更改(如 横竖屏、语言、输入设备等状态切换)时,Acitivty会经过onPause->onStop->onDestroy等过程进行销毁,然后通过onCreate重建.
如果不想在配置更改时重新经过生命周期,则可以通过在Manifest中添加Activity属性android:configChanges,并赋值选择需要过滤的类型,如

1
android:configChanges="keyboardHidden|orientation|screenSize"

此时当发生满足条件的配置改变时,则直接回调 onConfigurationChanged(Configuration)方法。

进程生命周期

Android系统会尽可能的去保留一个程序进程的进行,但是当内存不足时则需要按照重要性杀掉旧的进程.一般来说,基于其中运行着Activity的进程来说, 一共有四种不同的状态,按照重要性从上到下为:

  1. 具有前台Active状态的Activity
  2. 具有一个visible状态的Activity
  3. 一个Stop状态的Activity
  4. 不包含Activity(例如Service、BroadcastReceiver)的进程

(完)
本文档总结自android developers