- 浏览: 880185 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
hzw2312:
C = sin(MLatA)*sin(MLatB)*cos(M ...
根据地球上任意两点的经纬度计算两点间的距离 -
zhang_sun:
rewind方法的limit又是多少呢?等于capacity? ...
ByteBuffer的flip,clear及rewind区别 -
kalogen:
一种每次都获取到不同的随机数的办法int ranseed=12 ...
J2ME中Random类的使用 -
kalogen:
估计部署在某个端口下吧,仔细检查一下发布的配置文件
Tomcat负载均衡和集群环境的搭建 -
zhuchao_ko:
文件大点就嗝屁了~~~
Axis 1.4 上传二进制文件(base64Binary)
引言
应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束实例被销毁。在这期间,他们有时候处于激活状态,有时候处于非激活状态;对于活动,对用户有时候可见,有时候不可见。组件生命周期将讨论活动、服务、广播接收者的生命周期——包括在生命周期中他们可能的状态、通知状态改变的方法、及这些状态的组件寄宿的进程被终结和实例被销毁的可能性。
本文主要讨论活动的生命周期及他们可能的状态、通知状态改变的方法。分为以下三部分:
- 1、活动生命周期
- 2、保存活动状态
- 3、协调活动
1、活动生命周期
一个活动有三个基本状态:
- 激活状态或运行状态,这时它运行在屏幕的前台(处于当前任务活动栈的最上面)。这个活动有用户的操作的焦点。
- 暂停状态,这时活动失去焦点但是它对用户仍可见。也就是说,另一个活动在它的上面且那个活动是透明的或者没有覆盖整个屏幕,因此通过它可以看见暂停状态的活动。一个暂停的活动完全是活着的(它维护着所有的状态和成员信息,且仍然依附在窗口管理器),但是当内存极小时可以被系统杀掉。
- 停止状态,这时活动完全被其他活动掩盖。它仍然保留所有状态和成员信息,但是对用户它不可见,因此它的窗口时隐藏的且当其他地方需要内存时它往往被系统杀掉。
如果一个活动被暂停或停止,系统可以将它从内存移除,通过要求它结束(通过调用它的finish()方法),或简单地杀掉它的进程。当它再次显示给用户时,必须要完全重新启动和恢复到之前的状态。随着活动从一个状态转为另一个状态,通过调用下面的受保护的方法通知该改变:
- void onCreate(Bundle saveInstanceState)
- void onStart()
- void onRestart()
- void onResume()
- void onPause()
- void onStop()
- void onDestroy()
所有这些方法都是钩子,你可以重写当状态改变时做适当的工作。所有的活动必须要实现onCreate()去做一些初始化的设置,当对象第一次实例化的时候。很多活动也会实现onPause()去提交数据修改或准备停止与用户交互。
将他们合并在一起,这七个方法定义了活动的整个生命周期。有三个嵌套的循环,你可以通过这七个方法监视:
- 活动的整个生命时间,从第一次调用onCreate()开始直到调用onDestroy()结束。一个活动在onCreate()中做所有的“全局”状态的初始设置,在onDestroy()中释放所有保留的资源。举例来说,有一个线程运行在后台从网络上下载数据,它可能会在onCreate()中创建线程,在onDestroy()中结束线程。
- 活动的可视生命时间,从调用onStart()到相应的调用onStop() 。在这期间,用户可以在屏幕上看见活动,虽然它可能不是运行在前台且与用户交互。在这两个方法之间,你可以保持显示活动所需要的资源。举例来说,你可以在onStart()中注册一个广播接收者监视影响你的UI的改变,在onStop() 中注销。因为活动在可视和隐藏之间来回切换,onStart()和onStop() 可以调用多次。
- 活动的前台生命时间,从调用onResume()到相应的调用onPause()。在这期间,频繁地在重用和暂停状态转换——例如,当设备进入睡眠状态或一个新的活动启动时调用onPause(),当一个活动返回或一个新的意图被传输时调用onResume()。因此,这两个方法的代码应当是相当轻量级的。
下面这个图解释了这三个循环和状态之间状态的可能路径。着色的椭圆表示活动的主要状态,矩形表示当活动在状态之间转换时你可以执行的回调方法。
图1、活动生命周期(来源:Android SDK)
下面的表格对每个方法更详细的描述和在活动的整个生命周期中的定位。
注意上面表格的Killable列,它表示当方法返回时没有执行活动的其它代码,系统是否能杀死活动寄宿的进程。三个方法(onPause()、onStop()、onDestroy())标记为Yes。因为onPause()是唯一一个保证在进程被杀之前会调用的,因此你应该使用onPause()来写任何持久化存储数据。
被标记为No的方法保护活动寄宿的进程在他们调用的时候不会被杀掉。因此活动是可杀掉状态,例如onPause()返回到onResume()调用期间。直到onPause()再次返回,活动是不可杀掉的。其实,没有标记为Killable的活动也是可以系统被杀掉的,不过这仅仅发生在极端困难的情况下,没有有任何其他资源可用。
2、保存活动状态
当系统而不是用户关闭一个活动来节省内存时,用户可能希望返回到活动且是它之前的状态。为了获得活动被杀之前的状态,你可以执行活动的onSaveInstanceState()方法。Android在活动容易被销毁前调用这个方法,也就是调用onPause()之前。该方法的参数是一个Bundle对象,在这个对象你可以以名值对记录活动的动态状态。当活动再次启动时,Bundle同时被传递到onCreate()和调用onCreate()之后的方法,onRestoreInstanceState(),因此使用一个或两个可以重新创建捕获的状态。
因为onSaveInstanceState()方法不总是被调用,你应该仅使用onSaveInstanceState()它来记录活动的临时状态,而不是持久的数据。应该使用onPause()来存储持久数据。
3、协调活动
当一个活动启动另一个活动,他们都经历生命周期转换。一个暂停或许是停止,然而另一个启动。有时,你可能需要协调这些活动。生命周期的回调顺序是明确界定的,特别是当这两个活动在同一个进程中:
- 当前活动的onPause()方法被调用。
- 接下来,启动活动的onCreate()、onStart()、onResume()方法按序被调用。
- 然后,如果获得不再在屏幕上可见,它的onStop()方法被调用。
修正:第一节——活动生命周期中的表格第一、二行中的第二列(description)中的onRestart()应该为onStart()。
1000多的点击,居然没有人发现这个错误,看了大家根本就没认真看或者说根本没有静心看园子里的任何博文,心痛!还是水帖比较受欢迎。
作者:吴秦
出处:http://www.cnblogs.com/skynet/
=========================================================================
对手机有所研究的朋友们,应该对于Android这一手机操作系统并不陌生。它是一款基于Linux平台的开源手机操作系统。我们在这里会通过对Android Activity生命周期的介绍来充分的了解一下这一系统的基本原理。
注意到在Activity的API中有大量的onXXXX形式的函数定义,除了我们前面用到的onCreate以外,还有onStart,onStop以及onPause等等。从字面上看,它们是一些事件回调,那么次序又是如何的呢?其实这种事情,自己做个实验最明白不过了。在做这个实验之前,我们先得找到在Android中的Log是如何输出的。
显然,我们要用的是android.util.log类,这个类相当的简单易用,因为它提供的全是一些静态方法:
- Log.v(String tag, String msg); //VERBOSE
- Log.d(String tag, String msg); //DEBUG
- Log.i(String tag, String msg); //INFO
- Log.w(String tag, String msg); //WARN
- Log.e(String tag, String msg); //ERROR
前面的tag是由我们定义的一个标识,一般可以用“类名_方法名“来定义。
输出的LOG信息,如果用Eclipse+ADT开发,在LogCat中就可以看到,否则用adb logcat也行,不过我是从来都依赖于IDE环境的。
好了,现在我们修改前面的HelloThree代码:
- public void onStart()
- ...{
- super.onStart();
- Log.v(TAG,"onStart");
- }
- public void onStop()
- ...{
- super.onStop();
- Log.v(TAG,"onStop");
- }
- public void onResume()
- ...{
- super.onResume();
- Log.v(TAG,"onResume");
- }
- public void onRestart()
- ...{
- super.onRestart();
- Log.v(TAG,"onReStart");
- }
- public void onPause()
- ...{
- super.onPause();
- Log.v(TAG,"onPause");
- }
- public void onDestroy()
- ...{
- super.onDestroy();
- Log.v(TAG,"onDestroy");
- }
- public void onFreeze(Bundle outState)
- ...{
- super.onFreeze(outState);
- Log.v(TAG,"onFreeze");
- }
在HelloThreeB中也同样增加这样的代码,编译,运行一下,从logcat中分析输出的日志。
在启动第一个界面Activity One时,它的次序是:
- onCreate (ONE) - onStart (ONE) - onResume(ONE)
虽然是第一次启动,也要走一遍这个resume事件。然后,我们点goto跳到第二个Activity Two中(前一个没有关闭),这时走的次序是:
- onFreeze(ONE) - onPause(ONE) - onCreate(TWO) - onStart(TWO) - onResume(TWO) - onStop(ONE)
说明,第二个Activity Two在启动前,One会经历一个:冻结、暂停的过程,在启动Two后,One才会被停止?
然后,我们再点back回到第一个界面,这时走的次序是:
- onPause(TWO) - onActivityResult(ONE) - onStart(ONE) - onRestart(ONE) - onResume(ONE) - onStop(TWO) - onDestroy(TWO)
说明,返回时,Two没有经历冻结就直接暂停了,在One接收参数,重启后,Two就停止并被销毁了。最后,我们点一下Exit退出应用,它的次序是:
- onPause(ONE) - onStop(ONE) - onDestroy(ONE)
说明如果我们用了finish的话,不会有freeze,但是仍会经历pause - stop才被销毁。
这里有点疑问的是:为什么回来时先是Start才是Restart?可是文档中的图上画的却是先restart再start的啊?不过,后面的表格中的描述好象是正确的,start后面总是跟着resume(如果是第一次)或者restart(如果原来被stop掉了,这种情况会在start与resume 中插一个restart)。
下面不跑例子了,看看Android Activity生命周期的文档吧。
1.Android用Activity Stack来管理多个Activity,所以呢,同一时刻只会有最顶上的那个Activity是处于active或者running状态。其它的Activity都被压在下面了。
2. 如果非活动的Activity仍是可见的(即如果上面压着的是一个非全屏的Activity或透明的Activity),它是处于paused状态的。在系统内存不足的情况下,paused状态的Activity是有可被系统杀掉的。只是不明白,如果它被干掉了,界面上的显示又会变成什么模样?看来下回有必要研究一下这种情况了。
3.几个事件的配对可以比较清楚地理解它们的关系。Create与Destroy配成一对,叫entrie lifetime,在创建时分配资源,则在销毁时释放资源;往上一点还有Start与Stop一对,叫visible lifetime,表达的是可见与非可见这么一个过程;最顶上的就是Resume和Pause这一对了,叫foreground lifetime,表达的了是否处于激活状态的过程。
4.因此,我们实现的Activity派生类,要重载两个重要的方法:onCreate()进行初始化操作,onPause()保存当前操作的结果。
除了Activity Lifecycle以外,Android还有一个Process Lifecycle的说明:
在内存不足的时候,Android是会主动清理门户的,那它又是如何判断哪个process是可以清掉的呢?文档中也提到了它的重要性排序:
1. 最容易被清掉的是empty process,空进程是指那些没有Activity与之绑定,也没有任何应用程序组件(如Services或者IntentReceiver)与之绑定的进程,也就是说在这个process中没有任何activity或者service之类的东西,它们仅仅是作为一个cache,在启动新的 Activity时可以提高速度。它们是会被优先清掉的。因此建议,我们的后台操作,最好是作成Service的形式,也就是说应该在Activity中启动一个Service去执行这些操作。
2.接下来就是background activity了,也就是被stop掉了那些activity所处的process,那些不可见的Activity被清掉的确是安全的,系统维持着一个 LRU列表,多个处于background的activity都在这里面,系统可以根据LRU列表判断哪些activity是可以被清掉的,以及其中哪一个应该是最先被清掉。不过,文档中提到在这个已被清掉的Activity又被重新创建的时候,它的onCreate会被调用,参数就是onFreeze时的那个Bundle。不过这里有一点不明白的是,难道这个Activity被killed时,Android会帮它保留着这个Bundle吗?
3.然后就轮到service process了,这是一个与Service绑定的进程,由startService方法启动。虽然它们不为用户所见,但一般是在处理一些长时间的操作(例如MP3的播放),系统会保护它,除非真的没有内存可用了。
4.接着又轮到那些visible activity了,或者说visible process。前面也谈到这个情况,被Paused的Activity也是有可能会被系统清掉,不过相对来说,它已经是处于一个比较安全的位置了。
5.最安全应该就是那个foreground activity了,不到迫不得已它是不会被清掉的。这种process不仅包括resume之后的activity,也包括那些onReceiveIntent之后的IntentReceiver实例。
在Android Activity生命周期的讨论中,文档也提到了一些需要注意的事项:因为Android应用程序的生存期并不是由应用本身直接控制的,而是由 Android系统平台进行管理的,所以,对于我们开发者而言,需要了解不同的组件Activity、Service和IntentReceiver的生命,切记的是:如果组件的选择不当,很有可能系统会杀掉一个正在进行重要工作的进程。
发表评论
-
Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
2013-08-02 15:27 676Installation error: INSTALL_PA ... -
解决ADB server didn't ACK问题
2013-08-01 16:06 1002之前运行eclipse执行android应用都没问题,今天突然 ... -
Android应用签名
2013-01-08 15:05 1361为了要签名? 开发Android的人这么多,完全 ... -
Android中图片与屏幕密度 .
2012-10-10 14:19 859在drawable中的图片在不同密度的设备上显示时,在屏幕上的 ... -
在电脑上安装Android模拟器-部分更新详解
2012-10-09 17:03 1376本文根据如下的模拟器 ... -
android 反射机制中 getMethod()和getDeclaredField()区别
2012-09-15 11:33 10390今天在程序中用到java反 ... -
android2.2 的cookie
2012-08-29 19:22 920public static void getCookies(H ... -
把第三方的jar打包到android的apk文件中
2012-08-23 16:34 2410在android项目中新建一个文件夹libs,必须用这个,不能 ... -
Android调用天气预报的WebService简单例子
2012-08-23 11:47 1009下面例子改自网上例子:http://express.ruank ... -
android 正则表达式
2012-08-21 15:58 1297只能输入数字:"^[0-9]*$"。只能输 ... -
用反射功能找不到匹配的类的时候调试方法
2012-08-19 14:17 3555可以通过输出所有的methods 或者declaredMeth ... -
Android-----WebView使用
2012-08-01 20:06 1034大部分内容为网上整理其它高人的帖子,现只作整理,用于查看: ... -
Android开发_如何调用系统默认浏览器访问
2012-08-01 19:31 1016一、启动android默认浏览 ... -
Android代码混淆的实践
2012-07-20 12:48 873发apk的时候当然要考虑保护好自己的代码,Android环境就 ... -
Android 获取文件目录以及文件的删除 .
2012-07-14 22:24 1370//看来看一下效果 //main.xml文件 & ... -
Android Intent的几种用法全面总结
2012-07-14 14:21 886Intent应该算是Android中特有的东西。你可以 ... -
最简单的获取未安装APK文件图标、包名的方法
2012-07-13 17:14 1485package lab.sodino.fetchapkicon ... -
Android获取未安装或已安装apk的版本、图标等资源 .
2012-07-12 23:06 1510在上篇博文中介绍了Android动态加载APK--代码安装、获 ... -
Android 动态加载APK--代码安装、获取资源及Intent调用已安装apk .
2012-07-12 23:05 7111最近在研究Android动态加载APK技术,偶有小得,共享一下 ... -
android系统中 从一个apk启动另外一个apk
2012-07-12 21:24 1573Intent mIntent = new Intent(“an ...
相关推荐
本文将深入探讨“android生命周期研究”,并基于提供的标签“源码”和“工具”进行详细阐述。 首先,Android应用的主要组件有四大类:Activity、Service、BroadcastReceiver和ContentProvider。每个组件都有其独特...
在Android应用开发中,理解并熟练掌握Activity的生命周期至关重要,因为它是构成应用程序核心功能的基石。本案例将深入探讨Android Activity的生命周期,并通过具体的图片示例进行解释。 首先,Activity生命周期是...
在Android应用开发中,Activity和Fragment是两个至关重要的组件,它们构成了用户界面的主要部分,并各自拥有独特的生命周期。本文将深入探讨Activity和Fragment的生命周期,帮助开发者更好地理解和掌握这两个组件的...
本文将详细探讨Android Activity的生命周期,以及如何通过源码分析和使用工具进行深入研究。 Activity的生命周期由一系列回调方法构成,这些方法在特定时刻被系统调用,指示Activity的状态变化。主要的生命周期回调...
通过研究该项目,你可以深入理解如何有效地在Android应用中集成RxJava并处理其生命周期。项目的源码会包含详细的注释和示例,帮助开发者更好地理解和应用这一最佳实践。通过这种方式,开发者可以编写更健壮、更易于...
android-lifecycle, Android Activity/fragment 生命周期的图表 完整的Android fragment & Activity 生命周期尝试了解各种各样的片段之后,我做了一些研究并将完整的Android Activity/fragment 生命周期结合起来。...
在Android应用开发中,程序生命周期的管理是至关重要的。Android系统的特性决定了程序的生命周期并非完全由应用程序自身控制,而是由操作系统根据用户交互和系统资源管理来决定。这可能导致在某些情况下,用户关闭...
了解Activity的生命周期是每个Android开发者必备的知识。Activity的生命周期由一系列的方法组成,这些方法会在特定时刻被系统调用,例如当Activity创建、启动、暂停、恢复或销毁时。通过分析Activity的源代码,我们...
在这种情况下,RxLife库可能还提供了其他高级功能,如支持组合多个生命周期源,或者与其他流行的生命周期库(如Android Architecture Components的Lifecycle)集成。 总之,理解并正确使用如RxLife这样的生命周期...
AndroidApplication是应用程序的入口点,它定义了应用程序的全局状态和生命周期。通过分析AndroidApplication,可以了解应用程序如何初始化、如何响应系统事件以及如何与其他组件交互。 ### **21. Android应用框架...
总结,Fragment是Android开发中的重要工具,理解其生命周期和使用技巧对于创建高效、可维护的应用至关重要。通过对源码的深入学习,开发者可以解决实际问题,提升应用性能。在实际项目中,灵活运用Fragment,可以...
系统运行时类库层包括多个子系统和Android运行时,其中Dalvik虚拟机负责对象生命周期、线程和安全管理。 Android的安全机制主要包括以下几个方面: 1. 权限管理:Android采用基于权限的访问控制模型,每个应用在...
Android的测试与普通的Java测试有所不同,因为它们涉及到Android组件的生命周期。我们可以使用`@UiThreadTest`和`@UiThreadTest`注解来分别在主线程和工作线程中执行测试。 六、AndroidTestCase与Espresso 虽然...
理解View的生命周期、绘制流程、测量与布局过程至关重要。开发者需要了解onMeasure()、onLayout()和onDraw()方法,以及如何通过自定义View来实现复杂的UI效果。 2. **ImageView研究文档**:ImageView用于显示图片,...
Android应用源码之(Activity生命周期).zip项目安卓应用源码下载Android应用源码之(Activity生命周期).zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
Android应用源码之8.Activity生命周期.zip项目安卓应用源码下载Android应用源码之8.Activity生命周期.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
这通常涉及到添加依赖,配置权限,以及初始化和管理Gecko的生命周期。例如,可能需要在AndroidManifest.xml中声明必要的权限,如互联网访问权限。 2. **创建WebView替代方案**:基于Gecko的浏览器需要创建一个新的...
用组件和Activity生命周期,对Android平台底层组件软件开发和应 用层软件开发方法进行了深入研究。在此基础上,运用这两种开发方 法分别设计实现了Android音视频编解码软件和Android录音机软 件。
总结来说,"Android的Fragment演示程序"涵盖了Fragment的基本概念、生命周期、与Activity的交互、数据传递以及用户事件处理等多个方面。通过详细研究FragmentDemo,开发者可以深化对Fragment的理解,提高构建高效、...
不过Android不太突出的进程概念,所以对静态变量的生命周期就会感觉模糊,这种模糊对于值类型是无所谓的,如果是静态的对象引用,则与内存回收、内存泄漏这些问题有关,有必要加深研究和理解。 一、静态变量在类被...