关于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”状态,此时又直接访问屏幕。

以上流程我们可以通过一个示意图来加深理解:

由时机运行的记录来看,我们可以归纳出所有Android应用程序都遵循的动作流程。

(1)一般启动

Flow:onCreate -> onStart -> onResume

启动一个Activity的基本流程是:分配资源给这个Activity(Create状态),然后将Activity内容显示到屏幕上(Start状态)。在一切就绪后,取得屏幕的控制权(Resume状态),用户可以开始使用这个程序。

(2)调用另一个Activity

Flow:onPause(1) -> onCreate(2) -> onStart(2) -> onResume(2) -> onStop(1)

这是个县冻结原本的Activity,再交出直接访问屏幕能力(Pause状态)的权利。知道Activity2完成一半启动流程后,Activity1才会被停止。

(3)返回原Activity

Flow:onPause(2) -> onRestart(1) -> onStart(1) -> onResume(1) -> onStop(2) -> onDestory(2)

在新的Activity中,点选硬件的“Back”按钮,可以让我们回到原本的Activity。

(4)退出结束

Flow: onPause -> onStop -> onDestory

如果程序中有直接调用“finishi”函数来关闭Activity的话,系统假设我们很确定我们在做什么,因此会直接跳过先冻结(Freeze)的阶段,暂停(Pause),停止(Stop),然后销毁(Destory)。

(5)回收后再启动

Flow: onCreate -> onStart -> onResume

被回收掉的Activity一旦重新被调用时,会像一般启动一样再次调用Activity的onCreate函数。

当我们使用Android手机一阵子,在手机上已经执行过多个应用程序。只要按下“Back”(返回)键,Android就会打开最近一次打开过的Activity。

这时候我们要是按下多次“Back”(返回)键,理论上迟早会返回到某个已经销毁(Destory)的Activity,这时候会发生什么事情呢??

如果应该打开的Activity已经被回收了,那么这个Activity会再次被创建(Create)出来。再次被创建出来的Activity,当然会跟原本我们打开过的Activity不一样。

所以如果要让再次被创建出来的Activity看起来跟原本打开过的一样,那么在Activity之间切换时候,我们就要留意保留数据:最好在每次Activity运行到“onPalse”或“onStop”状态时先保存数据,然后在“onCreate”时候将数据读出来即可!

浅谈Android的Activity运行流程(生命周期)的更多相关文章

  1. 浅谈Android之Activity生命周期

     Activity作为四大组件之一,出现的频率相当高,基本上我们在android的各个地方都能看见它的踪影,因此深入了解Activity,对于开发高质量应用程序是很有帮助的.今天我们就来详细地聊聊Ac ...

  2. 浅谈Android中Activity的生命周期

    引言 我想对于Android开发人员来说,Activity是再熟悉不过了,今天我们就来探讨下Activity的生命周期.熟悉的掌握Activity对于开发健壮的Android应用程序来说至关重要.下面 ...

  3. android:activity活动的生命周期

    掌握活动的生命周期对任何 Android 开发者来说都非常重要,当你深入理解活动的生命 周期之后,就可以写出更加连贯流畅的程序,并在如何合理管理应用资源方面,你会发挥的 游刃有余.你的应用程序将会拥有 ...

  4. Android活动(Activity)创建及生命周期

       Activity是Android的门面,可以与用户进行互动的重要模块,凡是在应用中可以看到的东西,都是放在活动中的.   在学习新的技术时,我喜欢将需要学习的技术与自己懂得技术进行类似比较,而活 ...

  5. 浅谈Android应用保护(一):Android应用逆向的基本方法

    对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇 ...

  6. Android Small插件化框架解读——Activity注册和生命周期

    通过对嵌入式企鹅圈原创团队成员degao之前发表的<Android Small插件化框架源码分析>的学习,对Android使用的插件化技术有了初步的了解,但还是有很多需要认真学习的地方,特 ...

  7. 浅谈Android应用性能之内存

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 文/ jaunty [博主导读]在Android开发中,不免会遇到许多OOM现象,一方面可能是由于开 ...

  8. 【ASP.NET MVC系列】浅谈ASP.NET MVC运行过程

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  9. 浅谈android代码保护技术_ 加固

    浅谈android代码保护技术_加固 导语 我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk,结果被人反编译了,那心情真心不舒服.虽然我们混淆,做到native层,但 ...

随机推荐

  1. JAVA List<T> 如何初始化

    通常用法:List<类型> list=new ArrayList<类型>();List是一个接口,不可实例化,通过实例化其实现类来使用List集合,他的最常用实现类ArrayL ...

  2. jTDS Java连接SQL Server 2000数据库

    Java连接SQL Server 2000数据库时,有两种方法: (1)通过Microsoft的JDBC驱动连接.此JDBC驱动共有三个文件,分别 是mssqlserver.jar.msutil.ja ...

  3. 利用dokan作虚拟磁盘开发

    dokan是用户态的文件系统驱动,可以称之为fuse for windows.可以用来开发虚拟磁盘,即在“我的电脑”中虚拟出一个硬盘来,可以是硬盘,也可以是可移动磁盘或者网络硬盘. CreateFil ...

  4. 伸展二叉树树(C#)

    参考过好几篇关于将伸展树的代码,发现看不懂.看图能看懂原理.就尝试自己实现了下. 自顶向上的算法. using System; using System.Collections.Generic; us ...

  5. Polipo

    polipo代理服务器简介 HTTP代理polipo的配置与使用:http://wuwei5460.blog.51cto.com/2893867/1407369/

  6. The 2014 ACMICPC Asia Regional Beijing Online

    [A]极角排序+树状数组 [B]计算几何,凸包(队友已出) [C]-_-///不懂 [D]数论,概率密度 [E]图的连通性+Floyed传递闭包+bitset [F]贪心 [G]签到题 [H]区间维护 ...

  7. javascript 中 arguments.callee属性

    javascript 中 arguments.callee属性 可以在函数内部,指向的是这个函数(或者叫做“类”)本身. 相当于PHP 中的 self 关键字. The arguments.calle ...

  8. jquery中,使用append增加元素时,该元素的绑定监听事件失效

    举例:如果在一个<div id="resultArea"></div>中,通过append添加一个id="checkOutTip"的文本 ...

  9. (简单) HDU 3397 Sequence operation,线段树+区间合并。

    Problem Description lxhgww got a sequence contains n characters which are all '0's or '1's. We have ...

  10. LPC1788的spi使用

    #ifndef __SPI_H_ #define __SPI_H_ #include "common.h" #include "delay.h" // cs p ...