Android之Activities

487 查看


Activity是一个应用组件,提供一个用户界面,用户可与之交互。每个Activity都被分配一个Window以便于绘制用户接口。
Android采用back stack机制,即LIFO队列,当一个新的Activity启动后,将会被存至backstack并被赋予焦点。
它有一个具体的生命周期,控制着Activity与其他Activity转换的流程,这些控制方法采用几个回调函数实现:如onCreate,onStart,onResume,onPause,onStop,onDestory。

  • onCreate
    必须实现的回调函数,系统使用他创建Activity,可初始化一些必须的参数,必须调用setContentView()来定义用户接口,即布局。
  • onPause
    提交或者保存任何应该被持久化的数据。

Implementing a User Interface

一个Activity的UI是由层层的view表示,这些view派生自View类。每个View控制Activity Window窗口内的一个矩形区域,
- Widgets,提供交互或者可视的元素,诸如button,check box
- Layouts,派生自ViewGroup,为子view提供独一无二的布局模型,诸如linearlayout。

在Manifest中声明Activity

<manifest ... >
  <application ... >
      <activity android:name=".ExampleActivity" />
      ...
  </application ... >
  ...
</manifest >

Using Intent Filters

这些都在Intent Filters章节中说明了。

Starting an Activity

使用 startActivity()即可

Starting an activity for a result

调用 startActivityForResult() 。
实现回调函数onActivityResult。需要定义请求码,并在回调函数中判断,以及执行的结果是否为RESULT_OK。

Shutting Down an Activity

finish() or finishActivity().

Managing the Activity Lifecycle

三个必要的状态:
- Resumed, Activity在前台显示,并且拥有用户焦点
- Paused, 另外一个Activity在前台显示,并且拥有焦点,但该Activity仍然可见,并且完全存活,它的Activity对象被保留在内存中,维持这所有的状态和成员信息,且还附着在Window Manager上。但在内存极低的条件下,可被系统kill掉。
- Stopped, 完全被另外一个Activity遮蔽,但依然处于存活状态,与Paused相比,它不再附着Window Manager上。且在系统需要内存时可被kill掉。

如果activity处于paused或则和stopped,系统可通过调用其finish方法或者是直接kill掉其process。当被重新打开时,必须完全重构。

Implementing the lifecycle callbacks

public class ExampleActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // The activity is being created.
    }
    @Override
    protected void onStart() {
        super.onStart();
        // The activity is about to become visible.
    }
    @Override
    protected void onResume() {
        super.onResume();
        // The activity has become visible (it is now "resumed").
    }
    @Override
    protected void onPause() {
        super.onPause();
        // Another activity is taking focus (this activity is about to be "paused").
    }
    @Override
    protected void onStop() {
        super.onStop();
        // The activity is no longer visible (it is now "stopped")
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // The activity is about to be destroyed.
    }
}

Tip: 每个回调,都必须实现自己的父类方法super.onXXX

  • 完整的生命周期,自onCreate到onDestory。
  • 可视周期,onStart到onStop
  • 前台周期,onResume到onPause
    可被杀掉的周期包括onPause到onDestory。

其中onStop后再回来,需要调用onRestart,然后才是onStart。

Saving activity state

当其他Activity来到前台,应调用onSaveInstanceState()来保存状态(一般会在onStop之前也可能在onPause之前调用),这些状态以KVP保存到Bundle中。当Activity重新回到前台后,可通过onCreate或 onRestoreInstanceState()来重建状态。如果无任何状态,Bundle是null。

Tip: 一般来讲,所有的View都已经默认实现了onSaveInstanceState,可保存在UI所做的改变,且在Activity重回前台时,重装这些值。前提是每个需要保存的view都已经设置android:id这个标签。
如果重写onSaveInstanceState方法,那么必须调用其父类的该方法实现,并且相应地重写onRestoreInstanceState()。

Caution:由于无法保证onSaveInstanceState方法一定会被调用,因此,最好将一些持久化的数据放到onPause方法中。

测试方法,可简单旋转屏幕,以使得Activity可以重新onCreate。

Handling configuration changes

有些配置(such as screen orientation, keyboard availability, and language)可在运行过程中进行修改,当这些修改完成后,将会导致Android 重建该Activity(系统调用onDestory,然后立即调用onCreate)。
最好的方式处理这些问题,就是调用onSaveInstanceState() and onRestoreInstanceState() (or onCreate())。

Coordinating activities

两个Activity的切换,其生命周期是可以预测,比如
A 启动 B,那么其流程为:

  1. A 的 onPause方法启用。
  2. B 的onCreate,onStart,onResume依次启用。
  3. 当A不再可见,调用onStop。

因此,如果A有数据共享给B,那么可在onPause里进行数据存储,然后B可直接使用,而不是在onStop里。