浅谈Android的Activity运行流程(生命周期)
2015-08-30 11:26
381 查看
关于Android的Activity运行流程,我们可以写一些程序来直观的查看Activity的运行流程。在这里我们使用Log工具来获取Activity运行日志。假如我们新建一个Android项目,ProcessActivity.java代码如下:
public class ProcessActivity extends Activity {
private static final String tag="徐守威";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.main);
Log.v(tag, "onCreate...");
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
Log.v(tag, "onRestart...");
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.v(tag, "onStart...");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.v(tag, "onResume...");
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.v(tag, "onPause...");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.v(tag, "onStop...");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.v(tag, "onDestroy...");
}
}
我们为Activity的哥哥状态添加了“Log”记录消息。当模拟器运行时,我们可以通过“LogCat”工具来查看Activity所处在的状态。以上代码中的七个状态又可以归纳成三类:
1.资源分配(Create/Destory)
完整的Activity生命周期由“Create”状态开始,由“Destory”状态结束。创建(Create)时分配资源,销毁(Destroy)时释放资源。
2.可见与不可见(Start/ReStart/Stop)
当Activity运行到“Start”状态时,就可以在屏幕上看到这个Activity。相反地,当Activity运行到“Stop”状态时,这个Activity就会从屏幕上消失。
当Activity尚未被销毁(Destory),而又再次被调用时,即会先进入“Restart”状态后,再进入正常的“Start”状态。例如我们从当前的Activity返回前一个Activity时候,将会比直接打开新Activity多进入一个“Rstart”状态。
3.用户能否直接访问屏幕(Resume/Pause)
当有个“Toast”、“AlertDialog”、短信、电话等消息闯入时候,原来的Activity会进入“Pause”状态,暂时放弃直接访问屏幕的能力,被中断到背景去,将前景交给优先级高的事件。当这些优先级高的时间处理完后,Activity就改进入“Resume”状态,此时又直接访问屏幕。
以上流程我们可以通过一个示意图来加深理解:
![](http://images2015.cnblogs.com/blog/495456/201508/495456-20150830112150609-622566888.png)
由时机运行的记录来看,我们可以归纳出所有Android应用程序都遵循的动作流程。
(1)一般启动
Flow:onCreate -> onStart -> onResume
启动一个Activity的基本流程是:分配资源给这个Activity(Create状态),然后将Activity内容显示到屏幕上(Start状态)。在一切就绪后,取得屏幕的控制权(Resume状态),用户可以开始使用这个程序。
![](http://images2015.cnblogs.com/blog/495456/201508/495456-20150830112201047-1337254330.png)
(2)调用另一个Activity
Flow:onPause(1) -> onCreate(2) -> onStart(2) -> onResume(2) -> onStop(1)
这是个县冻结原本的Activity,再交出直接访问屏幕能力(Pause状态)的权利。知道Activity2完成一半启动流程后,Activity1才会被停止。
![](http://images2015.cnblogs.com/blog/495456/201508/495456-20150830112208344-257862232.png)
(3)返回原Activity
Flow:onPause(2) -> onRestart(1) -> onStart(1) -> onResume(1) -> onStop(2) -> onDestory(2)
在新的Activity中,点选硬件的“Back”按钮,可以让我们回到原本的Activity。
![](http://images2015.cnblogs.com/blog/495456/201508/495456-20150830112214687-832425989.png)
(4)退出结束
Flow: onPause -> onStop -> onDestory
如果程序中有直接调用“finishi”函数来关闭Activity的话,系统假设我们很确定我们在做什么,因此会直接跳过先冻结(Freeze)的阶段,暂停(Pause),停止(Stop),然后销毁(Destory)。
![](http://images2015.cnblogs.com/blog/495456/201508/495456-20150830112224890-290701880.png)
(5)回收后再启动
Flow: onCreate -> onStart -> onResume
被回收掉的Activity一旦重新被调用时,会像一般启动一样再次调用Activity的onCreate函数。
![](http://images2015.cnblogs.com/blog/495456/201508/495456-20150830112231344-101496874.png)
当我们使用Android手机一阵子,在手机上已经执行过多个应用程序。只要按下“Back”(返回)键,Android就会打开最近一次打开过的Activity。
这时候我们要是按下多次“Back”(返回)键,理论上迟早会返回到某个已经销毁(Destory)的Activity,这时候会发生什么事情呢??
如果应该打开的Activity已经被回收了,那么这个Activity会再次被创建(Create)出来。再次被创建出来的Activity,当然会跟原本我们打开过的Activity不一样。
所以如果要让再次被创建出来的Activity看起来跟原本打开过的一样,那么在Activity之间切换时候,我们就要留意保留数据:最好在每次Activity运行到“onPalse”或“onStop”状态时先保存数据,然后在“onCreate”时候将数据读出来即可!
public class ProcessActivity extends Activity {
private static final String tag="徐守威";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.main);
Log.v(tag, "onCreate...");
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
Log.v(tag, "onRestart...");
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.v(tag, "onStart...");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.v(tag, "onResume...");
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.v(tag, "onPause...");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.v(tag, "onStop...");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.v(tag, "onDestroy...");
}
}
我们为Activity的哥哥状态添加了“Log”记录消息。当模拟器运行时,我们可以通过“LogCat”工具来查看Activity所处在的状态。以上代码中的七个状态又可以归纳成三类:
1.资源分配(Create/Destory)
完整的Activity生命周期由“Create”状态开始,由“Destory”状态结束。创建(Create)时分配资源,销毁(Destroy)时释放资源。
2.可见与不可见(Start/ReStart/Stop)
当Activity运行到“Start”状态时,就可以在屏幕上看到这个Activity。相反地,当Activity运行到“Stop”状态时,这个Activity就会从屏幕上消失。
当Activity尚未被销毁(Destory),而又再次被调用时,即会先进入“Restart”状态后,再进入正常的“Start”状态。例如我们从当前的Activity返回前一个Activity时候,将会比直接打开新Activity多进入一个“Rstart”状态。
3.用户能否直接访问屏幕(Resume/Pause)
当有个“Toast”、“AlertDialog”、短信、电话等消息闯入时候,原来的Activity会进入“Pause”状态,暂时放弃直接访问屏幕的能力,被中断到背景去,将前景交给优先级高的事件。当这些优先级高的时间处理完后,Activity就改进入“Resume”状态,此时又直接访问屏幕。
以上流程我们可以通过一个示意图来加深理解:
![](http://images2015.cnblogs.com/blog/495456/201508/495456-20150830112150609-622566888.png)
由时机运行的记录来看,我们可以归纳出所有Android应用程序都遵循的动作流程。
(1)一般启动
Flow:onCreate -> onStart -> onResume
启动一个Activity的基本流程是:分配资源给这个Activity(Create状态),然后将Activity内容显示到屏幕上(Start状态)。在一切就绪后,取得屏幕的控制权(Resume状态),用户可以开始使用这个程序。
![](http://images2015.cnblogs.com/blog/495456/201508/495456-20150830112201047-1337254330.png)
(2)调用另一个Activity
Flow:onPause(1) -> onCreate(2) -> onStart(2) -> onResume(2) -> onStop(1)
这是个县冻结原本的Activity,再交出直接访问屏幕能力(Pause状态)的权利。知道Activity2完成一半启动流程后,Activity1才会被停止。
![](http://images2015.cnblogs.com/blog/495456/201508/495456-20150830112208344-257862232.png)
(3)返回原Activity
Flow:onPause(2) -> onRestart(1) -> onStart(1) -> onResume(1) -> onStop(2) -> onDestory(2)
在新的Activity中,点选硬件的“Back”按钮,可以让我们回到原本的Activity。
![](http://images2015.cnblogs.com/blog/495456/201508/495456-20150830112214687-832425989.png)
(4)退出结束
Flow: onPause -> onStop -> onDestory
如果程序中有直接调用“finishi”函数来关闭Activity的话,系统假设我们很确定我们在做什么,因此会直接跳过先冻结(Freeze)的阶段,暂停(Pause),停止(Stop),然后销毁(Destory)。
![](http://images2015.cnblogs.com/blog/495456/201508/495456-20150830112224890-290701880.png)
(5)回收后再启动
Flow: onCreate -> onStart -> onResume
被回收掉的Activity一旦重新被调用时,会像一般启动一样再次调用Activity的onCreate函数。
![](http://images2015.cnblogs.com/blog/495456/201508/495456-20150830112231344-101496874.png)
当我们使用Android手机一阵子,在手机上已经执行过多个应用程序。只要按下“Back”(返回)键,Android就会打开最近一次打开过的Activity。
这时候我们要是按下多次“Back”(返回)键,理论上迟早会返回到某个已经销毁(Destory)的Activity,这时候会发生什么事情呢??
如果应该打开的Activity已经被回收了,那么这个Activity会再次被创建(Create)出来。再次被创建出来的Activity,当然会跟原本我们打开过的Activity不一样。
所以如果要让再次被创建出来的Activity看起来跟原本打开过的一样,那么在Activity之间切换时候,我们就要留意保留数据:最好在每次Activity运行到“onPalse”或“onStop”状态时先保存数据,然后在“onCreate”时候将数据读出来即可!
相关文章推荐
- Android 的进程与线程总结
- 正确使用Android性能分析工具——TraceView
- Android Studio 生成UML类图
- Android开发——Handler引起的内存泄露
- Android5.1中调试PreferenceActivity的时候,back键无效的问题处理
- android studio 真机运行中文乱码
- Android XML属性介绍
- 为了学习android,开始写博客了
- Android(java)学习笔记202:Handler消息机制的原理和实现
- Android基础知识巩固:关于PendingIntent和广播
- android 应用自动更新
- Android中Unable to execute dex: Multiple dex files define Lcom/viewpagerindicator/CirclePageIndicat
- Android 开发 AutoCompleteTextView结合自定义的适配器,查询数据库
- Android 技巧
- 导入导出Android手机文件
- 学习笔记——Android创建应用程序和活动
- android自定义时间选择器
- Android资源管理框架(Asset Manager)简要介绍和学习计划
- Android中TimePickerDialog的使用
- 从零开始学Android之监听器实现监听动作的三种方式(匿名内部类,独立类,接口方式)