<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_code4fun</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/68933/rss</id><updated>2010-04-08T08:26:02Z</updated><author><name>code4fun</name><uri>http://www.cnblogs.com/code4fun/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/code4fun/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/68933/rss"/><entry><id>http://www.cnblogs.com/code4fun/archive/2010/04/08/1707478.html</id><title type="text">分析android动画模块</title><summary type="text">转自 http://www.linuxgraphics.cn/animation/android_tween_animation.html作者: 刘鹏Android 平台提供了两类动画，一类是 Tween 动画，即通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果；第二类是 Frame 动画，即顺序播放事先做好的图像，跟电影类似。本文分析了 Tween 动画的实现原理。主要思路Twe...</summary><published>2010-04-08T08:22:00Z</published><updated>2010-04-08T08:22:00Z</updated><author><name>code4fun</name><uri>http://www.cnblogs.com/code4fun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/code4fun/archive/2010/04/08/1707478.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/code4fun/archive/2010/04/08/1707478.html"/><content type="html">&lt;p&gt;转自 http://www.linuxgraphics.cn/animation/android_tween_animation.html&lt;/p&gt;&#xD;
&lt;p&gt;&lt;b&gt;作者:&lt;/b&gt;                          刘鹏&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Android 平台提供了两类动画，一类是 Tween 动画，即通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果；第二类是 Frame 动画，即顺序播放事先做好的图像，跟电影类似。本文分析了 Tween 动画的实现原理。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;主要思路&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p &gt;Tween 动画通过对 View 的内容完成一系列的图形变换 (包括平移、缩放、旋转、改变透明度)来实现动画效果。&lt;/p&gt;&#xD;
&lt;p&gt;具体来讲，预先定义一组指令，这些指令指定了图形变换的类型、触发时间、持续时间。这些指令可以是以 XML 文件方式定义，也可以是以源代码方式定义。程序沿着时间线执行这些指令就可以实现动画效果。&lt;/p&gt;&#xD;
&lt;p&gt;动画的进度使用 Interpolator 控制，android 提供了几个 Interpolator 子类，实现了不同的速度曲线，如LinearInterpolator 实现了匀速效果、 Accelerateinterpolator 实现了加速效果、DecelerateInterpolator 实现了减速效果等。还可以定义自己的 Interpolator 子类，实现抛物线、自由落体等物理效果。&lt;/p&gt;&#xD;
&lt;p&gt;动画的运行模式有两种：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;独占模式，即程序主线程进入一个循环，根据动画指令不断刷新屏幕，直到动画结束；&lt;/li&gt;&#xD;
&lt;li&gt;中断模式，即有单独一个线程对时间计数，每隔一定的时间向主线程发通知，主线程接到通知后更新屏幕；&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;图形变换通过仿射矩阵实现。图形变换是图形学中的基本知识。简单来说就是，每种变换都是一次矩阵运算。在 &lt;a href="http://www.linuxgraphics.cn/android/index.html"&gt;Android&lt;/a&gt; 中，Canvas 类中包含当前矩阵，当调用 Canvas.drawBitmap (bmp, x, y, Paint) 绘制时，android 会先把 bmp 做一次矩阵运算，然后将运算的结果显示在 Canvas 上。这样，编程人员只需不断修改 Canvas 的矩阵并刷新屏幕，View 里的对象就会不停的做图形变换，动画就形成了。&lt;/p&gt;&#xD;
&lt;p&gt;在 android 中提供了 Animation 、 Interpolator、Transformation 等类具体实现 Tween 动画，下面逐一分析。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Animation 类及其子类&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p &gt;Animation 类及其子类是动画的核心模块，它实现了各种动画效果，如平移、缩放、旋转、改变透明度等。&lt;/p&gt;&#xD;
&lt;p&gt;Tween 动画的每一桢都根据 Interpolator 对 view 的内容做一次图形变换，因此 Animation 的核心工作是做变换(transformation)。&lt;/p&gt;&#xD;
&lt;p&gt;Aniamtion 是基类，他记录了动画的通用属性和方法。主要的属性包括动画持续时间、重复次数、interpolator 等。动画里最重要的方法是 getTransformation (currentTime, outTransformation)，该方法根据当前间 (currentTime) 和 interpolator，计算当前的变换，在 outTransformation 中返回。&lt;/p&gt;&#xD;
&lt;p&gt;TranslateAnimation、RotateAnimation、AlphaAnimation 等是 Animation 的子类，分别实现了平移、旋转、改变 Alpha 值等动画。&lt;/p&gt;&#xD;
&lt;p&gt;每个动画都重载了父类的 applyTransformation 方法，这个方法会被父类的 getTransformation 方法调用。另外每个动画还有个 initialize 方法，完成初始化工作。&lt;/p&gt;&#xD;
&lt;p&gt;不同的动画具有不同的属性，如 RotateAnimation 的属性是起始角度、终止角度和旋转点坐标， TranslateAnimation 的属性是起始位置和终止位置。AlphaAnimation 的属性是起始 alpha 值和终止 alpha 值。&lt;/p&gt;&#xD;
&lt;p&gt;Animation 类及其子类的类图如下所示：&lt;/p&gt;&#xD;
&lt;table style="width: 100%;" &gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td align="center"&gt;&lt;img src="http://www.linuxgraphics.cn/images/animation/android_animation_animation_class.png" alt="android类及其子类" /&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td  align="center"&gt;android类及其子类&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Interpolator 类及其子类&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p &gt;Interpolator 定义了动画的变化速度，可以实现匀速、正加速、负加速、无规则变加速等；&lt;/p&gt;&#xD;
&lt;p&gt;Interpolator 是基类，封装了所有 Interpolator 的共同方法，它只有一个方法，即 getInterpolation (float input)，该方法 maps a point on the timeline to a multiplier to be applied to the transformations of an animation.&lt;/p&gt;&#xD;
&lt;p&gt;LinearInerpolator、AccelerateInterpolator， DecelerateInterpolator， AccelerateDecelerateInterpolator，CycleInterpolator 是 Interpolator 的子类，分别实现了匀速、加速、减速、变速、循环等效果。&lt;/p&gt;&#xD;
&lt;p&gt;对于 LinearInterpolator ，变化率是个常数，即 f (x) = x.&lt;/p&gt;&#xD;
&lt;pre &gt;public float getInterpolation(float input) {&lt;br /&gt;        return input;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;对于 AccelerateInterpolator，开始变化很慢，然后逐渐变快，即  f(x) = x*x 或者 f(x) = pow(x, 2*mFactor).&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('a33cd7fa-5686-4811-ad54-bd162288d609')"&gt;&lt;div id="cnblogs_code_open_a33cd7fa-5686-4811-ad54-bd162288d609"&gt;&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;&lt;span style="color: #000000;"&gt; getInterpolation(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;&lt;span style="color: #000000;"&gt; input) {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (mFactor &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;1.0f&lt;/span&gt;&lt;span style="color: #000000;"&gt;) {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;&lt;span style="color: #000000;"&gt;)(input &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; input);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt; &lt;span style="color: #000000;"&gt;        } &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;&lt;span style="color: #000000;"&gt;)Math.pow(input, &lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; mFactor);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;6&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;7&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;对于 AccelerateDecelerateInterpolator，变化率开始和结束都很慢，但中间很快，即 f(x) = (cos ((x+1)*PI) / 2.0f) + 0.5f.&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;&lt;span style="color: #000000;"&gt; getInterpolation(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;&lt;span style="color: #000000;"&gt; input) {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;&lt;span style="color: #000000;"&gt;)(Math.cos((input &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; Math.PI) &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;2.0f&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;0.5f&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;Interpolator 类及其子类的类图如下所示：&lt;/p&gt;&#xD;
&lt;table style="width: 100%;" &gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td align="center"&gt;&lt;img src="http://www.linuxgraphics.cn/images/animation/android_animation_interpolator_class.png" alt="Interpolator 类及其子类" /&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td  align="center"&gt;Interpolator 类及其子类&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Transformation 类&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p &gt;Transformation 记录了仿射矩阵 Matrix，动画每触发一次，会对原来的矩阵做一次运算， View 的 Bitmap 与这个矩阵相乘就可实现相应的操作(旋转、平移、缩放等)。&lt;/p&gt;&#xD;
&lt;p&gt;Transformation 类封装了矩阵和 alpha 值，它有两个重要的成员，一是 mMatrix，二是 mAlpha。&lt;/p&gt;&#xD;
&lt;p&gt;Transformation 类图如下所示：&lt;/p&gt;&#xD;
&lt;table style="width: 100%;" &gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td align="center"&gt;&lt;img src="http://www.linuxgraphics.cn/images/animation/android_animation_transformation_class.png" alt="Transformation 类图" /&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td  align="center"&gt;Transformation 类图&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;strong&gt;如何在 View 中实现动画&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p &gt;从逻辑上讲，实现动画需要如下几步：&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;view 创建动画对象，设置动画属性，调用 invalidate 刷新屏幕，启动动画；&lt;/li&gt;&#xD;
&lt;li&gt;invalidate 方法触发了 onDraw 函数；&lt;/li&gt;&#xD;
&lt;li&gt;在 onDraw 函数中：&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;调用动画的 getTransformation 方法，得到当前时间点的矩阵&lt;/li&gt;&#xD;
&lt;li&gt;将该矩阵设置成 Canvas 的当前矩阵&lt;/li&gt;&#xD;
&lt;li&gt;调用 canvas 的 drawBitmap 方法，绘制屏幕。&lt;/li&gt;&#xD;
&lt;li&gt;判断 getTransformation 的返回值，若为真，调用 invalidate 方法，刷新屏幕进入下一桢；若为假，说明动画完成。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;整个流程可用一个序列图表示：&lt;/p&gt;&#xD;
&lt;table style="width: 100%;" &gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td align="center"&gt;&lt;img src="http://www.linuxgraphics.cn/images/animation/android_animation_sequence.png" alt="Tween 动画序列图" /&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td  align="center"&gt;Tween 动画序列图&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;strong&gt;使用样例&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面的代码是一个 view，系统创建 view 时会调用 onCreate 方法，该方法定义了一个 TranslateAniamtion，指定了移动起点和终点，动画持续时间为 1s，最后调用 startAnimation 将该动画保存在 View 的成员 mCurrentAnianmtion 中并启动动画。&lt;/p&gt;&#xD;
&lt;p&gt;注意，在 View 中需要定义成员变量 mCurrentAnimation 和 mTransformation ，分别记录当前的动画和变换。另外需要定义成员函数 startAnimation 启动动画。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyView &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;extends&lt;/span&gt;&lt;span style="color: #000000;"&gt; View {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;    Animation mCurrentAnimation  &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;    Transformation mTransformation &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Transformation;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; setAnimation(Animation animation) {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;        mCurrentAnimation &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; animation;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (animation &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;) {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;            animation.reset();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; startAnimation(Animation animation) {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;        animation.setStartTime(animation.START_ON_FIRST_FRAME);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #000000;"&gt;        setAnimation(animation);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;        invalidate();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt; &lt;span style="color: #000000;"&gt;    onDraw (Canvas canvas) {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; curTime &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; SystemClock.uptimeMillis ();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (mCurrentAniamtion &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt; &lt;span style="color: #000000;"&gt;            canvas.drawBitmap (b, x, y, mPaint);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;mCurrentAnimation.isInitialized())  &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;initialize animation&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt; &lt;span style="color: #000000;"&gt;                mCurrentAnimation.initialize (w, h, pw, ph);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;40&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;41&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;boolean&lt;/span&gt;&lt;span style="color: #000000;"&gt; more &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; mCurrentAnimation.getTransformation (curTime, mTransformation);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;42&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;43&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(more) {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;44&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;45&lt;/span&gt; &lt;span style="color: #000000;"&gt;                Matrix m &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; canvas.getMatrix();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;46&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;47&lt;/span&gt; &lt;span style="color: #000000;"&gt;                canvas.setMatrix (mTransformation.getMatrix());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;48&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;49&lt;/span&gt; &lt;span style="color: #000000;"&gt;                canvas.drawBitmap (b, x, y, mPaint);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;50&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;51&lt;/span&gt; &lt;span style="color: #000000;"&gt;                canvas.setMatrix (m);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;52&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;53&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.invalidate ();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;54&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;55&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;56&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;57&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;58&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;59&lt;/span&gt; &lt;span style="color: #000000;"&gt;                mCurrentAnimation &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;60&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;61&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.invalidate ();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;62&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;63&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;64&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;65&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;66&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;67&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;68&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;69&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;70&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;71&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;72&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; onCreate (){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;73&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;74&lt;/span&gt; &lt;span style="color: #000000;"&gt;        Animation anim &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; TranslateAnimation (&lt;/span&gt;&lt;span style="color: #000000;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;20&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;75&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;76&lt;/span&gt; &lt;span style="color: #000000;"&gt;        anim.setDuration (&lt;/span&gt;&lt;span style="color: #000000;"&gt;1000&lt;/span&gt;&lt;span style="color: #000000;"&gt;); &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 1s&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;77&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;78&lt;/span&gt; &lt;span style="color: #000000;"&gt;        anim.setInterpolator (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; AcceleratInterpolator(&lt;/span&gt;&lt;span style="color: #000000;"&gt;3.0f&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;79&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;80&lt;/span&gt; &lt;span style="color: #000000;"&gt;        startAniamtion (anim);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;81&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;82&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;83&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;84&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;85&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/code4fun/aggbug/1707478.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/code4fun/archive/2010/04/08/1707478.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/code4fun/archive/2010/04/08/1707395.html</id><title type="text">android.app.Activity 的介绍</title><summary type="text">转自：http://www.blogjava.net/marshal-hird/archive/2008/07/25/217389.html发现当前Android的资料不是很多，而且对于Activity的介绍也很少，所以把官方文档的android.app.Activity的介绍翻译了一下，加入了一些自己的理解。各位如果觉得我自己理解的不对，请无视。欢迎邮件讨论。Activity 是用户唯一可以看得...</summary><published>2010-04-08T07:10:00Z</published><updated>2010-04-08T07:10:00Z</updated><author><name>code4fun</name><uri>http://www.cnblogs.com/code4fun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/code4fun/archive/2010/04/08/1707395.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/code4fun/archive/2010/04/08/1707395.html"/><content type="html">&lt;p&gt;转自：&lt;a  href="http://www.blogjava.net/marshal-hird/archive/2008/07/25/217389.html" style="color: #108ac6; text-decoration: underline;"&gt;http://www.blogjava.net/marshal-hird/archive/2008/07/25/217389.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;发现当前Android的资料不是很多，而且对于Activity的介绍也很少，所以把官方文档的android.app.Activity的介绍翻译了一下，加入了一些自己的理解。各位如果觉得我自己理解的不对，请无视。欢迎邮件讨论。&lt;/p&gt;&#xD;
&lt;div&gt;&lt;br /&gt;&#xD;
&lt;p&gt;Activity 是用户唯一可以看得到的东西。几乎所有的activity都与用户进行交互，所以Activity主要负责的就是创建显示窗口，你可以在这些窗口里使用&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#setContentView%28android.view.View%29"&gt;setContentView(View)&lt;/a&gt;来显示你自己的UI。activity展现在用户面前的经常是全屏窗口，你也可以将activity作为浮动窗口来使用（使用设置了&lt;a href="http://code.google.com/android/reference/android/R.attr.html#windowIsFloating"&gt;windowIsFloating&lt;/a&gt;的主题），或者嵌入到其他的activity（使用&lt;a href="http://code.google.com/android/reference/android/app/ActivityGroup.html"&gt;ActivityGroup&lt;/a&gt;）中。下面是两个几乎所有Activity的子类都实现了的方法。&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onCreate%28android.os.Bundle%29"&gt;onCreate(Bundle)&lt;/a&gt;这个方法是初始化 activity的地方. 最重要的是，你经常需要在这里使用&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#setContentView%28int%29"&gt;setContentView(int)&lt;/a&gt;来设置UI布局所使用的layout资源, 当你需要使用程序控制UI中的组件时可以使用 &lt;a href="http://code.google.com/android/reference/android/app/Activity.html#findViewById%28int%29"&gt;findViewById(int)&lt;/a&gt;来获得对应的视图。&lt;/li&gt;&#xD;
&lt;li&gt;当用户离开activity时你可以在&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onPause%28%29"&gt;onPause()&lt;/a&gt;进行相应的操作. 更重要的是，用户做的任何改变都应该在该点上提交 (经常提交到 &lt;a href="http://code.google.com/android/reference/android/content/ContentProvider.html"&gt;ContentProvider&lt;/a&gt;这里保存数据)。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;如果要使用&lt;a href="http://code.google.com/android/reference/android/content/Context.html#startActivity%28android.content.Intent%29"&gt;Context.startActivity()&lt;/a&gt;来启动activity, activity都必须在启动者应用包的&lt;code&gt;AndroidManifest.xml&lt;/code&gt;&lt;code&gt;文件中&lt;/code&gt;有对应的 &lt;a href="http://code.google.com/android/reference/android/R.styleable.html#AndroidManifestActivity"&gt;&amp;lt;activity&amp;gt;&lt;/a&gt;定义。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Activity类是 &lt;a href="http://code.google.com/android/intro/lifecycle.html"&gt;application'soverall lifecycle&lt;/a&gt; 的一个重要部分。&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;这里涉及到的主题: &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ol start="1"&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.blogjava.net/marshal-hird/archive/2008/07/25/217389.html#_Activity_%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F"&gt;Activity 生命周期&lt;/a&gt;    &lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.blogjava.net/marshal-hird/archive/2008/07/25/217389.html#_%E9%85%8D%E7%BD%AE%E6%94%B9%E5%8F%98"&gt;配置改变&lt;/a&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.blogjava.net/marshal-hird/archive/2008/07/25/217389.html#_%E5%90%AF%E5%8A%A8Activity%E5%B9%B6%E8%8E%B7%E5%BE%97%E7%BB%93%E6%9E%9C"&gt;启动Activity并获得结果&lt;/a&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.blogjava.net/marshal-hird/archive/2008/07/25/217389.html#_Saving_Persistent_State"&gt;保存持久状态&lt;/a&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.blogjava.net/marshal-hird/archive/2008/07/25/217389.html#_%E8%AE%B8%E5%8F%AF"&gt;许可&lt;/a&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.blogjava.net/marshal-hird/archive/2008/07/25/217389.html#_%E8%BF%9B%E7%A8%8B%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F"&gt;进程生命周期&lt;/a&gt; &lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Activity 生命周期&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;系统中的Activity可以通过一个activity栈来进行管理。当一个新的activity启动的时候，它首先会被放置在activity栈顶部并成为running状态的activity &amp;mdash;&amp;mdash; 之前的activity也在activity栈中，但总是被保存在它的下边，只有当这个新的activity退出以后之前的activity才能重新回到前景界面。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;所有的activity本质上有四种状态：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;activity在屏幕的前景中（activity栈的顶端），它是active或者running状态。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;activity失去了焦点但是仍然可见（这个activity顶上遮挡了一个透明的或者非全屏的activity），它的状态是paused。一个paused状态的activity完全是alive的（它维护自己所有的状态和成员信息，而且仍然在window    manager的管理中），但当系统内存极度贫乏时也会将其killed。 &lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;activity由于其他的activity而完全变暗，它就进入了stopped状态。它仍然保持着所有的状态和成员的信息，可是，他对于用户来说不可见，当别的地方需要内存的时候它经常会被killed。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;activity是paused或者stopped，系统需要将其清理出内存的时可以命令其finish或者简单kill其进程。当它重新在用户面前显示的时候，它必须完全重新启动并且将其关闭之前的状态全部恢复回来。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;下面的图表是Activity的状态图，直角矩形代表了callback方法，你可以实现这些方法从而使Activity在改变状态的时候执行你制定的操作。带颜色的椭圆形是Activity的主要状态。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://dl.javaeye.com/upload/attachment/164509/e7e1c8a0-0b6b-365e-801f-f90111e7a088.png" width="540" height="741" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里有三个比较关键的生命周期。&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;从最初调用&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onCreate%28android.os.Bundle%29"&gt;onCreate(Bundle)&lt;/a&gt;到最终调用&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onDestroy%28%29"&gt;onDestroy()&lt;/a&gt;称为&lt;strong&gt;完整生命周期&lt;/strong&gt;。Activity会在onCreate()进行所有&amp;ldquo;全局&amp;rdquo;状态的设置，在onDestroy()中释放所有持有的资源。举个例子，如果它有一个从网络上下载数据的后台线程，那他可能就会在onCreate()中创建这个线程并在onDestroy()中停止这个线程。 &lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;从activity调用&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onStart%28%29"&gt;onStart()&lt;/a&gt;开始，到调用对应的&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onStop%28%29"&gt;onStop()&lt;/a&gt;为止称为&lt;strong&gt;可见生命周期&lt;/strong&gt;。在这段时间内用户可以在屏幕上看到这个activity，尽管并不一定是在前景也不一定可以和用户交互。在这两个方法之间你可以维护那些activity在用户显示时所需的资源。举个例子来说，你可以在onStart()中注册一个&lt;a href="http://code.google.com/android/reference/android/content/IntentReceiver.html"&gt;IntentReceiver&lt;/a&gt;来监控那些可以对你的UI产生影响的环境改变，当你的UI不继续在用户面前显示时你可以在onStop()中注销这个&lt;a href="http://code.google.com/android/reference/android/content/IntentReceiver.html"&gt;IntentReceiver&lt;/a&gt;。每当activity在用户面前显示或者隐藏时都会调用相应的方法，所以onStart()和onStop()方法在整个生命周期中可以多次被调用。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;从activity调用&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onResume%28%29"&gt;onResume()&lt;/a&gt;开始，到调用对应的&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onPause%28%29"&gt;onPause()&lt;/a&gt;为止称为&lt;strong&gt;前景生命周期&lt;/strong&gt;，这段时间activity处于其他所有activity的前面，且与用户交互。一个activity可以经常在resumed和paused状态之间转换&amp;mdash;&amp;mdash;例如手机进入休眠时、activity的结果返回时、新的intent到来时&amp;mdash;&amp;mdash;所以这两个方法中的代码应该非常的简短。 &lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;下面的Activity方法定义了activity完整的生命周期。他们全都是hook方法，你可以重载这些方法从而使activity在状态改变时执行你所期望的操作。所有activity都应该实现自己的&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onCreate%28android.os.Bundle%29"&gt;onCreate(Bundle)&lt;/a&gt;方法来进行初始化设置；大部分还应该实现&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onPause%28%29"&gt;onPause()&lt;/a&gt;方法提交数据的修改并且准备终止与用户的交互。尽管我们计划在系统中添加更多的工具来管理应用，现在大多activity仍需要实现&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onFreeze%28android.os.Bundle%29"&gt;onFreeze()&lt;/a&gt;并且在&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onCreate%28android.os.Bundle%29"&gt;onCreate(Bundle)&lt;/a&gt;中执行对应的状态恢复。其他的方法可以在需要时进行实现，当实现这些方法的时候需要注意的是一定要调用父类中的对应方法。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;public class Activity extends ApplicationContext {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;protected void onCreate(Bundle icicle);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;protected void onStart();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;protected void onRestart();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;protected void onResume();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;protected void onFreeze(Bundle outIcicle);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;protected void onPause();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;protected void onStop();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;protected void onDestroy();&lt;br /&gt;&amp;nbsp;}&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一般来说activity的生命周期变化看起来比较象下面的表格：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;（此处译者进行了大块的修改，请参考&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;原文&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;阅读下面表格）&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&#xD;
&lt;table border="1" cellpadding="0" cellspacing="0" style="width: 662px; height: 973px;"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td colspan="3" valign="top" width="163"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;方法&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="240"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;描述&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="70"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Killable?&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="95"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;下一方法&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td colspan="3" valign="top" width="163"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onCreate%28android.os.Bundle%29"&gt;onCreate()&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="240"&gt;&#xD;
&lt;p&gt;Activity初次创建时被调用，你应该在这里进行一般的静态设置：创建view、将数据绑定到list等等。如果activity之前存在冻结状态，那么此状态将在Bundle中提供。&lt;/p&gt;&#xD;
&lt;p&gt;如果activity首次创建，本方法后将会调用onStart()，如果activity是停止后重新显示，则将调用onRestart()。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="70"&gt;&#xD;
&lt;p&gt;No&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="95"&gt;&#xD;
&lt;p&gt;&lt;code&gt;onStart()            or onRestart()&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td rowspan="6" valign="top" width="31"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td colspan="2" valign="top" width="132"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onStart%28%29"&gt;onStart()&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="240"&gt;&#xD;
&lt;p&gt;当activity对用户即将可见的时候调用。&lt;/p&gt;&#xD;
&lt;p&gt;其后调用onRestart()&lt;em&gt;或&lt;/em&gt;&lt;em&gt;onResume()&lt;/em&gt;&lt;strong&gt;(&lt;/strong&gt;&lt;strong&gt;框架是否进行选择性调用&lt;/strong&gt;&lt;strong&gt;onResume()&lt;/strong&gt;&lt;strong&gt;仅仅是猜测&lt;/strong&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="70"&gt;&#xD;
&lt;p&gt;No&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="95"&gt;&#xD;
&lt;p&gt;&lt;code&gt;onRestart()&lt;/code&gt; or onResume&lt;code&gt;()&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td colspan="2" valign="top" width="132"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onRestart%28%29"&gt;onRestart()&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="240"&gt;&#xD;
&lt;p&gt;当activity从停止状态重新启动时调用。其后调用onResume()。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="70"&gt;&#xD;
&lt;p&gt;No&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="95"&gt;&#xD;
&lt;p&gt;&lt;code&gt;onResume()&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td rowspan="3" valign="top" width="36"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="96"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onResume%28%29"&gt;onResume()&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="240"&gt;&#xD;
&lt;p&gt;当activity将要与用户交互时调用此方法，此时activity在activity栈的栈顶，用户输入已经可以传递给它。&lt;/p&gt;&#xD;
&lt;p&gt;如果其他的activity在它的上方恢复显示，则将调用onFreeze()。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="70"&gt;&#xD;
&lt;p&gt;No&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="95"&gt;&#xD;
&lt;p&gt;&lt;code&gt;onFreeze()&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="96"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onFreeze%28android.os.Bundle%29"&gt;onFreeze()&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="240"&gt;&#xD;
&lt;p&gt;当你的activity被暂停而其他的activity恢复与用户交互的时候这个方法会被调用（在其他activity显示之前），你可以使用这个方法保存你当前的用户状态（一般来说是当前实例的用户状态）。暂停之后，为了回收资源供给前景activity，系统会在需要的时间停止（或者kill）你的应用。以后如果你的activity启动一个新的实例重新与用户进行交互，你保存在这里的状态都将通过onCreate()方法传递给新的实例。&lt;/p&gt;&#xD;
&lt;p&gt;其后总是调用onPause()方法。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="70"&gt;&#xD;
&lt;p&gt;No&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="95"&gt;&#xD;
&lt;p&gt;&lt;code&gt;onPause()&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="96"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onPause%28%29"&gt;onPause()&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="240"&gt;&#xD;
&lt;p&gt;当系统要启动一个其他的activity时调用（其他的activity显示之前），这个方法被用来提&#xD;
&#xD;
&#xD;
&#xD;
&#xD;
&#xD;
交那些持久数据的改变、停止动画、和其他占用CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed，所以实现这个方法时代码执行要尽可能快。&lt;/p&gt;&#xD;
&lt;p&gt;如果activity重新回到前景时将调用onResume()，            如果对用户彻底不可见则会调用onStop()。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="70"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="95"&gt;&#xD;
&lt;p&gt;&lt;code&gt;onResume()&lt;/code&gt; or&lt;br /&gt;            &lt;code&gt;onStop()&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td colspan="2" valign="top" width="132"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onStop%28%29"&gt;onStop()&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="240"&gt;&#xD;
&lt;p&gt;当另外一个activity恢复并遮盖住此activity,导致其对用户不再可见时调用。一个新activity启动、其它activity被切换至前景、当前activity被销毁时都会发生这种场景。&lt;/p&gt;&#xD;
&lt;p&gt;当activity重新回到前景与用户交互时调用onRestart()，如果activity将退出则调用onDestory()。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="70"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="95"&gt;&#xD;
&lt;p&gt;&lt;code&gt;onStart()&lt;/code&gt; or&lt;br /&gt;            &lt;code&gt;onDestroy()&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td colspan="3" valign="top" width="163"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onDestroy%28%29"&gt;onDestroy()&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="240"&gt;&#xD;
&lt;p&gt;在你的activity被销毁前所调用的最后一个方法，当进程终止时会出现这种情况（对activity直接调用&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#finish%28%29"&gt;finish()&lt;/a&gt;方法或者系统为了节省空间而临时销毁此activity的实例，你可以通过&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#isFinishing%28%29"&gt;isFinishing()&lt;/a&gt;的返回值来区分这两种情况）。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="70"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="95"&gt;&#xD;
&lt;p&gt;&lt;em&gt;nothing&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;strong&gt;①&lt;/strong&gt;&lt;strong&gt;: &lt;/strong&gt;&lt;strong&gt;这个表格本人觉得还有些值得商榷的地方，建议作为参考阅读，不管是原文还是译文。&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;注意上表中&amp;ldquo;Killable&amp;rdquo;这一列 &amp;mdash;&amp;mdash; 对于那些标记killable的方法，当这些方法结束后，activity的进程可能在任何时间被系统kill而不再执行activity中的任何代码。因此你应该利用onFreeze()（保存你当前UI的状态）和onPause()（将所有的修改写回持久存储），这样activity才能在被kill的时候正确的保存当前的状态。如果需要了解一个进程的生命周期与他所执行的activity之间的关系 参见 &lt;a href="http://www.blogjava.net/marshal-hird/archive/2008/07/25/217389.html#_%E8%BF%9B%E7%A8%8B%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F"&gt;进程生命周期&lt;/a&gt; 部分。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对于那些标记killable的方法，从这些方法启动开始直到返回之前，activity的进程都不回被系统kill。举个例子，一个activity在onPause()方法返回后处于killable的状态，这种状态会一直持续到onResume()方法开始执行。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;配置改变&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果设备的配置（在&lt;a href="http://code.google.com/android/reference/android/content/Resources.Configuration.html"&gt;Resources.Configuration&lt;/a&gt;中进行了定义）发生改变，那么所有用户界面上的东西都需要进行更新，以适应新的配置。因为Activity是与用户交互的最主要的机制，它包含了处理配置改变的专门支持。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;除非你特殊指定，否则当配置发生改变（比如屏幕方向、语言、输入设备等等的改变）时你当前的activity都将被销毁，这销毁是通过一个正常的activity生命周期过程（&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onFreeze%28android.os.Bundle%29"&gt;onFreeze(Bundle)&lt;/a&gt;,&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onPause%28%29"&gt;onPause()&lt;/a&gt;,&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onStop%28%29"&gt;onStop()&lt;/a&gt;,和 &lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onDestroy%28%29"&gt;onDestroy()&lt;/a&gt;）进行的。如果activity之前正在前景画面，当这个实例的&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onDestroy%28%29"&gt;onDestroy()&lt;/a&gt;调用完成后将会启动这个activity的一个新的实例，并将前面那个实例中&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onFreeze%28android.os.Bundle%29"&gt;onFreeze(Bundle)&lt;/a&gt;所保存的内容传递给新的实例。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;因为任何的应用资源（包括layout文件）都有可能由于任何配置值而改变。因此处理配置改变的唯一安全的方法就是重新获取所有的资源，包括layout、绘图资源（原文drawables）、字符串资源。由于activity已经如何保存自己的状态并从这些状态中重建自身，所以activity重新启动自身来获得新的配置将是一个非常便利的途径。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在一些特殊的情况中，你可能希望当一种或者多种配置改变时避免重新启动你的activity。你可以通过在manifest中设置&lt;a href="http://code.google.com/android/reference/android/R.attr.html#configChanges"&gt;android:configChanges&lt;/a&gt;属性来实现这点。你可以在这里声明activity可以处理的任何配置改变，当这些配置改变时不会重新启动activity，而会调用activity的&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onConfigurationChanged%28android.content.Resources.Configuration%29"&gt;onConfigurationChanged(Resources.Configuration)&lt;/a&gt;方法。如果改变的配置中包含了你所无法处理的配置（在&lt;a href="http://code.google.com/android/reference/android/R.attr.html#configChanges"&gt;android:configChanges&lt;/a&gt;并未声明），你的activity仍然要被重新启动，而&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onConfigurationChanged%28android.content.Resources.Configuration%29"&gt;onConfigurationChanged(Resources.Configuration)&lt;/a&gt;将不会被调用。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;启动Activity并获得结果&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#startActivity%28android.content.Intent%29"&gt;startActivity(Intent)&lt;/a&gt;方法可以用来启动一个新的activity，这个activity将被放置在activity栈的栈顶。这个方法只有一个参数&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intent&lt;/a&gt;，这个参数描述了将被执行的activity。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;有时候你希望在一个activity结束时得到它返回的结果。举个例子，你可能启动一个activity来让用户从通讯簿中选择一个人；当它结束的时候将会返回这个所选择的人。为了得到这个返回的信息，你可以使用&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#startSubActivity%28android.content.Intent,%20int%29"&gt;startSubActivity(Intent,int)&lt;/a&gt;这个方法来启动新的activity，第二个整形参数将会作为这次调用的识别标记。这个activity返回的结果你可以通过&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#onActivityResult%28int,%20int,%20java.lang.String,%20android.os.Bundle%29"&gt;onActivityResult(int,int, String, Bundle)&lt;/a&gt;方法来获得，此方法的第一个参数就是之前调用所使用的识别标记。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;当activity退出的时候，它可以调用&lt;a href="http://code.google.com/android/reference/android/app/Activity.html#setResult%28int%29"&gt;setResult(int)&lt;/a&gt;来将数据返回给他的父进程。这个方法必须提供一个结果码，这个结果码可以使标准结果RESULT_CANCELED, RESULT_OK，也可以是其他任何从RESULT_FIRST_USER开始的自定义值。此外，它还可以返回一段字符串（经常是一段数据的URL地址），一个包含它所有希望值的Bundle。这些信息都会在父activity的回调函数&lt;code&gt;Activity.onActivityResult()&lt;/code&gt;&lt;code&gt;中出现，并连同最初提供的识别标记一起（此处有些拗口，意思其实就是子activity返回的内容、返回码、识别标记都将作为参数，按照不同的返回情况来调用父activity的Activity.onActivityResult()方法，以实现出现各种返回时父activity做出响应的处理）。&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果子activity由于某种情况发生失败（例如crashing），父activity将会收到RESULT_CANCELED结果码。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里是一个例子，说明了如何启动一个新的activity并处理结果。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;public class MyActivity extends Activity {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;...&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;static final int PICK_CONTACT_REQUEST = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public boolean onKeyDown(int keyCode, KeyEvent event) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// When the user center presses, let them pick a contact.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;startSubActivity(&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new Intent(Intent.PICK_ACTION,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uri.parse("content://contacts")),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;PICK_CONTACT_REQUEST);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;protected void onActivityResult(int requestCode, int resultCode,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Stringdata, Bundle extras) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (requestCode == PICK_CONTACT_REQUEST) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (resultCode == RESULT_OK) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// A contact was picked. &amp;nbsp;Here we willjust display it&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// to the user.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;startActivity(new Intent(Intent.VIEW_ACTION, &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Uri.parse(data)));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;code&gt;当一个按键被按下时onKeyDown()启动一个新的activity。当新的activity结束后onActivityResult()会被调用。&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;保存持久状态&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一般来说有两类持久状态需要activity来处理：类似于文档的共享数据（一般使用&lt;a href="http://code.google.com/android/reference/android/content/IContentProvider.html"&gt;contentprovider&lt;/a&gt;存储在SQLite数据库中）和就像用户参数设定一样的内部状态。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对于content provider的数据，我们建议activity使用&amp;ldquo;编辑即发生&amp;rdquo;用户模型。就是说，用户所做的任何编辑都将立即生效而不要求任何进一步的确认。下面两条规则可以使支持这种模型成为一件简单的事情。&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;创建一个新文档的时候，立即为它创建文件或者后台数据库条目。举例来说，如果用户要写一封新邮件，当他们开始输入的时候马上创建一个新的数据库条目，所以即使他们输入以后进入别的activity，这封邮件也会在草稿箱中出现。&lt;/li&gt;&#xD;
&lt;li&gt;当activity的onPause()方法被调用时，它应该将任何用户所做修改向后台的content provider 或者文件提交。这可以确保即将运行的其他activity可以看到这些修改。你可能会使用更激进的方式来在你的activity生命周期中关键的时间点上提交数据：例如在启动一个新的activity之前、终止你的activity之前、当用户在输入域之间切换时，等等。&lt;strong&gt;(译者注：根据文档的其他部份，个人觉得启动新activity之前及终止当前activity之前进行保存的说法都值得商榷，具体位置仍可能是在onPause()中)&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;这个模型是为了避免用户在activity之间切换时数据丢失而设计的，同时允许系统在activity处于paused状态后任何时间都可以安全的kill这个activity（因为其它地方可能需要系统资源）。注意这隐含着一个含义，即用户点击你activity的BACK键并不意味着&amp;ldquo;取消&amp;rdquo;&amp;mdash;&amp;mdash;它意味着保存他当前的内容并离开你的activity。Activity中取消编辑必须通过其他机制来提供，例如显式的提供"revert" 或 "undo"选项。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果需要了解更多关于content providers的信息，参见&lt;a href="file:///D:/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/Android/android-sdk_m5-rc15_windows/docs/reference/android/content/IContentProvider.html"&gt;contentpackage&lt;/a&gt;。这是不同的activity之间如何调用和彼此之间传递数据的关键。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Activity同时提供了API来管理与activity相关联的内部持久状态。这可以用来记忆用户日历的首选初始显示（日期视图或者周视图）或者用户web浏览器的缺省主页这类信息。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Activity持久状态使用&lt;a href="file:///D:/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/Android/android-sdk_m5-rc15_windows/docs/reference/android/app/Activity.html#getPreferences%28int%29"&gt;getPreferences(int)&lt;/a&gt;方法来管理，允许你取得和修改一系列与activity相关联的名称/取值对。如果要在应用的多个组件（activities,recivers,services,providers）之间共享参数，你可以使用底层方法&lt;a href="file:///D:/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/Android/android-sdk_m5-rc15_windows/docs/reference/android/content/Context.html#getSharedPreferences%28java.lang.String,%20int%29"&gt;Context.getSharedPreferences()&lt;/a&gt;来获得存储在一个特定名称下的参数对象。（注意：在applicationpackages之间不能共享设置数据 &amp;mdash;&amp;mdash; 如果要这么做的话你需要使用content provider）。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里摘录了一段日历activity中的代码，用来在永久设定中保存用户首选的视图模式。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;publicclass CalendarActivity extends Activity {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static final int DAY_VIEW_MODE = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static final int WEEK_VIEW_MODE = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private SharedPreferences mPrefs;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int mCurViewMode;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;protected void onCreate(Bundle icicle) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super.onCreate(icicle);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SharedPreferences mPrefs =getSharedPreferences();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mCurViewMode =mPrefs.getInt("view_mode" DAY_VIEW_MODE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&#xD;
&lt;p&gt;protected void onPause() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super.onPause();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SharedPreferences.Editor ed =mPrefs.edit();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ed.putInt("view_mode",mCurViewMode);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ed.commit();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;许可&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;你可以通过在Activity所属应用的manifest文件中对应的&lt;a href="file:///D:/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/Android/android-sdk_m5-rc15_windows/docs/reference/android/R.styleable.html#AndroidManifestActivity"&gt;&amp;lt;activity&amp;gt;&lt;/a&gt;标签中进行声明来限制哪些应用可以启动此Activity。如果你进行了声明，其它应用需要在他们自己的manifest文件中声明对应的&lt;a href="file:///D:/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/Android/android-sdk_m5-rc15_windows/docs/reference/android/R.styleable.html#AndroidManifestUsesPermission"&gt;&amp;lt;uses-permission&amp;gt;&lt;/a&gt;元素（&lt;strong&gt;而且需要在安装时被授予许可：译者注&lt;/strong&gt;）才可以启动这个activity。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果需要了解更多有关于一般安全机制和许可方面的信息可以参考&lt;a href="file:///D:/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/Android/android-sdk_m5-rc15_windows/docs/devel/security.html"&gt;SecurityModel&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;进程生命周期&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Android系统会尽量久的保留应用进程。但是当内存降低时最终还是要移除旧的进程。就像&lt;a href="http://www.blogjava.net/marshal-hird/archive/2008/07/25/217389.html#_Activity_%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F"&gt;Activity 生命周期&lt;/a&gt; 中描述的一样，移除哪个进程还是要取决于关联的用户与之交互的程度。一般来说，进程可以基于其中运行的activity所处的生命周期而分成四种状态，下面将这些状态根据重要程度排列。系统会在kill更重要的进程（第一个）之前首先kill那些不那么重要的进程（最后一个）。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;&lt;strong&gt;前景activity&lt;/strong&gt;（处于屏幕最上方，用户与之交互的activity）被认为是最重要的。如果设备上的内存无法满足它的使用，Kill此进程只能作为最后的手段。一般来说这个时候设备处于内存paging状态，为了使用户界面保持响应才会发出这个kill请求。&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;可见activity&lt;/strong&gt;（一个对用户可见，但是不在前景的activity，比如处在浮动对话框后）被认为是非常重要的，除非为了保证前景activity运行，否则不会被kill。&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;后台activity&lt;/strong&gt;（一个对用户不可见，并处于paused状态的activity）就不再重要了，所以当需要为其它前景的或者可见的activity运行而回收内存时系统可以很安全的kill它们。&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;空进程&lt;/strong&gt;是一个没有运行activity或者其他应用组件（比如&lt;a href="file:///D:/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/Android/android-sdk_m5-rc15_windows/docs/reference/android/app/Service.html"&gt;Service&lt;/a&gt;或者&lt;a href="file:///D:/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/Android/android-sdk_m5-rc15_windows/docs/reference/android/content/IntentReceiver.html"&gt;IntentReceiver&lt;/a&gt;类）的进程。当内存开始降低时系统很快就会kill掉这些进程。因此当你要在activity外运行任何的后台操作时，必须在IntentReceiver或Service的上下文环境中运行，这样系统才知道需要将你的进程保留而不是kill。&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;有些时候Activity可能需要长时间运行一个操作，且它并不依赖于activity的生命周期而存在。例如一个照相机应用可能允许你将照片上传到web站点。上传可能需要很长时间，在上传过程中应该允许用户离开这个应用。为了做到这一点，你的activity应该在上传时启动一个&lt;a href="file:///D:/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/Android/android-sdk_m5-rc15_windows/docs/reference/android/app/Service.html"&gt;Service&lt;/a&gt;来执行此工作。这将使系统在你的进程上传数据的过程中能够恰当的区分它的优先级（认为此进程比其他不可见应用更重要），不管原来的activity的状态是paused、stopped还是finished。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
文章可随意转载，但务必注明出处&lt;br /&gt;marshal.hird@gmail.com&lt;/div&gt;&lt;img src="http://www.cnblogs.com/code4fun/aggbug/1707395.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/code4fun/archive/2010/04/08/1707395.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/code4fun/archive/2010/04/08/1707389.html</id><title type="text">测试标题 测试标题 测试标题 测试标题 测试标题 测试标题 测试标题 测试标题 测试标题 测试标题 测试标题 测试标题 测试标题 测试标题 测试标题</title><summary type="text">测试内容 测试内容 测试内容 测试内容 测试内容 测试内容 测试内容 测试内容 测试内容 测试内容 测试内容 测试内容</summary><published>2010-04-08T07:04:00Z</published><updated>2010-04-08T07:04:00Z</updated><author><name>code4fun</name><uri>http://www.cnblogs.com/code4fun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/code4fun/archive/2010/04/08/1707389.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/code4fun/archive/2010/04/08/1707389.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; line-height: 150%; margin: 8px;"&gt;&#xD;
&lt;p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"&gt;测试内容 &amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; line-height: 150%; margin: 8px;"&gt;&#xD;
&lt;p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"&gt;测试内容 &amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; line-height: 150%; margin: 8px;"&gt;&#xD;
&lt;p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"&gt;测试内容 &amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; line-height: 150%; margin: 8px;"&gt;&#xD;
&lt;p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"&gt;测试内容 &amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; line-height: 150%; margin: 8px;"&gt;&#xD;
&lt;p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"&gt;测试内容 &amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; line-height: 150%; margin: 8px;"&gt;&#xD;
&lt;p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"&gt;测试内容 &amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; line-height: 150%; margin: 8px;"&gt;&#xD;
&lt;p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"&gt;测试内容 &amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; line-height: 150%; margin: 8px;"&gt;&#xD;
&lt;p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"&gt;测试内容 &amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; line-height: 150%; margin: 8px;"&gt;&#xD;
&lt;p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"&gt;测试内容 &amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; line-height: 150%; margin: 8px;"&gt;&#xD;
&lt;p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"&gt;测试内容 &amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; line-height: 150%; margin: 8px;"&gt;&#xD;
&lt;p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"&gt;测试内容 &amp;nbsp;&lt;/p&gt;&#xD;
&lt;meta http-equiv="content-type" content="text/html; charset=utf-8" /&gt;&#xD;
&lt;div style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; line-height: 150%; margin: 8px;"&gt;&#xD;
&lt;p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"&gt;测试内容 &amp;nbsp;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/code4fun/aggbug/1707389.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/code4fun/archive/2010/04/08/1707389.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
