实验2 Activity组件的生命周期Word下载.docx
- 文档编号:20458873
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:12
- 大小:177.80KB
实验2 Activity组件的生命周期Word下载.docx
《实验2 Activity组件的生命周期Word下载.docx》由会员分享,可在线阅读,更多相关《实验2 Activity组件的生命周期Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
所以它仍然可见,但已经失去了焦点故不可与用户进行交互。
3、Stoped
如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。
它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被强行终止掉。
4、Killed
如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除,Android系统采用两种方式进行删除,要么要求该Activity结束,要么直接终止它的进程。
当该Activity再次显示给用户时,它必须重新开始和重置前面的状态。
状态转换
当一个Activity实例被创建、销毁或者启动另外一个Activity时,它在这四种状态之间进行转换,这种转换的发生依赖于用户程序的动作。
图2.1说明了Activity在不同状态间转换的时机和条件:
图2.1.Activity的状态转换
如图2.1所示,Android程序员可以决定一个Activity的“生”,但不能决定它的“死”,也就时说程序员可以启动一个Activity,但是却不能手动的“结束”一个Activity。
当你调用Activity.finish()方法时,结果和用户按下BACK键一样:
告诉ActivityManager该Activity实例完成了相应的工作,可以被“回收”。
随后ActivityManager激活处于栈第二层的Activity并重新入栈,同时原Activity被压入到栈的第二层,从Active状态转到Paused状态。
例如:
从Activity1中启动了Activity2,则当前处于栈顶端的是Activity2,第二层是Activity1,当我们调用Activity2.finish()方法时,ActivityManager重新激活Activity1并入栈,Activity2从Active状态转换Stoped状态,Activity1.onActivityResult(intrequestCode,intresultCode,Intentdata)方法被执行,Activity2返回的数据通过data参数返回给Activity1。
Activity栈
Android是通过一种Activity栈的方式来管理Activity的,一个Activity的实例的状态决定它在栈中的位置。
处于前台的Activity总是在栈的顶端,当前台的Activity因为异常或其它原因被销毁时,处于栈第二层的Activity将被激活,上浮到栈顶。
当新的Activity启动入栈时,原Activity会被压入到栈的第二层。
一个Activity在栈中的位置变化反映了它在不同状态间的转换。
Activity的状态与它在栈中的位置关系如图2.2所示:
图2.2.Activity的状态与它在栈中的位置关系
如图2.2所示,除了最顶层即处在Active状态的Activity外,其它的Activity都有可能在系统内存不足时被回收,一个Activity的实例越是处在栈的底层,它被系统回收的可能性越大。
系统负责管理栈中Activity的实例,它根据Activity所处的状态来改变其在栈中的位置。
Activity中有7个与生命周期有关的函数。
其中onCreate()是Activity第一次启动时执行,主要是初始化一些变量,绑定数据或恢复信息等;
onStart()是Activity界面被显示出来的时候执行;
onRestart()是当前Activity重新被启动时调用;
onResume()是当该Activity与用户能进行交互时被执行;
onPause()是另一个Activity被启动,当前的Activity就被暂停了,一般在该函数中执行保存当前的数据或资源;
onStop()表示另一个Activity被启动完成时,当前Activity对用户完全不可见时才调用;
onDestroy()是退出当前Activity时调用的,另外,如果程序中调用finish()或者Android系统当前资源不够用时也会被调用。
这7个生命周期函数的调用顺序如图2.3所示。
图2.3Activity生命周期函数的调用顺序(状态转换的方法与实现)
在图2.3中,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被分发时。
所以在这些接口方法中的代码应该属于非常轻量级的。
三、实验内容
1、创建Activity生命周期程序
在Eclipse中建立Android工程,工程名为LifeCycle,建好后在LifeCycle.java中添加与Activity生命周期有关的函数:
onStart(),onRestart(),onResume(),onPause(),onStop(),onDestroy()。
【参考代码】
@Override
protectedvoidonStart(){
super.onStart();
}
代码可参考附录1.
2、添加日志点
向步骤1中建立的LifeCycle.java中相关的生命周期函数添加日志点,使用Android中的Log类可以实现添加日志点。
android.util.Log常用的方法有5个,分别为:
Log.v(),Log.d(),Log.i(),Log.w()以及Log.e()。
根据首字母分别对应VERBOSE,DEBUG,INFO,WARN,ERROR,对应的优先级也是由低到高。
说明:
(1)Log.v的输出颜色是黑色,任何消息都会输出,这里的v代表verbose,表示详细信息,用法是Log.v("
参数1"
"
参数2"
),参数1是标签,参数2是提示信息;
(2)Log.d的输出颜色是蓝色,输出调试信息(debug),也会显示i、w和e的信息;
(3)Log.i的输出颜色是绿色,一般提示性的消息(information),它不会输出Log.v和Log.d的信息,但会显示i、w和e的信息;
(4)Log.w的输出颜色是橙色,可以看作为警告信息(warning),同时它还会输出Log.e的信息。
(5)Log.e的输出颜色是红色,可以想到是错误信息(error),这里仅显示红色的错误信息。
Log.i(“LIFECYCLE”,“
(2)onStart()”);
代码可参考附录2.
3、打开控制台LogCat窗口
在Eclipse菜单栏上选择Window->
ShowView->
Other,在弹出的窗口中展开Android项,然后选中LogCat,点击OK,如图2.4所示。
图2.4ShowView中选择LogCat
这样,LogCat便显示在Eclipse下方的控制台区域。
如图2.5所示
图2.5Eclipse中的LogCat
为了便于观察,可以设置LogCat过滤器,点击LogCat窗口中SavedFilter部分的绿色加号,打开LogCat信息过滤器设置窗口,设置一个名为LogFilter,过滤条件为“标签名=LIFECYCLE”的过滤器,如图2.6所示。
图2.6LogCat过滤器
4、观察并记录生命周期函数的调用情况
分别在不同情况下运行程序,观察7个Activity生命周期函数的调用情况,同时记录下来。
(1)全生命周期
正常启动LifeCycle程序,然后通过模拟器的返回键关闭程序,观察并记录控制台的输出。
(2)可视生命周期
正常启动LifeCycle程序,然后通过“呼出/接听键”启动内置的拨号程序,再通过“返回键”退出拨号程序,重新回到LifeCycle程序,观察并记录控制台的输出。
(3)活动生命周期
正常启动LifeCycle程序,然后通过DDMS工具模拟电话呼叫,再通过“挂断键”挂断电话后重新回到LifeCycle程序,观察并记录控制台的输出。
三、思考与练习
1、除了使用log类添加日志点方法之外,还有什么其他方法可以实现类似的效果?
附录1:
MainActivity.java代码如下:
//-------------------------------------------------------------------------------------------------
packagecom.example.lifecycle1;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
publicclassMainActivityextendsActivity{
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("
firstactivity:
onCreate()"
);
}
protectedvoidonDestroy(){
onDestroy()"
super.onDestroy();
protectedvoidonPause(){
onPause()"
super.onPause();
protectedvoidonRestart(){
onRestart()"
super.onRestart();
protectedvoidonResume(){
onResume()"
super.onResume();
onStart()"
}
protectedvoidonStop(){
onStop()"
super.onStop();
classMyNextActivityimplementsOnClickListener
{
publicvoidonClick(Viewv){
Intentintent=newIntent();
intent.setClass(MainActivity.this,SecondActivity.class);
MainActivity.this.startActivity(intent);
附录2:
importandroid.util.Log;
publicclassMainActivityextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
//setContentView(R.layout.main);
Log.i("
ActivityTest"
"
callonCreate"
@Override
protectedvoidonStart(){
callonStart"
protectedvoidonResume(){
callonResume"
protectedvoidonPause(){
callonPause"
protectedvoidonStop(){
callonStop"
protectedvoidonDestroy(){
callonDestroy"
附录3:
SecondActivity.java代码如下:
packagecom.example.lifeone;
//importandroid.view.Menu;
publicclassSecondActivityextendsActivity{
secondactivity:
onCreate()"
setContentView(R.layout.activity_second);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验2 Activity组件的生命周期 实验 Activity 组件 生命周期