标签:
Activity的生命周期
随着用户不断地在应用程序页面之间导航,Activity会在不同的生命周期状态之间切换;当某个Activity第一次被调用时,Android系统将会调用一系列的方法以启动用户界面;通过使用这些方法,你可以像创建其他组件一样创建Activity的外观和体验;
如果用户启动另一个Activity甚至切换到另一个应用程序,随着你的Activity进入后台,Android会调用一系列其他的方法;例如:如果用户切换到另一个应用程序,可能需要断开当前应用程序使用的所用数据连接;出现这些状况时,应用程序的状态可能会丢失;
如果Acticity在前台或在Activity栈的顶部,那么他会被认为是活动的(或可运行的);它在Android中具有最高的优先级,只有在极端情况下才会被操作系统终止;
Activity可以被暂停,而暂停状态在Android系统中拥有第二高的优先级;当Activity暂停时,所有的状态和成员信息都会被维护并保存到窗口管理器中;
Activity会被停止或隐藏到后台,这通常发生在一个Activity被另一个Activity完全覆盖时;这些Activity仍然视图保持其状态和成员信息,但是在Activity的三种状态中,优先级是最低的;
当某个Activity被Android系统从内存中移除时,你必须重新启动应用程序
? ?
综上所述, 你只需要通过简单地重写应用程序中的相关方法就可以处理Activity状态的改变;当Activity启动时,会调用onCreate()方法;在这个方法中,你可以创建视图、初始化变量和引进静态数据;但为了不降低这个处理过程的速度,代码中最好尽量少做类似的处理;
onStart方法在onCreate方法之后被调用;如果需要在Activity显示之前执行刷新当前视图之类的特定操作,onStart方法非常有用;当Activity准备好与用户交互时,onResume方法会被调用,此时你可以做诸如显示动画特效或相关对话框的处理;
onPause方法在系统即将把Activity放在后台运行或Activity部分被遮挡时被调用;你可以在这个方法里保存任何未保存的更改、清理消耗资源的对象、降低帧速率或停止动画;
onStop方法在Activity变为不可见时被调用;这个方法可能根本不会被调用,所以最好不要依赖它;
onDestroy方法是在Activity被销毁或被从内存中删除之前最后被调用的方法;它用于清理可能会造成资源泄露的过程,如任何后台线程;
onRestart方法在Activity已经停止、再次启动之前被调用;
? ?
? ?
再论Activity生命周期
如你所见,Activity只是Android应用程序的一个屏幕或者用户界面,他是与用户交互的一个全屏应用或者浮动窗口;Android应用程序由不同的Activity组成,这些Activity即与用户进行交互,也与其他的Activity进行交互;例如,一个简单的计算器仅使用单个Activity;如果完善计算器应用程序,使其在简单版本和科学版本之间切换,你将使用两个Activity;
每个Android应用程序都运行在单独的进程中;为了运行应用程序,进程不断地被启动和终止;为了节省内存和资源,进程可能会被杀掉;而Activity则轮流地运行在应用程序的UI主线程中;
Activity启动后就会进入一个生命周期(lifecycle);生命周期是一个术语,他指的是当用户(或者操作系统)与Activity交互时,Activity经历的状态;Android提供了特别的回调方法来让你针对Activity声明周期的变化做出反应;
Activity生命周期4种状态:
? ?
但应用程序在不同状态之间迁移时android.app.Activity的生命周期方法(或者回调)会被系统调用;这些回调方法如下:
? ?
acenodie 于 2015/3/28 15:53 修改
接下来通过具体的实例来详细了解一下Android的生命周期:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_timer;
Log.d("Life", "onCreate");
}
public void onStart(){
super.onStart();
Log.d("Life", "onStart");
}
public void onPause(){
super.onPause();
Log.d("Life", "onPause");
}
public void onResume(){
super.onResume();
Log.d("Life", "onResume");
}
public void onStop(){
super.onResume();
Log.d("Life", "onStop");
}
public void onDestroy(){
super.onDestroy();
Log.d("Life", "onDestroy");
}
public void onRestart(){
super.onRestart();
Log.d("Life", "onRestart");
}
? ?
? ?
我想说的是,刚才为了去找一下Onenote有没有更好的代码高亮的插件一下花了近两个小时的时间,刚开始只是找一下有没有新推出的插件或我我还没用过的,可是都没有发现,又想能不能将Eclipse上的代码的格式复制下来,那样岂不是更好么,找到了两个方法,其中一个方法无效,另外一个太复杂还没有试;于是乎我就想到了Onenote2016,看有没有推出这一新功能,一搜便发现了onenote推出了新的网页剪辑插件clliper,简直神器呀,便开始捣鼓,但是官网的下载不了,于是乎群里去求助,无果,便打算去chrome插件商店,GFW,你懂得,打开goagen,依然无效,GFW真是日益强大,又想起了前几天买的VPN,GreenVPN,再次尝试,无效,再次问客服,不回!,去贴吧写了一封投诉贴,直接被管理员删除,问他原因,不回,举报了他,又在QQ上举报了一次,最后还是低声下气去贴吧问原因,至今无果,开始回来学习,时间就是这么一点一点浪费的 -_-|||,我甚至还打开了搜狗输入法找了一个表情!!哎哎!时间就是这么浪费的呀,这是在我自己把写的读完一次再次感受到的,什么都不说了,哎;
? ?
废话不说了,开始分析;
? ?
打开应用程序,首先依次执行的是onCreate、onStart、onResume,如下图:
? ?
当我点击旋转屏幕后,依次执行的是如下图黑色框内的部分,依次是:onPause、onStop、onDestroy、onCreate、onStart、onResume,可以发现,后三个和上面刚刚打开应用程序的执行的三个方法是一样的,现在可以理解为是又重新加载了一遍Actiity,详情还不太清楚,见后;
通过在网上(来自 <http://blog.csdn.net/liu_zhen_wei/article/details/8049018> )确认,在旋转屏幕的时候Activity的onDestroy和onCreate方法会被调用,意思就是这个Activity确实是被销毁然后重新创建的;
同时也有方法避免Activity在转屏时被销毁,原理还不清楚:
1)修改AndroidManifest.xml
? ? ?在activity属性中加入:
? ? ??????android:configChanges="orientation|keyboardHidden"
如下:
<activity?android:theme="@style/ContentOverlay"??
????????android:launchMode="singleTask"??
????????android:configChanges="keyboardHidden|orientation|screenSize"?????????????????????????????
????????android:windowSoftInputMode="adjustPan|stateAlwaysVisible"?android:name="com.weibo.net.ShareActivity">??
</activity>?
? ?
? ?
? ?
当此时切换到另外一个应用程序时,依次执行方法:onPause、onStop;
? ?
? ?
当我再次切换回这个应用时,依次执行onRestart、onStart、onResume;
? ?
打开应用,然后点返回键,依次执行onPause、onStop、onDestroy
? ?
实验证明,当点返回键的时候程序已经执行完毕,这时候如果再从最近的任务里启动的话,相当于是重新打开了,而从最近的任务栏里删除记录,也不会有其他的回调函数被调用;
? ?
? ?
此时此刻我必须要记录一下,当我在调试这个定时器的时候,我点击Start开始计时后,setTimeDisplay()函数一直执行,这是正常情况;但是奇怪的是当我点返回键之后,这个函数并没有停止,而是继续执行,直到我在最近的任务栏里删除记录才停止。。。。。
奇了个怪了???
? ?
? ?
? ?
acenodie 于 2015/3/28 22:52 修改
? ?
等一下,上面还有一个测试没有做,就是在应用程序出现后,按主屏键回到主屏的情况,测试如下:
经测试这种情况下,和直接切换到其他应用程序的情况一样,依次执行onPause和onStop;
? ?
? ?
这里又发现了一个问题,因为按照理论的情况,Activity的生命周期的流程如下图,不同状态之间的切换是很多种情况的,而我上面所分析的情况里很明显是不包括下面的很多种情况的,例如:
从onPause --??onCreate
从onStop --??onCreate
从onPause --? onResume
从onStop --??onCreate
? ?
这些情况希望能在以后的机会中测试到;
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
标签:
原文地址:http://www.cnblogs.com/acenodie/p/4378491.html