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,那么其流程为:
- A 的 onPause方法启用。
- B 的onCreate,onStart,onResume依次启用。
- 当A不再可见,调用onStop。
因此,如果A有数据共享给B,那么可在onPause里进行数据存储,然后B可直接使用,而不是在onStop里。