在系统中的
Activity
被一个
Activity
栈所管理。当一个新的
Activity
启动时,将被放置到栈顶,成为运行中的
Activity
,前一个
Activity
保留在栈中,不再放到前台,直到新的
Activity
退出为止。
A
ctivity的
生命周期有七部分
,如下灰色矩框所示:(
这张图是从
android
的帮助文档中截出来的
)
在上图中,
Activity
有三个关键的循环:
1
、整个的生命周期,从
onCreate(Bundle)
开始到
onDestroy()
结束。
Activity
在
onCreate()
设置所有的
“
全局
”
状态,在
onDestory()
释放所有的资源。例如:某个
Activity
有一个在后台运行的线程,用于从网络下载数据,则该
Activity
可以在
onCreate()
中创建线程
,
在
onDestory()
中停止线程
2
、可见的生命周期,从
onStart()
开始到
onStop()
结束。
在这段时间,可以看到
Activity
在屏幕上,尽管有可能不在前台,不能和用户交互。在这两个接口之间,需要保持显示给用户的
UI
数据和资源等,例如:可以在
onStart
中注册一个
IntentReceiver
来监听数据变化导致
UI
的变动,当不再需要显示时候,可以在
onStop()
中注销它。
onStart()
,
onStop()
都可以被多次调用,因为
Activity
随时可以在可见和隐藏之间转换
3
、前台的生命周期,从
onResume()
开始到
onPause()
结束。
在这段时间里,该
Activity
处于所有
Activity
的最前面,和用户进行交互。
Activity
可以经常性地在
resumed
和
paused
状态之间切换,例如:当设备准备休眠时,当一个
Activity
处理结果被分发时,当一个新的
Intent
被分发时。所以在这些接口方法中的代码应该属于非常轻量级的。
Method
|
Description
|
Next
| ||
在你第一次创建该activity时调用,可以在这里做该activity的初始化设置
|
onStart()
| |||
。
|
在activity onStop()后重新显示时调用,后面跟着onStart()
|
onStart()
| ||
在activity变的可见时调用
|
onResume()
or
onStop()
| |||
。
|
在activity与用户交互时调用(activity获得焦点),此时该activity位于栈的顶端
|
onPause()
| ||
暂停状态,在将有另一个activity遮挡在该activity前边的时候调用,此时activity失去焦点不能与用户交互,但仍然可见,此时系统可以将该
Activity
从内存中删除
|
onResume()
or
onStop()
| |||
停止状态,在将有另一个activity完全遮挡在该activity前边时调用,此时activity完全不可见,此时系统可以将该
Activity
从内存中删除
|
onRestart()
or
onDestroy()
| |||
Activity结束时调用
|
nothing
|
Activity
有四种本质区别的状态:
1
、
在屏幕的前台(
Activity
栈顶)
,叫做
活动状态
或者
运行状态
(
active or running
)
2
、
如果一个
Activity
失去焦点,但是依然可见
(一个新的非全屏的
Activity
或者一个透明的
Activity
被放置在栈顶),叫做
暂停状态(Paused)
。一个暂停状态的
Activity
依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被杀掉。
3
、如果一个
Activity
被另外的
Activity
完全覆盖掉
,叫做
停止状态(Stopped)
。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,
Stopped
的
Activity
将被杀掉。
4
、如果一个
Activity
是
Paused
或者
Stopped
状态
,系统可以将该
Activity
从内存中删除,
Android
系统采用两种方式进行删除,要么要求该
Activity
结束,要么直接杀掉它的进程。当该
Activity
再次显示给用户时,它必须重新开始和重置前面的状态。
当ActivityA被另外一个 ActivityB 抢走焦点时,再从B回到A时,可能发生以下两种过程:
- 如果ActivityB是小窗口,不能完全遮挡ActivityA时:
A会调用onPause()方法,此时从B回到A只需要调用A的onResume()。
- 如果ActivityB完全遮挡ActivityA时:
A会调用onPause()
—
>onStop()方法,此时从B回到A需要调用A的onRestart()
—
>onStart()
—
>onResume()
可以用如下案例在日志中来观看activity的生命周期:
public
class
MainActivity
extends
Activity
{
private
static
final
String
TAG
=
"ActivityDemo"
;
@Override
protected
void
onCreate
(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.
activity_main
);
Log.
e
(
TAG
,
"start onCreate"
);
}
@Override
public
boolean
onCreateOptionsMenu
(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.
main
, menu);
return
true
;
}
@Override
protected
void
onStart
() {
//
TODO
Auto-generated method stub
super
.onStart();
Log.
e
(
TAG
,
"start onStart"
);
}
@Override
protected
void
onRestart
() {
//
TODO
Auto-generated method stub
super
.onRestart();
Log.
e
(
TAG
,
"start onRestart"
);
}
@Override
protected
void
onPause
() {
//
TODO
Auto-generated method stub
super
.onPause();
Log.
e
(
TAG
,
"start onPause"
);
}
@Override
protected
void
onResume
() {
//
TODO
Auto-generated method stub
super
.onResume();
Log.
e
(
TAG
,
"start onResume"
);
}
@Override
protected
void
onStop
() {
//
TODO
Auto-generated method stub
super
.onStop();
Log.
e
(
TAG
,
"start onStop"
);
}
@Override
protected
void
onDestroy
() {
//
TODO
Auto-generated method stub
super
.onDestroy();
Log.
e
(
TAG
,
"start onDestroy"
);
}
}