﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-xxpyeippx</title><link>http://www.cnblogs.com/xxpyeippx/</link><description>xxp,I love u</description><language>zh-cn</language><lastBuildDate>Wed, 10 Feb 2010 08:23:12 GMT</lastBuildDate><pubDate>Wed, 10 Feb 2010 08:23:12 GMT</pubDate><ttl>60</ttl><item><title>翻译：Android程序开发入门</title><link>http://www.cnblogs.com/xxpyeippx/archive/2009/04/30/1447269.html</link><dc:creator>xxp</dc:creator><author>xxp</author><pubDate>Thu, 30 Apr 2009 14:52:00 GMT</pubDate><guid>http://www.cnblogs.com/xxpyeippx/archive/2009/04/30/1447269.html</guid><description><![CDATA[<p>阅读: 1977 评论: 3 作者: <a href="http://www.cnblogs.com/xxpyeippx/" target="_blank">xxp</a> 发表于 2009-04-30 22:52 <a href="http://www.cnblogs.com/xxpyeippx/archive/2009/04/30/1447269.html" target="_blank">原文链接</a></p><p style="background: #e2e2e2; margin: 0cm 0cm 0pt 99pt; text-indent: 31.6pt; line-height: normal"><a name="top"></a>&nbsp;<span style="font-size: 17pt; color: #333333; font-family: Arial">Android</span><span style="font-size: 17pt; color: #333333; font-family: 宋体">程序开发概述</span><span style="font-size: 17pt; color: #333333; font-family: Arial">Surance</span><span style="font-size: 17pt; color: #333333; font-family: 宋体">中文版</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.45pt"><strong><span style="font-family: 宋体">版权：</span></strong><strong></strong></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9.05pt; text-indent: 26.45pt"><strong><span style="font-family: 宋体">原文档版权归</span></strong><strong>Google</strong><strong><span style="font-family: 宋体">所有，该翻译版权属于尹树荣（</span></strong><strong><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#117;&#114;&#97;&#110;&#99;&#101;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">surance@gmail.com</a></strong><strong><span style="font-family: 宋体">）。</span></strong><strong></strong></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9.05pt; text-indent: 26.45pt"><strong><span style="font-family: 宋体">原文档版本：</span></strong><strong>android-sdk-windows-1.1_r1</strong></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9.05pt; text-indent: 26.45pt"><strong><span style="font-family: 宋体">翻译版本（指第几次翻译该版本）：</span></strong><strong>V1.0</strong></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9.05pt; text-indent: 26.45pt"><strong><span style="font-family: 宋体">开源协议：遵循创作共用版权协议，要求署名、非商业、保持一致。在满足创作共用版权协议的基础上可以随意转载</span></strong><strong>,</strong><strong><span style="font-family: 宋体">但请以超链接形式注明出处。本文链接地址为：</span></strong><strong>http://www.fltek.com.cn</strong></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9.05pt; text-indent: 26.45pt"><strong><span style="font-family: 宋体">免责声明：该翻译免费提供，不对正确性做出任何保证，由此造成任何问题，与翻译者一概无关。</span></strong><strong></strong></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt">Android<span style="font-family: 宋体">程序使用</span>java<span style="font-family: 宋体">书写。编译好的</span>java<span style="font-family: 宋体">程序可以通过</span><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/developing/tools/aapt.html"><span style="font-family: 'Courier New'">aapt<span style="font-size: 10pt; font-family: Arial"> tool</span></a> </span><span style="font-family: 宋体">压缩为</span>Android<span style="font-family: 宋体">包，后缀名为</span><code><span style="font-size: 12pt">.apk</span></code><code><span style="font-size: 12pt; color: windowtext">.</span></code><span style="font-family: 宋体">这样便于发布、部署在移动设备上。用户直接下载</span>apk<span style="font-family: 宋体">包用来安装，一个</span>apk<span style="font-family: 宋体">包被视为一个程序。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><span style="font-family: 宋体">每个</span>android<span style="font-family: 宋体">程序有自己的运行空间</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><span style="font-family: 宋体">默认每个程序有一个</span>Linux<span style="font-family: 宋体">进程。当程序运行的时候，</span>Android<span style="font-family: 宋体">建立一个进程；当程序关闭或者不再被系统使用的时候，</span>Android<span style="font-family: 宋体">回收这个进程。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><span style="font-family: 宋体">每个程序有自己的</span>java<span style="font-family: 宋体">虚拟机（</span>VM<span style="font-family: 宋体">），所以每个程序是和其他程序隔离的。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><span style="font-family: 宋体">默认每个程序有一个独立的</span>Linux<span style="font-family: 宋体">用户</span>ID<span style="font-family: 宋体">，文件只对这个用户可见，但是有其他的方法可以让程序之间通信。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt">2<span style="font-family: 宋体">个程序使用同一个用户</span>ID<span style="font-family: 宋体">也是可能的，这样这</span>2<span style="font-family: 宋体">个程序可以看到对方的文件。为了方便共享资源，使用同一个用户</span>ID<span style="font-family: 宋体">的程序分配同一个</span>Linux<span style="font-family: 宋体">进程，同一个</span>VM</p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9.05pt; text-indent: 36.55pt"><strong><span style="font-size: 14.5pt; color: #111111; font-family: 宋体">应用程序组件</span></strong><strong></strong></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt">Android<span style="font-family: 宋体">的一个特性是一个程序可以使用另一个程序的方法。比如，如果你的程序需要显示图片列表的滚动条，而另外一个程序已经开发了一个合适的滚动条，并且使它可以共享给其他程序，就可以使用这个滚动条，而不是自己开发一个。这样操作的时候，不需要引入或者连接其他的源代码，只是简单的开启另外一个程序即可。</span> </p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><span style="font-family: 宋体">具体操作为：系统必须可以启动所需要的进程并初始化</span>java<span style="font-family: 宋体">对象。所以，与其他操作系统不同，</span>Android <span style="font-family: 宋体">程序没有静态入口点函数</span> (<span style="font-family: 宋体">如没有</span> <code><span style="font-size: 12pt">main()</span></code><span style="font-family: 宋体">函数</span>). <span style="font-family: 宋体">取而代之的是，使用组件</span><em>components</em> <span style="font-family: 宋体">）。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9.05pt; text-indent: 26.45pt"><strong>Activities </strong></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt">&nbsp;<em>activity</em> <span style="font-family: 宋体">用来呈现用户界面。例如：菜单、文本框。虽然很多</span>activity<span style="font-family: 宋体">组成一个用户界面，但是每个</span>activity <span style="font-family: 宋体">都是独立的，并且继承自</span><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html">Activity</a> <span style="font-family: 宋体">类。<span style="color: red">（注：</span></span><span style="color: red">activity</span><span style="color: red; font-family: 宋体">即窗体）</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><span style="font-family: 宋体">一个程序可能只有一个</span>activity<span style="font-family: 宋体">，而另外一些程序，如短信发送程序，有许多</span>activity<span style="font-family: 宋体">。</span>Activitiy<span style="font-family: 宋体">是什么，需要多少，取决于程序的设计。一般来说，众多</span> activities<span style="font-family: 宋体">中的一个被设置为程序启动后第一个呈现给用户的，然后会显示其他的</span>activity<span style="font-family: 宋体">。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><span style="font-family: 宋体">每个</span> activity <span style="font-family: 宋体">有一个默认的窗口。一般来说，窗口文件填满屏幕，但是也有可能比窗口小或者在其他窗口上方。</span>activity <span style="font-family: 宋体">也可以作为额外窗口</span>— <span style="font-family: 宋体">如一个弹出对话框或者警告对话框</span>.</p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><span style="font-family: 宋体">窗口的内容靠有层次的</span>views<span style="font-family: 宋体">来呈现，</span>views<span style="font-family: 宋体">是继承自</span> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/view/View.html"><span style="font-size: 10pt; font-family: Arial">View</a> </span><span style="font-family: 宋体">类的对象。每个</span>view<span style="font-family: 宋体">控制着窗口中的一个特殊区域。父</span>views<span style="font-family: 宋体">包含子</span>views<span style="font-family: 宋体">。叶节点</span>views<span style="font-family: 宋体">响应用户的操作。所以，</span>views <span style="font-family: 宋体">是与用户互动的。例如：</span>view<span style="font-family: 宋体">可能是显示一个小图片，</span>Android<span style="font-family: 宋体">已经有很多内置的</span>views<span style="font-family: 宋体">，如按钮、文本框、滚动条、菜单、多选框等。<span style="color: red">（注：</span></span><span style="color: red">view</span><span style="color: red; font-family: 宋体">即控件）</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: Arial">view </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的显示是靠</span><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#setContentView(android.view.View)">Activity.setContentView()</a> <span style="font-size: 10pt; color: #333333; font-family: 宋体">方法。</span><em> </em><span style="font-size: 10pt; color: #333333; font-family: 宋体">（请参见</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/ui/index.html">User Interface</a> </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">文档</span><span style="font-size: 10pt; color: #333333; font-family: Arial">views</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">部分</span><span style="font-size: 10pt; color: #333333; font-family: Arial">) </span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9.05pt; text-indent: 26.45pt"><strong>Services </strong></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><em>service</em> <span style="font-family: 宋体">没有用户界面</span>,<span style="font-family: 宋体">而是运行在后台。例如：播放背景音乐、从网络下载数据、计算数据并提供给</span>activity<span style="font-family: 宋体">。</span>Service<span style="font-family: 宋体">继承自</span> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Service.html">Service</a> <span style="font-family: 宋体">类。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><span style="font-family: 宋体">常见的例子：</span>media player <span style="font-family: 宋体">从播放列表播放音乐，播放器有一些</span>activities<span style="font-family: 宋体">来叫用户选定歌曲并开始播放。但是，播放本身不需要</span>activity<span style="font-family: 宋体">处理，因为用户希望关闭</span>activity<span style="font-family: 宋体">后歌曲会继续播放。因此</span>media player <span style="font-family: 宋体">的</span>activity <span style="font-family: 宋体">会启动一个</span>service <span style="font-family: 宋体">。当用户离开窗体后，系统还可以保持歌曲的播放。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><span style="font-family: 宋体">可以与正在运行的</span>service<span style="font-family: 宋体">通信或者启动一个</span>service <span style="font-family: 宋体">。与</span>service<span style="font-family: 宋体">通信依赖于</span>service<span style="font-family: 宋体">公开的接口。例如音乐播放，接口可能允许用户暂停、启动、停止、继续播放列表。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><span style="font-family: 宋体">象</span>activities<span style="font-family: 宋体">和其他组件一样，</span>services<span style="font-family: 宋体">运行在应用程序的主线程。因此他们不会阻塞其他的组件或者用户界面。可以在服务中启用另外的线程来做耗时的工作，如音乐播放。请参见</span><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/fundamentals.html#procthread#procthread"><span style="font-size: 10pt; font-family: Arial">Processes and Threads</a>.</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9.05pt; text-indent: 26.45pt"><strong>Broadcast receivers </strong></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><em>broadcast receiver</em> <span style="font-family: 宋体">是一个接收并处理广播通知（</span>broadcast announcements<span style="font-family: 宋体">）的组件。多数的广播是系统发起的，如地域变幻、电池电量不足、图片获取、语言转换。程序也可以初始化一个广播，例如让其他的程序知道他们需要的某些数据被下载了。<span style="color: red">（注：通知广播即事件）</span></span> </p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><span style="font-family: 宋体">程序可以有任意数量的</span>broadcast receivers <span style="font-family: 宋体">来相应它觉得重要的通知。所有的</span>receivers <span style="font-family: 宋体">继承自</span> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/BroadcastReceiver.html">BroadcastReceiver</a> <span style="font-family: 宋体">类。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt">Broadcast receivers <span style="font-family: 宋体">不会显示用户界面，但是他们可能启动一个</span>activity <span style="font-family: 宋体">来相应收到的通知，或者使用</span> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/NotificationManager.html">NotificationManager</a> <span style="font-family: 宋体">通知用户。</span> <span style="font-family: 宋体">可以通过多种方式通知用户－开启背景灯、振动设备、播放声音等。最典型的是在状态栏显示一个图标，这样用户就可以点它打开看通知内容。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9.05pt; text-indent: 26.45pt"><strong>Content providers </strong></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><em>content provider</em> <span style="font-family: 宋体">创建其他程序使用的数据集。数据可以存在系统的</span>SQLite<span style="font-family: 宋体">数据库或者其他地方。</span>content provider <span style="font-family: 宋体">继承自</span> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/ContentProvider.html">ContentProvider</a> <span style="font-family: 宋体">类，实现一组标准的方法，来使其他程序可以存取数据。但是，程序并不是直接调用这些方法，而是使用</span><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/ContentResolver.html">ContentResolver</a> <span style="font-family: 宋体">对象来调用这些方法。</span>ContentResolve<span style="font-family: 宋体">的作用是管理</span>provider<span style="font-family: 宋体">和程序之间的多进程交互。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><span style="font-family: 宋体">请参见</span> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/providers/content-providers.html">Content Providers</a> <span style="font-family: 宋体">文档。</span> </p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><span style="font-family: 宋体">只要有需要调用特定组件的需求，</span>Android<span style="font-family: 宋体">就需要确保组件的程序进程正在运行，如果组件的线程没有启动，还要启动所需的进程。如果所需组件没有初始化，</span>Android<span style="font-family: 宋体">也会把它初始化。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9.05pt; text-indent: 36.55pt"><strong><span style="font-size: 14.5pt; color: #111111; font-family: 宋体">激活组件</span></strong><strong><span style="font-size: 14.5pt; color: #111111; font-family: Arial">: intents</span></strong></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><span style="font-family: 宋体">当</span>ContentResolver <span style="font-family: 宋体">发起一个请求的时候</span>Content providers <span style="font-family: 宋体">激活</span>. <span style="font-family: 宋体">另外三个组件：</span> — activities, services, <span style="font-family: 宋体">和</span> broadcast receivers — <span style="font-family: 宋体">被叫做</span><em>intents</em><span style="font-family: 宋体">的异步的消息激活。</span>intent <span style="font-family: 宋体">是一个保持了消息信息的</span> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Intent.html">Intent</a> <span style="font-family: 宋体">对象。对于</span>activities <span style="font-family: 宋体">和</span> services,<span style="font-family: 宋体">它传送了被请求的数据和特定的</span>URI<span style="font-family: 宋体">。例如，它可能传达一个请求，叫</span>activity<span style="font-family: 宋体">来呈现一个图片或者叫用户编辑某段文本。对于</span>broadcast receivers<span style="font-family: 宋体">，</span>Internt<span style="font-family: 宋体">对象传送了通知的动作。例如，它可能通知相机的按钮被按下。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><span style="color: red; font-family: 宋体">（注：可以看作是打开另外窗口</span><span style="color: red">(</span><span style="color: red; font-family: 宋体">或服务</span><span style="color: red">)</span><span style="color: red; font-family: 宋体">、窗口间通信的工具）</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 26.35pt"><span style="font-family: 宋体">有多种方法可以激活不同的组件：</span></p>
<p style="margin: 0cm 0cm 12pt 9.05pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: Symbol">&#183;&nbsp;</span><span style="font-size: 10pt; color: #333333; font-family: Arial">Activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">靠传送一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">Intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">对象到</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Context.html#startActivity(android.content.Intent)">Context.startActivity()</a></span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">或</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#startActivityForResult(android.content.Intent, int)">Activity.startActivityForResult()</a></span><span style="font-size: 10pt; color: #333333; font-family: Arial">.</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">被激活。</span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">被激活的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">可以通过调用</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#getIntent()">getIntent()</a></span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">方法获取激活它的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 10pt; color: #333333; font-family: Arial">Android </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">调用</span><span style="font-size: 10pt; color: #333333; font-family: Arial">acitivity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onNewIntent(android.content.Intent)">onNewIntent()</a></span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">方法来传送其他后来的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 10pt; color: red; font-family: 宋体">（注：一个</span><span style="font-size: 10pt; color: red; font-family: Arial">activity</span><span style="font-size: 10pt; color: red; font-family: 宋体">可以同时被多个</span><span style="font-size: 10pt; color: red; font-family: Arial">intent</span><span style="font-size: 10pt; color: red; font-family: 宋体">激活）</span></p>
<p style="text-justify: inter-ideograph; margin: 12pt 0cm 0pt 9pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: Arial">Activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">经常会调用其他的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">，如果它需要被调用的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">返回的数据，可以调用</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">startActivityForResult()</span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">方法，而不是</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">startActivity()</span><span style="font-size: 10pt; color: #333333; font-family: Arial">. </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">例如，某个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">调用另外一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">用来让用户选择一个图片，另外一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">应该返回用户选择的图片。结果通过第一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onActivityResult(int, int, android.content.Intent)">onActivityResult()</a></span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">返回，返回的形式也是</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">。</span></p>
<p style="text-justify: inter-ideograph; margin: 12pt 0cm 0pt 9pt; text-indent: 25.1pt; text-align: justify"><span style="font-size: 10pt; color: #333333; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #333333; font-family: Arial">service</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">通过调用</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Context.html#startService(android.content.Intent)">Context.startService()</a></span><span style="font-size: 10pt; color: #333333; font-family: 宋体">被开始。</span><span style="font-size: 10pt; color: #333333; font-family: Arial">Android</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">会调用服务的</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Service.html#onStart(android.content.Intent, int)">onStart()</a></span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">方法，并把</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">传送给它。</span></p>
<p style="text-justify: inter-ideograph; margin: 12pt 0cm 0pt 9pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">类似的，</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">可以通过</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Context.html#bindService(android.content.Intent, android.content.ServiceConnection, int)">Context.bindService()</a></span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">方法建立同正在运行的服务的联系。服务通过</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Service.html#onBind(android.content.Intent)">onBind()</a></span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">方法获取</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">。如果服务没有启动，</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">bindService()</span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">方法可以选择是否启动服务。例如，一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">可能会想建立与后台播放音乐的服务的通信，这样用户就可以通过</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">控制后台的播放。因此</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">可能会调用</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">bindService()</span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">方法来建立连接，然后再调用</span><span style="font-size: 10pt; color: #333333; font-family: Arial">service</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">公开的接口。</span></p>
<p style="text-justify: inter-ideograph; margin: 12pt 0cm 0pt 9pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">请参见</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/fundamentals.html#rpc#rpc">Remote procedure calls</a> </span></p>
<p style="text-justify: inter-ideograph; margin: 12pt 0cm 0pt 9pt; text-indent: 25.1pt; text-align: justify"><span style="font-size: 10pt; color: #333333; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #333333; font-family: 宋体">程序可以调用</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Context.html#sendBroadcast(android.content.Intent)">Context.sendBroadcast()</a></span><span style="font-size: 10pt; color: #333333; font-family: Arial">, </span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Context.html#sendOrderedBroadcast(android.content.Intent, java.lang.String)">Context.sendOrderedBroadcast()</a></span><span style="font-size: 10pt; color: #333333; font-family: Arial">, </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">和</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Context.html#sendStickyBroadcast(android.content.Intent)">Context.sendStickyBroadcast()</a></span><span style="font-size: 10pt; color: #333333; font-family: 宋体">来传递</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">初始化一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">broadcast</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 10pt; color: #333333; font-family: Arial">broadcast </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">通过</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/BroadcastReceiver.html#onReceive(android.content.Context, android.content.Intent)">onReceive()</a></span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">方法接收。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">请参见</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/intents/intents-filters.html">Intents and Intent Filters</a>. </span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9.05pt; text-indent: 36.55pt"><strong><span style="font-size: 14.5pt; color: #111111; font-family: 宋体">关闭组件</span></strong><strong></strong></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">只有当回应</span><span style="font-size: 10pt; color: #333333; font-family: Arial">ContentResolver</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">时，</span><span style="font-size: 10pt; color: #333333; font-family: Arial">content provider</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">被激活。只有当回应</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> broadcast message</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">时</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> broadcast receiver</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">被激活。</span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">因此不必显式的关闭组件。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: Arial">Activities</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">，从另外一个方面看，提供用户界面，需要长时间的与用户交互，保持激活状态，甚至空闲状态的时候都要激活。</span><span style="font-size: 10pt; color: #333333; font-family: Arial">service</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">需要长时间保持激活状态。因此</span><span style="font-size: 10pt; color: #333333; font-family: Arial">Android</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">有关闭</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activities </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">和</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> services </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的方法</span><span style="font-size: 10pt; color: #333333; font-family: Arial">: </span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 25.1pt; text-align: justify"><span style="font-size: 10pt; color: #333333; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">关闭：调用</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#finish()">finish()</a></span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">方法。一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">可以关闭其他</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity (</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">必须是它通过调用</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">startActivityForResult()</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">创建的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">) by calling </span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#finishActivity(int)">finishActivity()</a></span><span style="font-size: 10pt; color: #333333; font-family: Arial">. </span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 25.1pt; text-align: justify"><span style="font-size: 10pt; color: #333333; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #333333; font-family: 宋体">服务关闭：调用</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Service.html#stopSelf()">stopSelf()</a></span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">或者</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Context.html#stopService(android.content.Intent)">Context.stopService()</a></span><span style="font-size: 10pt; color: #333333; font-family: 宋体">方法。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">当不再使用或者系统回收内存的时候，组件会被</span><span style="font-size: 10pt; color: #333333; font-family: Arial">android</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">关闭。请参见</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/fundamentals.html#lcycles#lcycles">Component Lifecycles</a> </span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9.05pt; text-indent: 26.45pt"><strong><span style="color: #222222; font-family: Arial">The manifest file</span></strong><strong><span style="color: #222222; font-family: 宋体">（装箱单）</span></strong><strong></strong></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">在</span><span style="font-size: 10pt; color: #333333; font-family: Arial">Android</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">开始一个应用程序之前，它必须知道有哪些文件，因此程序必须在一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">manifest</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">文件中声明所有用到的组件。这些声明的组件会被编译到</span><span style="font-size: 10pt; color: #333333; font-family: Arial">apk</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">文件中。</span><code><span style="font-size: 12pt">.apk</span></code> <span style="font-size: 10pt; color: #333333; font-family: 宋体">文件含有程序源代码和资源。（</span><span style="font-size: 10pt; color: red; font-family: 宋体">注：相当于项目文件</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">）</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">装箱单是一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">xml</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">文件，在所有的程序中命名都是</span><span style="font-size: 10pt; color: #333333; font-family: Arial">AndroidManifest.xml </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">。它还有一些其他</span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">的功能，如：指明需要连接的库、识别程序希望被授予的权限。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">但是装箱单的主要任务还是向</span><span style="font-size: 10pt; color: #333333; font-family: Arial">android</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">声明程序的组件。一份装箱单的例子：</span></p>
<div style="border-right: #cccccc 1pt solid; padding-right: 8pt; border-top: #cccccc 1pt solid; padding-left: 8pt; background: #fafafa; padding-bottom: 8pt; margin-left: 9pt; border-left: #cccccc 1pt solid; margin-right: 0cm; padding-top: 8pt; border-bottom: #cccccc 1pt solid">
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&lt;manifest . . . </span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &lt;application . . . &gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;activity android:name="com.example.project.FreneticActivity"</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android:icon="@drawable/small_pic.png"</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android:label="@string/freneticLabel" </span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . . .&nbsp;&gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/activity&gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . . .</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&lt;/application&gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&lt;/manifest&gt;</span></p>
</div>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 9pt; text-indent: 30.1pt"><code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/manifest/activity-element.html"><span style="font-size: 10.5pt">&lt;activity&gt;</span></a></span></code> <span style="font-size: 10pt; color: #333333; font-family: 宋体">节点的</span><code><span style="font-size: 12pt">name</span></code> <span style="font-size: 10pt; color: #333333; font-family: 宋体">属性指明了</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html">Activity</a> </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的类名</span><span style="font-size: 10pt; color: #333333; font-family: Arial">. </span><code><span style="font-size: 12pt">icon</span></code> <span style="font-size: 10pt; color: #333333; font-family: 宋体">和</span> <code><span style="font-size: 12pt">label</span></code> <span style="font-size: 10pt; color: #333333; font-family: 宋体">属性指明了展示</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">时用到的资源。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 21pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">另一个节点的含义差不多</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> — </span><code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/manifest/service-element.html"><span style="font-size: 10.5pt">&lt;service&gt;</span></a></span></code> <span style="font-size: 10pt; color: #333333; font-family: 宋体">是用来声明</span><span style="font-size: 10pt; color: #333333; font-family: Arial">services</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">, </span><code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/manifest/receiver-element.html"><span style="font-size: 10.5pt">&lt;receiver&gt;</span></a></span></code> <span style="font-size: 10pt; color: #333333; font-family: 宋体">用来声明</span><span style="font-size: 10pt; color: #333333; font-family: Arial">broadtcast</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">，</span> <code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/manifest/provider-element.html"><span style="font-size: 10.5pt">&lt;provider&gt;</span></a></span></code> <span style="font-size: 10pt; color: #333333; font-family: 宋体">用来声明</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> content providers. Activities, services</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> content providers</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">需要声明，对系统不可见。另外，</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> broadcast receivers</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">可以不在装箱单中声明，可以动态得在代码中声明。</span><span style="font-size: 10pt; color: #333333; font-family: Arial">(</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">见</span><span style="font-size: 10pt; color: #333333; font-family: Arial"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/BroadcastReceiver.html">BroadcastReceiver</a> </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">对象</span><span style="font-size: 10pt; color: #333333; font-family: Arial">)</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">通过</span> <code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Context.html#registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter)"><span style="font-size: 10.5pt">Context.registerReceiver()</span></a></span></code><span style="font-size: 10pt; color: #333333; font-family: 宋体">方法向系统注册。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 21pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">请参见</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/manifest/manifest-intro.html">The AndroidManifest.xml File</a></span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 20.95pt; text-indent: 26.45pt"><strong><span style="color: #222222; font-family: Arial">Intent filters</span></strong></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 12pt 21pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: Arial">Intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">对象可以显式的指明目标组件，这样</span><span style="font-size: 10pt; color: #333333; font-family: Arial">Android</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">很容易激活对应的组件。但是，如果目标组件不是显式的声明，</span><span style="font-size: 10pt; color: #333333; font-family: Arial">Android</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">必须定位到最适合的组件来响应</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">。系统如何实现这个功能呢？是通过比较</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">对象和潜在目标的</span><em><span style="font-size: 10pt; color: #333333; font-family: Arial">intent filter</span></em><em><span style="font-size: 10pt; color: #333333; font-family: 宋体">。</span></em><span style="font-size: 10pt; color: #333333; font-family: 宋体">组件的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent filters</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">通知操作系统它可以处理什么样的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">。象其他组件的信息一样，</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent filter</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">定义在装箱单中，这里是上面的装箱单加入了</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent filters</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的例子：</span></p>
<div style="border-right: #cccccc 1pt solid; padding-right: 8pt; border-top: #cccccc 1pt solid; padding-left: 8pt; background: #fafafa; padding-bottom: 8pt; margin-left: 12pt; border-left: #cccccc 1pt solid; margin-right: 0cm; padding-top: 8pt; border-bottom: #cccccc 1pt solid">
<pre style="background: #fafafa; margin-left: 0cm; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: Arial">&nbsp;</span>&lt;?xml version="1.0" encoding="utf-8"?&gt;</pre>
</div>
<div style="border-right: #cccccc 1pt solid; padding-right: 8pt; border-top: #cccccc 1pt solid; padding-left: 8pt; background: #fafafa; padding-bottom: 8pt; margin-left: 18pt; border-left: #cccccc 1pt solid; margin-right: 0cm; padding-top: 8pt; border-bottom: #cccccc 1pt solid">
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&lt;manifest . . . </span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &lt;application . . . &gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;activity android:name="com.example.project.FreneticActivity"</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android:icon="@drawable/small_pic.png"</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">android:label="@string/freneticLabel" </span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . . .&nbsp;&gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;intent-filter . . . </span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action android:name="android.intent.action.MAIN" /&gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;category android:name="android.intent.category.LAUNCHER" /&gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/intent-filter&gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;intent-filter . . . &gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action android:name="com.example.project.BOUNCE" /&gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;data android:type="image/jpeg" /&gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;category android:name="android.intent.category.DEFAULT" /&gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/intent-filter&gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/activity&gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . . .</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&lt;/application&gt;</span></p>
<p style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; background: #fafafa; padding-bottom: 0cm; margin: 0cm 0cm 12pt; border-left: medium none; text-indent: 30.1pt; line-height: 12pt; padding-top: 0cm; border-bottom: medium none"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&lt;/manifest&gt;</span></p>
</div>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">例子中的第一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">filter</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的属性：</span><span style="font-size: 10pt; color: #333333; font-family: Arial">"</span><code><span style="font-size: 12pt">android.intent.action.MAIN</span></code><span style="font-size: 10pt; color: #333333; font-family: Arial">" </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">和</span><span style="font-size: 10pt; color: #333333; font-family: Arial">category "</span><code><span style="font-size: 12pt">android.intent.category.LAUNCHER</span></code><span style="font-size: 10pt; color: #333333; font-family: Arial">" —</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">是很常用的。它使得</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">变成程序第一个响应的，可以占用屏幕。换句话说，是用户启动程序后看到的第一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">第二个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">filteractivity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">可以执行特定数据类型的动作。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">一个组件可以有多个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent filters,</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">每个声明一组</span><span style="font-size: 10pt; color: #333333; font-family: Arial">capabilities.</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">如果没有声明</span><span style="font-size: 10pt; color: #333333; font-family: Arial">filters,</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">那么它只能被显示指明的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">激活。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">对于在创建和注册在代码中的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">broadcast receiver</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">来说，</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> intent filter </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">是一个默认的</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/IntentFilter.html">IntentFilter</a> </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">对象。其他所有的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">filters </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">必须在装箱单中声明</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">请参见</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/intents/intents-filters.html">Intents and Intent Filters</a>. </span></p>
<p style="margin: 0cm 0cm 12pt 17.85pt; text-indent: 36.55pt"><strong><span style="font-size: 14.5pt; color: #111111; font-family: Arial">Activities </span></strong><strong><span style="font-size: 14.5pt; color: #111111; font-family: 宋体">和任务（</span></strong><strong><span style="font-size: 14.5pt; color: #111111; font-family: Arial"> Tasks</span></strong><strong><span style="font-size: 14.5pt; color: #111111; font-family: 宋体">）</span></strong><strong></strong></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">之前提到，一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">可以启动另外一个包含它其他程序中的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">。想象一下，例如，你想要用户显示一个街道的地图，已经有另外一个程序可以做这件事情，所以你的程序只需要建立一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">对象，这个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">对象包含请求的数据，并调用</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">startActivity()</span><span style="font-size: 10pt; color: #333333; font-family: Arial">.</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">这时候，地图组件可以显示地图，当用户点击&#8220;后退&#8221;按钮，你的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">会重新显示在屏幕上。</span><strong></strong></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">对用户来说，即使地图程序是定义在另外一个程序中、在另外一个进程中运行，但是它看起来好像你的程序的一部分。</span><span style="font-size: 10pt; color: #333333; font-family: Arial">Android</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">通过将</span><span style="font-size: 10pt; color: #333333; font-family: Arial">2</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activities</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">放在用一个任务中，使得用户有这样的体验。这一系列的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activities,</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">安排在一个堆栈中。堆栈中的根</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">是任务的开始，或者说是用户选择的应用程序的第一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">。堆栈顶部的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">是当前正在运行的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity— </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">目前正在吸引用户注意的一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">.</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">当一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">启动另外一个的时候，新的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">被压栈，变为当前</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity. </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">之前的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">还在任务中。当用户点击后退（</span><span style="font-size: 10pt; color: #333333; font-family: Arial">BACK</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">）键，当前的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">acitivity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">被弹出栈，之前的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">成为正在运行的。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">如果堆栈中有多个同样的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的实例，如有多个地图查看器（如程序设定了多个打开地图查看器的入口），那么堆栈不可以重新排序，只能弹出和压入。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">任务是</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activities</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的堆栈，而非装箱单中的一个类，因此不能离开</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">单独设定一个堆栈的值。例如，下面一章将要谈到&#8216;任务的吸引力&#8217;，这个值就是设定在任务的根</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">里面的。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">任务中的所有</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activities</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">作为一个整体移动。整个任务可以放在前台（</span><span style="font-size: 10pt; color: #333333; font-family: Arial">foreground</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">）或者后台（</span><span style="font-size: 10pt; color: #333333; font-family: Arial">background</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">）运行。想象一下，例如，有个任务有</span><span style="font-size: 10pt; color: #333333; font-family: Arial">4</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activities</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">，用户点击&#8220;</span><span style="font-size: 10pt; color: #333333; font-family: Arial">HOME</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">&#8221;键，回到程序开始的地方，选择了一个新的程序（其实是一个新的任务），当前的任务移到后台运行，新任务的根</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">开始显示。过了一会，用户又回到</span><span style="font-size: 10pt; color: #333333; font-family: Arial">HOME</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">界面，选择了刚才的程序（刚才的任务），则这个含有</span><span style="font-size: 10pt; color: #333333; font-family: Arial">4</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activities</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的任务回到前台运行。当用户点击</span><span style="font-size: 10pt; color: #333333; font-family: Arial">BACK</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">按钮，屏幕不会显示用户刚刚离开时候的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">，而是在堆栈顶部的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">被弹出，显示前一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">默认的情况下，上面这些描述是没有问题的。当然，也有很多办法来改变以下：任务和</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的关系、任务中一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的动作。这些是被</span><span style="font-size: 10pt; color: #333333; font-family: Arial">Intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">对象（启动此</span><span style="font-size: 10pt; color: #333333; font-family: Arial">acivity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的）的标志集（</span><span style="font-size: 10pt; color: #333333; font-family: Arial">flag set</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">）和</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">在装箱单中的</span><code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/manifest/activity-element.html"><span style="font-size: 10.5pt">&lt;activity&gt;</span></a></span></code><span style="font-size: 10pt; color: #333333; font-family: 宋体">节点控制的。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: Arial">Intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的标志集包括：</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 30.1pt"><code><span style="font-size: 12pt">FLAG_ACTIVITY_NEW_TASK</span></code><span style="font-size: 10pt; color: #333333; font-family: Arial"> <br />
</span><code><span style="font-size: 12pt">FLAG_ACTIVITY_CLEAR_TOP</span></code><span style="font-size: 10pt; color: #333333; font-family: Arial"> <br />
</span><code><span style="font-size: 12pt">FLAG_ACTIVITY_RESET_TASK_IF_NEEDED</span></code><span style="font-size: 10pt; color: #333333; font-family: Arial"> <br />
</span><code><span style="font-size: 12pt">FLAG_ACTIVITY_SINGLE_TOP</span></code></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">典型的</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&lt;activity&gt;</span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">的节点属性如下：</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 30.1pt"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">taskAffinity</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> <br />
</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">launchMode</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> <br />
</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">allowTaskReparenting</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> <br />
</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">clearTaskOnLaunch</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> <br />
</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">alwaysRetainTaskState</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> <br />
</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">finishOnTaskLaunch</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">下面的章节说明了这些标记和属性的意义和互动、需要注意的问题：</span></p>
<p style="margin: 0cm 0cm 0pt 9pt; text-indent: 30.25pt; line-height: normal"><strong><span style="font-size: 12pt; color: #222222; font-family: Arial">Affinities </span></strong><strong><span style="font-size: 12pt; color: #222222; font-family: 宋体">和新任务</span></strong><strong></strong></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">每个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">acitivity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">有一个默认的</span><em><span style="font-size: 10pt; color: #333333; font-family: Arial">affinity</span></em><span style="font-size: 10pt; color: #333333; font-family: 宋体">。然而，特定</span><span style="font-size: 10pt; color: #333333; font-family: Arial">affinity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">可以通过</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&lt;activity&gt;</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">taskAffinity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">属性被设置到特定的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的上。不同程序的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activities</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">可以共享一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">affinity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">；同一个程序的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">可以使用不同的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">afninity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 10pt; color: #333333; font-family: Arial">afninity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">在符合以下</span><span style="font-size: 10pt; color: #333333; font-family: Arial">2</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">个条件的时候启动：当启动</span><span style="font-size: 10pt; color: #333333; font-family: Arial">acitity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">Intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">中含有</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">FLAG_ACTIVITY_NEW_TASK</span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">节点，或者一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">allowTaskReparenting</span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">属性设置为</span><span style="font-size: 10pt; color: #333333; font-family: Arial">"</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">true</span><span style="font-size: 10pt; color: #333333; font-family: Arial">".</span></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: 30.1pt"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK">FLAG_ACTIVITY_NEW_TASK</a></span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">节点</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">之前提到，任务的默认通过</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">startActivity()</span><span style="font-size: 10pt; color: #333333; font-family: Arial">. </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">激活的默认</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">也和其他</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">在一个堆栈里面。但是引发这个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">Intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">通过</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">startActivity()</span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">方法传递了</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">FLAG_ACTIVITY_NEW_TASK</span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">节点。望文知意，这个节点表示新的任务。但是，也不一定；如果任务中没有含有此</span><span style="font-size: 10pt; color: #333333; font-family: Arial">afinity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">，那么它从默认的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">开始。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 30.1pt"><code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/manifest/activity-element.html#reparent"><span style="font-size: 10.5pt">allowTaskReparenting</span></a></span></code> <span style="font-size: 10pt; color: #333333; font-family: 宋体">节点</span><strong></strong></p>
<p style="margin: 0cm 0cm 12pt 21pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">如果</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的</span> <code><span style="font-size: 12pt">allowTaskReparenting</span></code> <span style="font-size: 10pt; color: #333333; font-family: 宋体">属性设置为</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> "</span><code><span style="font-size: 12pt">true</span></code><span style="font-size: 10pt; color: #333333; font-family: Arial">", </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">它就可以脱离开始它的任务，然后通过它的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">afinity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">指引，走入下一个任务。例如，假设&#8220;旅游软件&#8221;有一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">可以获取指定城市的天气。这个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">和此程序中的其他</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">有同样的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">afinity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">（默认的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">afinity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">），并且允许重新转入另外的任务。某个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">开始了天气预报动作，它一开始属于这个任务；但是旅游程序到前台运行的时候，天气预报</span><span style="font-size: 10pt; color: #333333; font-family: Arial">acivity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">被分配到旅游程序运行。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">如果从用户角度看，一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">.apk</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">文件包含许多程序，你必须适当的分配不同的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">affinity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">给</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activitis</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 27.7pt"><strong><span style="font-size: 11pt; color: #222222; font-family: 宋体">启动模式</span></strong><strong></strong></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">一个</span> <code><span style="font-size: 12pt">&lt;activity&gt;</span></code> <span style="font-size: 9pt; color: #333333; font-family: 宋体">有</span><span style="font-size: 9pt; color: #333333; font-family: Arial">4</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">种启动模式，要设置</span> <code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/manifest/activity-element.html#lmode"><span style="font-size: 10.5pt">launchMode</span></a></span></code> <span style="font-size: 9pt; color: #333333; font-family: 宋体">属性：</span></p>
<p style="margin: 0cm 0cm 12pt 36pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: Arial">"</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">standard</span><span style="font-size: 9pt; color: #333333; font-family: Arial">" (the default mode) <br />
"</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">singleTop</span><span style="font-size: 9pt; color: #333333; font-family: Arial">" <br />
"</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">singleTask</span><span style="font-size: 9pt; color: #333333; font-family: Arial">" <br />
"</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">singleInstance</span><span style="font-size: 9pt; color: #333333; font-family: Arial">"</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">这些模式有以下区别：</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.7pt"><strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">哪个任务将包含</span></strong><strong><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span></strong><strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">指定要运行的</span></strong><strong><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span></strong><strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">：</span></strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">对于</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><code><span style="font-size: 12pt">standard</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><code><span style="font-size: 12pt">singleTop</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">模式，启动</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent (</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">即调用</span> <code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Context.html#startActivity(android.content.Intent)"><span style="font-size: 10.5pt">startActivity()</span></a></span></code><span style="font-size: 9pt; color: #333333; font-family: 宋体">方法的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">) —</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">除非</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">对象包含</span><code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK"><span style="font-size: 10.5pt">FLAG_ACTIVITY_NEW_TASK</span></a></span></code> <span style="font-size: 9pt; color: #333333; font-family: 宋体">节点，如果是的话，会像上个章节描述的一样</span><span style="font-size: 9pt; color: #333333; font-family: Arial">, <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/fundamentals.html#afftask#afftask">Affinities and new tasks</a></span><span style="font-size: 9pt; color: #333333; font-family: 宋体">，另外一个任务会承载这个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">相对的，</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><code><span style="font-size: 12pt">singleTask</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><code><span style="font-size: 12pt">singleInstance</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">模式使得</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">永远在</span><span style="font-size: 9pt; color: #333333; font-family: Arial">tast</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的根，他们初始化一个任务，不会融入到其他任务中</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.7pt"><strong><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span></strong><strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">是否会有多个实例</span></strong><span style="font-size: 9pt; color: #333333; font-family: Arial">. "</span><code><span style="font-size: 12pt">standard</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">或</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><code><span style="font-size: 12pt">singleTop</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">"</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">模式的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">可以被示例化多次，属于多个任务，或者一个任务中有多个此</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的实例。</span></p>
<p style="margin: 12pt 0cm 0pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">相对的，</span><span style="font-size: 9pt; color: #333333; font-family: Arial">, "</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">singleTask</span><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">singleInstance</span><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">模式的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activities</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">限制为只能有一个实例。因为这些</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">在任务的根，这表示，任务也只有一个。</span></p>
<p style="margin: 12pt 0cm 0pt 18pt; text-indent: 22.7pt"><strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">同一个任务中是否可以有其他的</span></strong><strong><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span></strong><strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">：</span></strong><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">singleInstance</span><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">模式的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">所在的任务中不能有其他的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">，如果启动其他</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity, </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">那么其他</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">会被附加到新的任务（不管新</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的启动模式是什么）</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> — </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">就像</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">使用了</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">FLAG_ACTIVITY_NEW_TASK</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">标记。在其他方面，</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">singleInstance</span><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">singleTask</span><span style="font-size: 9pt; color: #333333; font-family: Arial">"</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">没有什么区别。</span></p>
<p style="margin: 12pt 0cm 0pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">其他三种模式允许多个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">acitvity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">在同一个任务中。</span><code><span style="font-size: 12pt">singleTask</span></code> <span style="font-size: 9pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">必须在任务的根，它可以启动其他设置到该任务的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。而</span><code><span style="font-size: 12pt">standard</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><code><span style="font-size: 12pt">singleTop</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">"</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">可以用于任务的任何位置。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.7pt"><strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">一个类的新实例是否可以接受、处理其他部分发来的</span></strong><strong><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span></strong><strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">：</span></strong> <span style="font-size: 9pt; color: #333333; font-family: 宋体">默认的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">"</span><code><span style="font-size: 12pt">standard</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">模式可以响应任何新的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">，每个实例处理一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><code><span style="font-size: 12pt">singleTop</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">模式的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">如果在任务的顶部，则用已有的实例处理所有请求该实例的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">；反之创建一个新的实例，并压入任务的顶部。</span></p>
<p style="margin: 12pt 0cm 0pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">例如，一个任务包含根</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activityA</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">，和其他</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activityB,C,D</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">，</span><span style="font-size: 10pt; color: #333333; font-family: Arial">D</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">在任务堆栈的顶部</span><span style="font-size: 10pt; color: #333333; font-family: Arial">,</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">即堆栈为</span><span style="font-size: 9pt; color: #333333; font-family: Arial">A-B-C-D. </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">请求</span><span style="font-size: 9pt; color: #333333; font-family: Arial">D</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">，如果</span><span style="font-size: 9pt; color: #333333; font-family: Arial">D</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">是</span><span style="font-size: 9pt; color: #333333; font-family: Arial">"</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">standard</span><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">启动模式，则</span><span style="font-size: 9pt; color: #333333; font-family: Arial">D</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的一个新实例被创建，任务堆栈变为</span><span style="font-size: 9pt; color: #333333; font-family: Arial">A-B-C-D-D. </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">但是，如果</span><span style="font-size: 9pt; color: #333333; font-family: Arial">D</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的启动模式是</span><span style="font-size: 9pt; color: #333333; font-family: Arial">"</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">singleTop</span><span style="font-size: 9pt; color: #333333; font-family: Arial">", </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">则现有的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">D</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的实例来响应</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">，所以任务堆栈仍然是</span><span style="font-size: 9pt; color: #333333; font-family: Arial">A-B-C-D. </span></p>
<p style="margin: 12pt 0cm 0pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">另外一种情况，如果</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">来请求</span><span style="font-size: 9pt; color: #333333; font-family: Arial">B</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">，如果</span><span style="font-size: 9pt; color: #333333; font-family: Arial">B</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">是</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">standard</span><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">或者</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">singleTop</span><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">模式，</span><span style="font-size: 9pt; color: #333333; font-family: Arial">B</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">都将创建一个新的实例来响应，则任务堆栈为</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> A-B-C-D-B. </span></p>
<p style="margin: 12pt 0cm 0pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">就像上面提到的，</span><span style="font-size: 9pt; color: #333333; font-family: Arial">"</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">singleTask</span><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">或</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">singleInstance</span><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">只有</span><span style="font-size: 9pt; color: #333333; font-family: Arial">1</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">个实例，所以这个实例要处理所有的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 9pt; color: #333333; font-family: Arial">"</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">singleInstance</span><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">永远在任务堆栈的顶部（因为它是任务中的唯一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">），所以这个实例处理所有的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。可能有其他的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">在</span><span style="font-size: 9pt; color: #333333; font-family: Arial">"</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">singleTask</span><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的顶部，因此这个实例不会处理</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">请求，因此</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的请求会失败；（即使失败，</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">也会激活这个程序）</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">当已存在的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">acitity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">用来处理</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的时候，</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">会引发</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的</span><code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onNewIntent(android.content.Intent)"><span style="font-size: 10.5pt">onNewIntent()</span></a></span></code> <span style="font-size: 10pt; color: #333333; font-family: 宋体">方法</span><span style="font-size: 10pt; color: #333333; font-family: Arial">. (activiy</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">可以调用</span><code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#getIntent()"><span style="font-size: 10.5pt">getIntent()</span></a></span></code><span style="font-size: 10pt; color: #333333; font-family: 宋体">获取触发它的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent)</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">注意：当一个新的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的实例为了响应</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">而创建时，用户可以按</span><span style="font-size: 10pt; color: #333333; font-family: Arial">BACK</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">键回到上一个状态（上一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">）。但是当一个已经存在的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">处理新的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的时候，用户不能按</span><span style="font-size: 10pt; color: #333333; font-family: Arial">BACK</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">键后退了。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">请参见</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/manifest/manifest-intro.html">The AndroidManifest.xml </a></span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 27.7pt"><strong><span style="font-size: 11pt; color: #222222; font-family: 宋体">清空任务</span></strong><strong></strong></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">如果一个用户长时间没有使用一个任务，系统会请空这个任务中根以外的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">acitivity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。当用户再次使用此程序的时候，只有最开始的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">显示出来。这样做的原因是：当用户很长时间以后回来的时候，它倾向于重新开始工作，而不是接着上次的工作做。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">当然，这是默认的模式。</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">有一些属性可以控制请空的动作。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 30.1pt"><code><span style="font-size: 12pt">alwaysRetainTaskState</span></code><span style="font-size: 9pt; color: #333333; font-family: 宋体">属性</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">当任务的根</span><span style="font-size: 9pt; color: #333333; font-family: Arial">acitvity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的此属性设置为</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">true</span><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的时候，以上描述的动作不会执行。系统会保留上次程序加载时候的所有</span><span style="font-size: 9pt; color: #333333; font-family: Arial">acitivity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 30.1pt"><code><span style="font-size: 12pt">clearTaskOnLaunch</span></code><span style="font-size: 9pt; color: #333333; font-family: 宋体">属性</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">当任务的根</span><span style="font-size: 9pt; color: #333333; font-family: Arial">acitvity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的此属性设置为</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">true</span><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的时候，无论用户何时返回应用程序，程序都会请空队列。从另一个角度说，这个属性和</span><code><span style="font-size: 12pt">alwaysRetainTaskState</span></code><span style="font-size: 9pt; color: #333333; font-family: 宋体">属性完全相反。即使离开一会，用户也会被导航到初始状态。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 30.1pt"><code><span style="font-size: 12pt">finishOnTaskLaunch</span></code><span style="font-size: 9pt; color: #333333; font-family: 宋体">属性</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">这个属性有些像</span><code><span style="font-size: 12pt">clearTaskOnLaunch</span></code><span style="font-size: 10pt; color: #333333; font-family: Arial">, </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">但是它是针对某个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">而非整个任务的。它可以清除任何</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">，当然包括任务堆栈的根</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">。当此属性设置为</span><span style="font-size: 9pt; color: #333333; font-family: Arial">"</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">true</span><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的时候，此</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">只在用户当前会话中显示，当用户离开再回来的时候，此</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">已经被清除。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">有另外一种方式来请空任务。如果</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">含有</span> <code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP"><span style="font-size: 10.5pt">FLAG_ACTIVITY_CLEAR_TOP</span></a></span></code> <span style="font-size: 9pt; color: #333333; font-family: 宋体">节点，并且目标任务已经有一个指定</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的实例来处理这个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">了，那么这个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">顶上的节点将被全部清除，这个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的实例就位于任务堆栈的顶部了。如果指定的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">设置为</span><span style="font-size: 9pt; color: #333333; font-family: Arial">"</span><code><span style="font-size: 12pt">standard</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">", </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">它将从任务中移除，建立一个新的实例来响应此</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。因为启动模式设置为</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><code><span style="font-size: 12pt">standard</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">"</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的时候，会建立一个新的实例来响应</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 30.1pt"><code><span style="font-size: 12pt">FLAG_ACTIVITY_CLEAR_TOP</span></code> <span style="font-size: 9pt; color: #333333; font-family: 宋体">经常和</span><code><span style="font-size: 12pt">FLAG_ACTIVITY_NEW_TASK</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">.</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">一起使用。当他们一起使用的时候，可以定位到另外一个任务中已经存在的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">上，使得这个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">acitivity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">响应</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。</span></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: 27.7pt; line-height: normal"><strong><span style="font-size: 11pt; color: #222222; font-family: 宋体">开始任务</span></strong><strong><span style="font-size: 11pt; color: #222222; font-family: Arial">Starting tasks</span></strong></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">怎样把一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">设置为整个任务的入口呢？可以设置一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent filter</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">：</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><code><span style="font-size: 12pt">android.intent.action.MAIN</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">作为默认动作；</span><span style="font-size: 9pt; color: #333333; font-family: Arial">"</span><code><span style="font-size: 12pt">android.intent.category.LAUNCHER</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">作为类别。</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> (</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">是</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/fundamentals.html#ifilters#ifilters">Intent Filters</a> </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">章节的例子</span><span style="font-size: 9pt; color: #333333; font-family: Arial">)</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。这种类型的的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">filter</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">对应的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">icon</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span><span style="font-size: 9pt; color: #333333; font-family: Arial">label</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">显示在任务中，这样用户可以方便的回到任务</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">第二个能力尤其重要，用户必须可以离开任务，并且重返任务。因此，</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><code><span style="font-size: 12pt">singleTask</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "</span><code><span style="font-size: 12pt">singleInstance</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">"</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">这</span><span style="font-size: 9pt; color: #333333; font-family: Arial">2</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">个启动模式必须用在含有</span> <code><span style="font-size: 12pt">MAIN</span></code> <span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span> <code><span style="font-size: 12pt">LAUNCHER</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial"> filter</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">中</span><span style="font-size: 9pt; color: #333333; font-family: Arial">.</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">想象一下，如果不加这</span><span style="font-size: 9pt; color: #333333; font-family: Arial">2</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">filter</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">会怎样？一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">请求</span><span style="font-size: 9pt; color: #333333; font-family: Arial">"</span><code><span style="font-size: 12pt">singleTask</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">" </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity,</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">初始化了一个新的任务，用户操作了一会这个任务。然后用户点击&#8220;</span><span style="font-size: 9pt; color: #333333; font-family: Arial">HOME</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">&#8221;键。现在这个任务就被</span><span style="font-size: 9pt; color: #333333; font-family: Arial">HOME</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">窗体覆盖了。但是因为这个任务不能在</span><span style="font-size: 9pt; color: #333333; font-family: Arial">application launcher</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">（</span><span style="font-size: 9pt; color: red; font-family: 宋体">注：类似于进程管理器</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">）里面看到，因此用户没有办法打开它。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 30.1pt"><code><span style="font-size: 12pt">FLAG_ACTIVITY_NEW_TASK</span></code> <span style="font-size: 9pt; color: #333333; font-family: 宋体">标志也有同样的问题。这个标志将使得</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">在一个新的任务执行，当用户点击</span><span style="font-size: 9pt; color: #333333; font-family: Arial">HOME </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">键离开任务的时候，必须能让用户回到这个任务。其他的一些机制（如通知管理器）经常在外部的任务开启某个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">，而不是</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">所在的任务本身，因此必须在</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">触发</span> <code><span style="font-size: 12pt">startActivity()</span></code><span style="font-size: 9pt; color: #333333; font-family: 宋体">方法时使用</span><code><span style="font-size: 12pt">FLAG_ACTIVITY_NEW_TASK</span></code> <span style="font-size: 9pt; color: #333333; font-family: 宋体">标记。如果你有一个可以使用这个标记并且可以被外部调用的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">，要注意使得用户可以重新回到这个任务。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">当你不想用户重新回到任务的时候，将</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">&lt;activity&gt;</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">节点的</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">finishOnTaskLaunch</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">设置为</span><span style="font-size: 9pt; color: #333333; font-family: Arial">"</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">true</span><span style="font-size: 9pt; color: #333333; font-family: Arial">". </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">请参见前面的</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/fundamentals.html#clearstack#clearstack">Clearing the stack</a></span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。</span></p>
<p style="margin: 0cm 0cm 12pt 17.85pt; text-indent: 36.55pt"><strong><span style="font-size: 14.5pt; color: #111111; font-family: 宋体">进程和线程</span></strong><strong><span style="font-size: 14.5pt; color: #111111; font-family: Arial">Processes and Threads</span></strong></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">当某个组件第一次运行的时候，</span><span style="font-size: 9pt; color: #333333; font-family: Arial">Android</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">启动了一个进程。默认的，所有的组件和程序运行在这个进程和线程中。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">也可以安排组件在其他的进程或者线程中运行</span></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: 30.25pt; line-height: normal"><strong><span style="font-size: 12pt; color: #222222; font-family: 宋体">进程</span></strong><strong></strong></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">组件运行的进程由装箱单控制。组件的节点</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> — </span><code><span style="font-size: 12pt">&lt;activity&gt;</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">, </span><code><span style="font-size: 12pt">&lt;service&gt;</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">, </span><code><span style="font-size: 12pt">&lt;receiver&gt;</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">, </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span> <code><span style="font-size: 12pt">&lt;provider&gt;</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial"> — </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">都包含一个</span> <code><span style="font-size: 12pt">process</span></code> <span style="font-size: 9pt; color: #333333; font-family: 宋体">属性。这个属性可以组件运行的进程。这个属性可以配置组件在一个独立进程运行，或者多个组件在同一个进程运行。甚至可以多个程序在一个进程中运行－如果这些程序共享一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">User ID</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">并给定同样的权限。</span><code><span style="font-size: 12pt">&lt;application&gt;</span></code> <span style="font-size: 9pt; color: #333333; font-family: 宋体">节点也包含</span> <code><span style="font-size: 12pt">process</span></code> <span style="font-size: 9pt; color: #333333; font-family: 宋体">属性，用来设置程序中所有组件的默认进程。</span></p>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">所有的组件在此进程的主线程中示例化，系统对这些组件的调用从主线程中分离。并非每个对象都会从主线程中分离。一般来说，响应例如</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/view/View.html#onKeyDown(int, android.view.KeyEvent)">View.onKeyDown()</a></span><span style="font-size: 10pt; color: #333333; font-family: 宋体">用户操作的方法和通知（后面会在</span><span style="font-size: 10pt; color: #333333; font-family: Arial"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/fundamentals.html#lcycles#lcycles">Component Lifecycles</a></span><span style="font-size: 10pt; color: #333333; font-family: 宋体">谈到）的方法也在主线程中运行。这就表示，组件被系统调用的时候不应该长时间运行或者阻塞操作（如网络操作或者计算大量数据），因为这样会阻塞进程中的其他组件。可以把这类操作从主线程中分离，后面的</span><span style="font-size: 10pt; color: #333333; font-family: Arial"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/fundamentals.html#threads#threads">Threads</a>, </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">章节会降到。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">当更加常用的进程无法获取足够内存</span><span style="font-size: 9pt; color: #333333; font-family: Arial">,Android</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">可能会关闭不常用的进程。下次启动程序的时候会有一次启动进程。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">当决定哪个进程需要被关闭的时候，</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> Android</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">会考虑哪个对用户更加有用。如，</span><span style="font-size: 9pt; color: #333333; font-family: Arial">Android</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">会倾向于关闭一个长期不显示在界面的进程来支持一个经常显示在界面的进程。是否关闭一个进程决定于组件在进程中的状态，参见后面的章节</span><span style="font-size: 9pt; color: #333333; font-family: Arial"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/fundamentals.html#lcycles#lcycles">Component Lifecycles</a>.</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 27.7pt"><strong><span style="font-size: 11pt; color: #222222; font-family: 宋体">线程</span></strong><strong></strong></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">即使为组件分配了不同的进程，有时候也需要再分配线程。比如用户界面需要很快对用户进行响应，因此某些费时的操作，如网络连接、下载或者非常占用服务器时间的操作应该放到其他线程。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">线程通过</span><span style="font-size: 9pt; color: #333333; font-family: Arial">java</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的标准对象</span><span style="font-size: 9pt; color: #333333; font-family: Arial"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/java/lang/Thread.html">Thread</a> </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">创建</span><span style="font-size: 9pt; color: #333333; font-family: Arial">. Android </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">提供了很多方便的管理线程的方法：</span><span style="font-size: 9pt; color: #333333; font-family: Arial">— <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/os/Looper.html">Looper</a> </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">在线程中运行一个消息循环；</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/os/Handler.html">Handler</a> </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">传递一个消息；</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/os/HandlerThread.html">HandlerThread</a> </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">创建一个带有消息循环的线程。</span></p>
<p style="margin: 0cm 0cm 0pt 27pt; text-indent: 27.7pt; line-height: normal"><strong><span style="font-size: 11pt; color: #222222; font-family: 宋体">远程调用</span></strong><strong><span style="font-size: 11pt; color: #222222; font-family: Arial">Remote procedure calls</span></strong></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: Arial">Android</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">有一个远程调用</span><span style="font-size: 9pt; color: #333333; font-family: Arial">(RPCs) </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的轻量级机制</span><span style="font-size: 9pt; color: #333333; font-family: Arial">— </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">通过这个机制，方法可以在本地调用，在远程执行（在其他进程执行），还可以返回一个值。要实现这个需求，方法调用必须分解方法调用，并且所有要传递的数据必须是操作系统可以访问的级别。从本地的进程和内存地址传送到远程的进程和内存地址并在远程处理和返回。返回值必须向相反的方向传递。</span><span style="font-size: 9pt; color: #333333; font-family: Arial">Android</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">提供了做以上操作的代码，所以开发者可以专注于实现</span><span style="font-size: 9pt; color: #333333; font-family: Arial">RPC</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的接口。</span> </p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">RPC</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">接口只能有一个方法。所有的方法都是同步执行的（直到远程方法返回，本地方法才结束阻塞），没有返回值的时候也是如此。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">简单来说，这个机制是这样的：使用</span><span style="font-size: 10pt; color: #333333; font-family: Arial">IDL (interface definition language).</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">定义你想要实现的接口，</span> <code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/developing/tools/aidl.html"><span style="font-size: 10.5pt">aidl</span></a></span></code> <span style="font-size: 10pt; color: #333333; font-family: 宋体">工具可以生成用于</span><span style="font-size: 10pt; color: #333333; font-family: Arial">java</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的接口定义，本地和远程都要使用这个定义。它包含</span><span style="font-size: 10pt; color: #333333; font-family: Arial">2</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">个类，见下图：</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: Arial">inner</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">类包含了所有的管理远程程序（符合</span><span style="font-size: 9pt; color: #333333; font-family: Arial">IDL</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">描述的接口）所需要的代码。所有的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">inner</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">类实现了</span><span style="font-size: 9pt; color: #333333; font-family: Arial"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/os/IBinder.html">IBinder</a> </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">接口</span><span style="font-size: 9pt; color: #333333; font-family: Arial">.</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">其中一个在本地使用，可以不管它的代码；另外一个叫做</span><span style="font-size: 9pt; color: #333333; font-family: Arial">Stub</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">继承了</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/os/Binder.html">Binder</a> </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">类。为了实现远程调用，这个类包含</span><span style="font-size: 9pt; color: #333333; font-family: Arial">RPC</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">接口。开发者可以继承</span><span style="font-size: 9pt; color: #333333; font-family: Arial">Stub</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">类来实现需要的方法。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">一般来说，远程进程会被一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">service</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">管理（因为</span><span style="font-size: 10pt; color: #333333; font-family: Arial">service</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">可以通知操作系统这个进程的信息并和其他进程通信），它也会包含</span><code><span style="font-size: 12pt">aidl</span></code> <span style="font-size: 10pt; color: #333333; font-family: 宋体">工具产生的接口文件，</span><span style="font-size: 10pt; color: #333333; font-family: Arial">Stub</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">类实现了远处那个方法。服务的客户端只需要</span><code><span style="font-size: 12pt">aidl</span></code> <span style="font-size: 10pt; color: #333333; font-family: 宋体">工具产生的接口文件。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">以下是如何连接服务和客户端调用：</span></p>
<p style="margin: 0cm 0cm 12pt 36pt; text-indent: 22.6pt"><span style="font-size: 10pt; color: #333333; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; color: #333333; font-family: 宋体">服务的客户端（本地）会实现</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/ServiceConnection.html#onServiceConnected(android.content.ComponentName, android.os.IBinder)">onServiceConnected()</a></span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/ServiceConnection.html#onServiceDisconnected(android.content.ComponentName)">onServiceDisconnected()</a></span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">方法，这样，当客户端连接或者断开连接的时候可以获取到通知。通过</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Context.html#bindService(android.content.Intent, android.content.ServiceConnection, int)">bindService()</a></span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">获取到服务的连接。</span> </p>
<p style="margin: 0cm 0cm 12pt 36pt; text-indent: 22.6pt"><span style="font-size: 10pt; color: #333333; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; color: #333333; font-family: 宋体">服务的</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Service.html#onBind(android.content.Intent)">onBind()</a></span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">方法中可以接收或者拒绝连接，取决它收到的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent (intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">通过</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">bindService()</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">方法连接到服务</span><span style="font-size: 9pt; color: #333333; font-family: Arial">). </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">如果服务接收了连接，会返回一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">Stub</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">类的实例</span><span style="font-size: 9pt; color: #333333; font-family: Arial">. </span></p>
<p style="margin: 0cm 0cm 12pt 36pt; text-indent: 22.6pt"><span style="font-size: 10pt; color: #333333; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; color: #333333; font-family: 宋体">如果服务接受了连接，</span><span style="font-size: 9pt; color: #333333; font-family: Arial">Android</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">会调用客户端的</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onServiceConnected()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">方法，并传递一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">Ibinder</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">对象（系统管理的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">Stub</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">类的代理），通过这个代理，客户端可以连接远程的服务。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">以上的描述省略很多</span><span style="font-size: 9pt; color: #333333; font-family: Arial">RPC</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的机制。请参见</span><span style="font-size: 9pt; color: #333333; font-family: Arial"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/developing/tools/aidl.html">Designing a Remote Interface Using AIDL</a> </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/os/IBinder.html">IBinder</a> </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">类。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 27.7pt"><strong><span style="font-size: 11pt; color: #222222; font-family: 宋体">线程安全的方法</span></strong><strong></strong></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">在某些情况下，方法可能调用不止一个的线程，因此需要注意方法的线程安全。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">对于可以远程调用的方法，也要注意这点。当一个调用在</span><span style="font-size: 10pt; color: #333333; font-family: Arial">Ibinder</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">对象中的方法的程序启动了和</span><span style="font-size: 10pt; color: #333333; font-family: Arial">Ibinder</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">对象相同的进程，方法就在</span><span style="font-size: 10pt; color: #333333; font-family: Arial">Ibinder</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的进程中执行。但是，如果调用者发起另外一个进程，方法在另外一个线程中运行，这个线程在和</span><span style="font-size: 10pt; color: #333333; font-family: Arial">IBinder</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">对象在一个线程池中；它不会在进程的主线程中运行。例如，一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">service</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">从主线程被调用</span><code><span style="font-size: 12pt">onBind()</span></code> <span style="font-size: 10pt; color: #333333; font-family: 宋体">方法，</span><code><span style="font-size: 12pt">onBind()</span></code> <span style="font-size: 10pt; color: #333333; font-family: 宋体">返回的对象（如实现了</span><span style="font-size: 10pt; color: #333333; font-family: Arial">RPC</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">Stub</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">子类）中的方法会被从线程池中调用。因为一个服务可能有多个客户端请求，不止一个线程池会在同一时间调用</span><span style="font-size: 10pt; color: #333333; font-family: Arial">IBinder</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的方法。因此</span><span style="font-size: 10pt; color: #333333; font-family: Arial">IBinder</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">必须线程安全。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">简单来说，一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">content provider </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">可以接收其他进程的数据请求。即使</span><span style="font-size: 9pt; color: #333333; font-family: Arial">ContentResolver</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span><span style="font-size: 9pt; color: #333333; font-family: Arial">ContentProvider</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">类没有隐藏了管理交互的细节，</span><span style="font-size: 9pt; color: #333333; font-family: Arial">ContentProvider</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">中响应这些请求的方法（</span><span style="font-size: 9pt; color: #333333; font-family: Arial">s </span><code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/ContentProvider.html#query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String)"><span style="font-size: 10.5pt">query()</span></a></span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">, </span><code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/ContentProvider.html#insert(android.net.Uri, android.content.ContentValues)"><span style="font-size: 10.5pt">insert()</span></a></span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">, </span><code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/ContentProvider.html#delete(android.net.Uri, java.lang.String, java.lang.String[])"><span style="font-size: 10.5pt">delete()</span></a></span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">, </span><code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/ContentProvider.html#update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[])"><span style="font-size: 10.5pt">update()</span></a></span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">, and </span><code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/ContentProvider.html#getType(android.net.Uri)"><span style="font-size: 10.5pt">getType()</span></a> </span></code><span style="font-size: 9pt; color: #333333; font-family: 宋体">）</span><span style="font-size: 9pt; color: #333333; font-family: Arial">— </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">是在</span><span style="font-size: 9pt; color: #333333; font-family: Arial">content provider</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的线程池中被调用的，而不是</span><span style="font-size: 9pt; color: #333333; font-family: Arial">ContentProvider</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的本身进程。因为这些方法可能是同时从很多线程池运行的，所以这些方法必须要线程安全。</span></p>
<p style="margin: 0cm 0cm 12pt 17.85pt; text-indent: 32.75pt"><strong><span style="font-size: 13pt; color: #111111; font-family: 宋体">组件生命周期</span></strong><strong></strong></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">应用程序组件有一个生命周期――开始于</span><span style="font-size: 9pt; color: #333333; font-family: Arial">Android</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">让他们去响应一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">Intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">请求，结束于对象销毁。在这期间，他们可能处于激活或者未激活、可见不可见的状态。这一节会讨论</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">、</span><span style="font-size: 9pt; color: #333333; font-family: Arial">service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span><span style="font-size: 9pt; color: #333333; font-family: Arial">broadcast receivers</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的生命周期――包括在生命周期内他们可能的状态，和如何切换状态，以及这些状态对程序被中止或者销毁的影响。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 26.45pt"><strong><span style="color: #222222; font-family: Arial">Activity </span></strong><strong><span style="color: #222222; font-family: 宋体">的生命周期</span></strong><strong></strong></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">主要有</span><span style="font-size: 9pt; color: #333333; font-family: Arial">3</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">种状态</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> </span></p>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 22.6pt"><span style="font-size: 10pt; color: #333333; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; color: #333333; font-family: 宋体">当它在屏幕的前台运行的时候（在任务堆栈的顶端），状态为</span> <em><span style="font-size: 9pt; color: #333333; font-family: Arial">active</span></em> <span style="font-size: 9pt; color: #333333; font-family: 宋体">或</span> <em><span style="font-size: 9pt; color: #333333; font-family: Arial">running</span></em> <span style="font-size: 9pt; color: #333333; font-family: 宋体">。这个时候用户的注意力集中在此</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">上。</span> </p>
<p style="margin: 12pt 0cm 0pt 27pt; text-indent: 22.6pt"><span style="font-size: 10pt; color: #333333; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; color: #333333; font-family: 宋体">当对用户仍然可见，但是失去焦点的时候，状态为</span><em><span style="font-size: 9pt; color: #333333; font-family: Arial">paused</span></em> <span style="font-size: 9pt; color: #333333; font-family: 宋体">。在它上面的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">acitivity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">要么就是半透明，要么就是没有占满屏幕，因此被暂停的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">acitivity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">仍然可见。一个暂停的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">完全是活动的（保持状态、成员信息、绑定到窗口管理器），但是当系统内存不足的时候会被关闭。</span></p>
<p style="margin: 12pt 0cm 0pt 27pt; text-indent: 22.6pt"><span style="font-size: 10pt; color: #333333; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; color: #333333; font-family: 宋体">当被其他</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">完全遮盖的时候，状态为</span> <em><span style="font-size: 9pt; color: #333333; font-family: Arial">stopped</span></em> <span style="font-size: 9pt; color: #333333; font-family: 宋体">，它仍可以保存状态和成员信息。但是当其他程序需要内存的时候它随时可能被销毁。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">如果一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">被停止或者暂停了，系统可能会通过调用它的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">finish</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">方法或者简单的关闭进程来回收内存。但是当这个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">重新可见的时候，它会重新启动并返回上一次的状态。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">当</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的状态改变的时候，它被以下受保护的方法通知：</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 30.1pt"><code><span style="font-size: 12pt">void onCreate(Bundle <em>savedInstanceState</em>)</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial"> <br />
</span><code><span style="font-size: 12pt">void onStart()</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial"> <br />
</span><code><span style="font-size: 12pt">void onRestart()</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial"> <br />
</span><code><span style="font-size: 12pt">void onResume()</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial"> <br />
</span><code><span style="font-size: 12pt">void onPause()</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial"> <br />
</span><code><span style="font-size: 12pt">void onStop()</span></code><span style="font-size: 9pt; color: #333333; font-family: Arial"> <br />
</span><code><span style="font-size: 12pt">void onDestroy()</span></code></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">这些方法都是可以重写来实现特定的要求，就像</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">在对象第一次初始化的时候必须实现</span><code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onCreate(android.os.Bundle)"><span style="font-size: 10.5pt">onCreate()</span></a></span></code><span style="font-size: 9pt; color: #333333; font-family: 宋体">方法，来做初始化的工作。很多情况下，需要实现</span><code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onPause()"><span style="font-size: 10.5pt">onPause()</span></a></span></code> <span style="font-size: 9pt; color: #333333; font-family: 宋体">来做数据保存以防程序关闭。</span></p>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">这</span><span style="font-size: 9pt; color: #333333; font-family: Arial">7</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">个方法一起构成了</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的生命周期，你可以监控这个不断循环的过程，此过程包括</span><span style="font-size: 9pt; color: #333333; font-family: Arial">3</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">种：</span></p>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 22.6pt"><span style="font-size: 10pt; color: #333333; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的<strong>整个生命周期</strong></span><strong> </strong><span style="font-size: 9pt; color: #333333; font-family: Arial">&nbsp;</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">开始于第一次调用</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onCreate(android.os.Bundle)">onCreate()</a></span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">结束于调用</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onDestroy()">onDestroy()</a></span><span style="font-size: 9pt; color: #333333; font-family: Arial">. activity </span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onCreate()</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">完成全局的状态的初始化</span><span style="font-size: 9pt; color: #333333; font-family: Arial">,</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">在</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onDestroy()</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">方法里面应该释放所有的资源。例如，在后台有一个下载数据的线程，那么应该在程序的</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onCreate()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">调用启动线程的方法，在</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onDestroy()</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">里面调用关闭线程的方法。</span></p>
<p style="margin: 12pt 0cm 0pt 27pt; text-indent: 22.6pt"><span style="font-size: 10pt; color: #333333; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; color: #333333; font-family: Arial">&nbsp;</span><strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">可见的生命周期</span></strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">开始于</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onStart()">onStart()</a></span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">结束于</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onStop()">onStop()</a></span><span style="font-size: 9pt; color: #333333; font-family: 宋体">方法。在这个期间，用户可以在屏幕上看到此</span><span style="font-size: 9pt; color: #333333; font-family: Arial">acitvity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">（即使它不在前台和用户交互）。在这个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">2</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">个方法之间，可以保存需要更新界面的资源。例如，在</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onStart()</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">方法注册了一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/BroadcastReceiver.html">BroadcastReceiver</a> </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">来监视影响</span><span style="font-size: 9pt; color: #333333; font-family: Arial">UI</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的操作，就需要在</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onStop()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">方法里面注销，因为在调用这个方法后用户不再需要操作界面。</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">随着用户不断切换程序的可见和不可见的时候，</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onStart()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onStop()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">方法会被调用很多次。</span></p>
<p style="margin: 12pt 0cm 0pt 27pt; text-indent: 22.7pt"><span style="font-size: 10pt; color: #333333; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">前台生命周期</span></strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">开始于</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onResume()">onResume()</a></span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">方法，结束于</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onPause()">onPause()</a></span><span style="font-size: 9pt; color: #333333; font-family: 宋体">方法。在这个期间，可以从屏幕上看到，此</span><span style="font-size: 9pt; color: #333333; font-family: Arial">acitivity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">在所有其他</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">前面，并且和用户交互。因为用户会频繁的从暂停、恢复状态切换，例如，当设备待机或者一个新的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">启动的时候，</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onPause()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">会被调用。当传入一个新的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">进来的时候，</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onResume()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">方法被调用。因此，这</span><span style="font-size: 9pt; color: #333333; font-family: Arial">2</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">个方法内的代码应该是轻量级的。</span></p>
<p style="margin: 12pt 0cm 0pt 9pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">以下的图片显示了</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">在状态间切换的轨迹。有色的椭圆表示了</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">最常见的状态。正方形表示了切换状态时可以监控的方法。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"></p>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">下面的表格描述了这些方法的细节和在生命周期的何处</span></p>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; width: 85%; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" width="85%" border="1">
    <thead>
        <tr>
            <td style="border-right: #cccccc 1pt solid; padding-right: 0cm; border-top: #cccccc 1pt solid; padding-left: 0cm; background: #dee8f1; padding-bottom: 0cm; border-left: #cccccc 1pt solid; padding-top: 0cm; border-bottom: #cccccc 1pt solid" valign="top" colspan="3">
            <p style="margin: 0cm 0cm 12pt; text-indent: 22.7pt; line-height: normal"><strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">方法</span></strong><strong></strong></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #cccccc 1pt solid; padding-left: 8.15pt; background: #dee8f1; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid" valign="top">
            <p style="margin: 0cm 0cm 12pt; text-indent: 22.7pt; line-height: normal"><strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">描述</span></strong><strong></strong></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #cccccc 1pt solid; padding-left: 8.15pt; background: #dee8f1; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid" valign="top">
            <p style="margin: 0cm 0cm 12pt; text-indent: 22.7pt; line-height: normal"><strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">关闭</span></strong><strong><span style="font-size: 9pt; color: #333333; font-family: Arial">?</span></strong></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #cccccc 1pt solid; padding-left: 8.15pt; background: #dee8f1; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid" valign="top">
            <p style="margin: 0cm 0cm 12pt; text-indent: 22.7pt; line-height: normal"><strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">下一个</span></strong><strong></strong></p>
            </td>
        </tr>
    </thead>
    <tr>
            <td style="border-right: #cccccc 1pt solid; padding-right: 0cm; border-top: #f4f4f4; padding-left: 0cm; padding-bottom: 0cm; border-left: #cccccc 1pt solid; padding-top: 0cm; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top" colspan="3">
            <p style="margin: 0cm 0cm 12pt; text-indent: 30.1pt; line-height: normal"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onCreate(android.os.Bundle)">onCreate()</a></span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="margin: 0cm 0cm 12pt; text-indent: 22.6pt; line-height: normal"><span style="font-size: 9pt; color: #333333; font-family: Arial">Activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">第一次建立的时候调用，应该做一般的初始化－创建</span><span style="font-size: 9pt; color: #333333; font-family: Arial">views</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">，绑定数据等。传入了一个</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">包含了此</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">之前状态的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">Bundle </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">对象。</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> (</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">参见后面的</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/fundamentals.html#actstate#actstate">Saving Activity State</a>). </span></p>
            <p style="margin: 0cm 0cm 12pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">后面一般会是：</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onStart()</span><span style="font-size: 9pt; color: #333333; font-family: Arial">.</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 22.6pt; line-height: normal"><span style="font-size: 9pt; color: #333333; font-family: Arial">No</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 30.1pt; line-height: normal"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onStart()</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: #f4f4f4; padding-right: 0cm; border-top: #f4f4f4; padding-left: 0cm; padding-bottom: 0cm; border-left: #f4f4f4; padding-top: 0cm; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top" rowspan="5">
            <p style="text-indent: 22.6pt; line-height: normal"><span style="font-size: 9pt; color: #333333; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 0cm; border-top: #f4f4f4; padding-left: 0cm; padding-bottom: 0cm; border-left: #cccccc 1pt solid; padding-top: 0cm; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top" colspan="2">
            <p style="text-indent: 30.1pt; line-height: normal"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onRestart()">onRestart()</a></span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="margin: 0cm 0cm 12pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">当</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">被停止后开始之前，后面会是：</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onStart()</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 22.6pt; line-height: normal"><span style="font-size: 9pt; color: #333333; font-family: Arial">No</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 30.1pt; line-height: normal"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onStart()</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: #cccccc 1pt solid; padding-right: 0cm; border-top: #f4f4f4; padding-left: 0cm; padding-bottom: 0cm; border-left: #cccccc 1pt solid; padding-top: 0cm; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top" colspan="2">
            <p style="text-indent: 30.1pt; line-height: normal"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onStart()">onStart()</a></span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 22.6pt; line-height: normal"><span style="font-size: 9pt; color: #333333; font-family: 宋体">当</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">对于用户可见的时候</span> </p>
            <p style="margin: 0cm 0cm 12pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">当</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">在前台运行的时候，后面会是</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onResume()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">，如果是被关闭，后面会是</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onStop()</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 22.6pt; line-height: normal"><span style="font-size: 9pt; color: #333333; font-family: Arial">No</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 30.1pt; line-height: normal"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onResume()</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> <br />
            or<br />
            </span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onStop()</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top" rowspan="2">
            <p style="text-indent: 22.6pt; line-height: normal"><span style="font-size: 9pt; color: #333333; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 30.1pt; line-height: normal"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onResume()">onResume()</a></span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="margin: 0cm 0cm 12pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">只是当</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">开始与用户交互的时候调用，这个时候，此</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">在任务堆栈的顶部，后面会是：</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onPause()</span><span style="font-size: 9pt; color: #333333; font-family: Arial">.</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 22.6pt; line-height: normal"><span style="font-size: 9pt; color: #333333; font-family: Arial">No</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 30.1pt; line-height: normal"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onPause()</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 30.1pt; line-height: normal"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onPause()">onPause()</a></span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="margin: 0cm 0cm 12pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">当系统将要调用其他</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的时候触发，这个方法里面通常用来将未保存的数据持久化，停止动画或者其他占用</span><span style="font-size: 9pt; color: #333333; font-family: Arial">cpu</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的活动。这个动作应该做的很快，因为下一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">要在这个过程之后才能启动。如果此</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">从后台到前台，后面是</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onResume()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">；如果这个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">变得不可见，后面是</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onStop()</span> </p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 22.7pt; line-height: normal"><strong><span style="font-size: 9pt; color: maroon; font-family: Arial">Yes</span></strong></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 30.1pt; line-height: normal"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onResume()</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> <br />
            or<br />
            </span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onStop()</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: #cccccc 1pt solid; padding-right: 0cm; border-top: #f4f4f4; padding-left: 0cm; padding-bottom: 0cm; border-left: #cccccc 1pt solid; padding-top: 0cm; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top" colspan="2">
            <p style="text-indent: 30.1pt; line-height: normal"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onStop()">onStop()</a></span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 22.6pt; line-height: normal"><span style="font-size: 9pt; color: #333333; font-family: 宋体">当这个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">对用户再也不可见时候触发，可是是因为</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">被销毁，或者其他</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity (</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">已有的或者新的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">)</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">被恢复并且覆盖了它。</span> </p>
            <p style="margin: 0cm 0cm 12pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">如果后面会是</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onRestart()</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">如果程序被关闭，后面会是</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onDestroy()</span> </p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 22.7pt; line-height: normal"><strong><span style="font-size: 9pt; color: maroon; font-family: Arial">Yes</span></strong></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 30.1pt; line-height: normal"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onRestart()</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> <br />
            or<br />
            </span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onDestroy()</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: #cccccc 1pt solid; padding-right: 0cm; border-top: #f4f4f4; padding-left: 0cm; padding-bottom: 0cm; border-left: #cccccc 1pt solid; padding-top: 0cm; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top" colspan="3">
            <p style="text-indent: 30.1pt; line-height: normal"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onDestroy()">onDestroy()</a></span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 22.6pt; line-height: normal"><span style="font-size: 9pt; color: #333333; font-family: 宋体">程序被关闭前调用。这个是</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">接收的最后一个方法。可能是</span><span style="font-size: 9pt; color: #333333; font-family: Arial">actvity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">结束的时候调用</span><span style="font-size: 9pt; color: #333333; font-family: Arial">(</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">某个程序调用了它的</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#finish()">finish()</a></span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">方法</span><span style="font-size: 9pt; color: #333333; font-family: Arial">), </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">或者系统临时销毁这个程序来释放资源。可以根据</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#isFinishing()">isFinishing()</a></span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">方法识别到底是哪一种</span><span style="font-size: 9pt; color: #333333; font-family: Arial">.</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 22.7pt; line-height: normal"><strong><span style="font-size: 9pt; color: maroon; font-family: Arial">Yes</span></strong></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 8.15pt; border-top: #f4f4f4; padding-left: 8.15pt; padding-bottom: 4.1pt; border-left: #f4f4f4; padding-top: 4.1pt; border-bottom: #cccccc 1pt solid; background-color: transparent" valign="top">
            <p style="text-indent: 22.6pt; line-height: normal"><em><span style="font-size: 9pt; color: #333333; font-family: Arial">nothing</span></em></p>
            </td>
        </tr>
    </table>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: Arial">&nbsp;</span></p>
<p style="margin: 0cm 0cm 12pt 9pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">请注意表格中的<strong>是否可被闭列，</strong>这个列表明了系统是否会在调用此方法后不执行此</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">中的其他代码得关闭此</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">所在的进程，这些方法</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> (</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onPause()</span><span style="font-size: 9pt; color: #333333; font-family: Arial">, </span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onStop()</span><span style="font-size: 9pt; color: #333333; font-family: Arial">, and </span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onDestroy()</span><span style="font-size: 9pt; color: #333333; font-family: Arial">)</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">是</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> "Yes." </span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onPause()</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">方法是唯一一个进程结束前一定会调用的，其他</span><span style="font-size: 9pt; color: #333333; font-family: Arial">2</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">— </span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onStop()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onDestroy()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">不一定会，因此</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onPause()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">方法中，一定要把未保存的数据持久化。</span></p>
<p style="margin: 0cm 0cm 12pt 9pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">这一列设置为</span><span style="font-size: 9pt; color: #333333; font-family: Arial">"No"</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的方法，触发后，可以保证</span><span style="font-size: 9pt; color: #333333; font-family: Arial">actvity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">所在的内存不会被回收。因此，有些状态下的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">是&#8220;可关闭&#8221;状态。例如，触发</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onPause()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">后，程序是可被关闭的，但是如果后面又触发了</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onResume()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">，程序又可以不被关闭了，</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onPause()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">又一次触发后，程序有变成&#8220;可被关闭&#8221;了。</span> </p>
<p style="margin: 0cm 0cm 12pt 9pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">后面的章节会提到（</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/fundamentals.html#proclife#proclife">Processes and lifecycle</a>,</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">）定义成不可以关闭的</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">也可能被系统关闭，但是这个只是在系统资源非常不足的情况极端情况下才会发生。</span> </p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.2pt"><strong><span style="font-size: 10pt; color: #222222; font-family: 宋体">保存</span></strong><strong><span style="font-size: 10pt; color: #222222; font-family: Arial"> activity</span></strong><strong><span style="font-size: 10pt; color: #222222; font-family: 宋体">的状态</span></strong><strong></strong></p>
<p style="margin: 0cm 0cm 12pt 9pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">当系统而非用户关闭一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">后，用户重返此</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">后，希望回到以前的状态</span> </p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">为了保存系统关闭</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">后的状态，需要实现</span><code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle)"><span style="font-size: 10.5pt">onSaveInstanceState()</span></a></span></code> <span style="font-size: 9pt; color: #333333; font-family: 宋体">方法。</span><span style="font-size: 9pt; color: #333333; font-family: Arial">Android</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">会在回收</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">（</span><code><span style="font-size: 12pt">onPause()</span></code><span style="font-size: 9pt; color: #333333; font-family: 宋体">方法调用）之前调用此方法。当重启的该</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的时候，</span><span style="font-size: 9pt; color: #333333; font-family: Arial">Android</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">会传入一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">name</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">－</span><span style="font-size: 9pt; color: #333333; font-family: Arial">value</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">集合的</span><span style="font-size: 9pt; color: #333333; font-family: Arial"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/os/Bundle.html">Bundle</a> </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">对象来恢复状态，重启后调用的方法是</span><code><span style="font-size: 12pt">onCreate()</span></code> <span style="font-size: 9pt; color: #333333; font-family: 宋体">和在</span><code><span style="font-size: 12pt">onStart()</span></code><span style="font-size: 9pt; color: #333333; font-family: 宋体">后调用的一个方法――</span> <code><span style="font-size: 12pt"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onRestoreInstanceState(android.os.Bundle)"><span style="font-size: 10.5pt">onRestoreInstanceState()</span></a></span></code><span style="font-size: 9pt; color: #333333; font-family: Arial">, </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">这</span><span style="font-size: 9pt; color: #333333; font-family: Arial">2</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">个方法中的任何一个都可以恢复状态。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">不同于</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onPause()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">以及前面提到的方法</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onSaveInstanceState()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onRestoreInstanceState()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">并不是生命周期方法，并不是经常调用。例如，</span><span style="font-size: 9pt; color: #333333; font-family: Arial">Anroid</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">在</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">要被销毁之前调用</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onSaveInstanceState()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">，但是并不会在此实例通过用户动作被销毁（如按下</span><span style="font-size: 9pt; color: #333333; font-family: Arial">Back</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">键），因为在这样的情况下，用户不会再回来此界面，因此不用保持状态。</span> </p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">因为</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onSaveInstanceState()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">不是经常被调用，只需要保存非持久化的数据，而非持久化的数据</span><span style="font-size: 9pt; color: #333333; font-family: Arial">.</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">如果需要保存持久化的数据，调用</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onPause()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 25.2pt"><strong><span style="font-size: 10pt; color: #222222; font-family: 宋体">同步</span></strong><strong><span style="font-size: 10pt; color: #222222; font-family: Arial"> activities</span></strong></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">当一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">启动另外一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的时候，这</span><span style="font-size: 9pt; color: #333333; font-family: Arial">2</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">都会经历一个生命周期。当另外一个还在运行的时候，其中一个可能已经中止了。有时，需要同步</span><span style="font-size: 9pt; color: #333333; font-family: Arial">2</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。</span> </p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">生命周期的回调已经定义好的，除非</span><span style="font-size: 9pt; color: #333333; font-family: Arial">2</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">在同一个进程：</span> </p>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: Arial">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; color: #333333; font-family: 宋体">当前</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">调用</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onPause()</span> </p>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: Arial">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; color: #333333; font-family: 宋体">然后，第二个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">actvity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">依次调用</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onCreate()</span><span style="font-size: 9pt; color: #333333; font-family: Arial">, </span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onStart()</span><span style="font-size: 9pt; color: #333333; font-family: Arial">, </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onResume()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">。</span> </p>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: Arial">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; color: #333333; font-family: 宋体">如果第二个窗体不再可见，调用</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onStop()</span> </p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 27.7pt"><strong><span style="font-size: 11pt; color: #222222; font-family: Arial">Service</span></strong><strong><span style="font-size: 11pt; color: #222222; font-family: 宋体">的生命周期</span></strong><strong></strong></p>
<p style="margin: 0cm 0cm 12pt 17.85pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: Arial">&nbsp;service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">有</span><span style="font-size: 9pt; color: #333333; font-family: Arial">2</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">种运行模式：</span> </p>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 22.6pt"><span style="font-size: 10pt; color: #333333; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; color: #333333; font-family: 宋体">如果没有程序停止它或者它自己停止，</span><span style="font-size: 9pt; color: #333333; font-family: Arial">service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">将一直运行。在这种模式下，</span><span style="font-size: 9pt; color: #333333; font-family: Arial">service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">开始于调用</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Context.html#startService(android.content.Intent)">Context.startService()</a></span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">，停止于</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Context.html#stopService(android.content.Intent)">Context.stopService()</a></span><span style="font-size: 9pt; color: #333333; font-family: Arial">. service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">可以通过调用</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Service.html#stopSelf()">Service.stopSelf()</a></span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">或</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Service.html#stopSelfResult(int)">Service.stopSelfResult()</a></span><span style="font-size: 9pt; color: #333333; font-family: 宋体">停止自己。不管调用多少次</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">startService()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">，只需要调用一次</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">stopService()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">就可以停止</span><span style="font-size: 9pt; color: #333333; font-family: Arial">service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。</span></p>
<p style="margin: 12pt 0cm 0pt 27pt; text-indent: 22.6pt"><span style="font-size: 10pt; color: #333333; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; color: #333333; font-family: 宋体">可以通过接口被外部程序调用。外部程序建立到</span><span style="font-size: 9pt; color: #333333; font-family: Arial">service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的连接，通过连接来操作</span><span style="font-size: 9pt; color: #333333; font-family: Arial">service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。建立连接调开始于</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Context.html#bindService(android.content.Intent, android.content.ServiceConnection, int)">Context.bindService()</a></span><span style="font-size: 9pt; color: #333333; font-family: Arial">, </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">结束于</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Context.html#unbindService(android.content.ServiceConnection)">Context.unbindService()</a></span><span style="font-size: 9pt; color: #333333; font-family: Arial">. </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">多个客户端可以绑定到同一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">，如果</span><span style="font-size: 9pt; color: #333333; font-family: Arial">service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">没有启动，</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">bindService()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">可以选择启动它。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">这</span><span style="font-size: 9pt; color: #333333; font-family: Arial">2</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">种模式不是完全分离的。你可以可以绑定到一个通过</span><code><span style="font-size: 12pt">startService()</span></code><span style="font-size: 9pt; color: #333333; font-family: 宋体">启动的服务。如一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">想要播放音乐，通过</span><code><span style="font-size: 12pt">startService()</span></code> <span style="font-size: 9pt; color: #333333; font-family: 宋体">方法启动后台播放音乐的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。然后，也许用户想要操作播放器或者获取当前正在播放的乐曲的信息，一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">就会通过</span><code><span style="font-size: 12pt">bindService()</span></code><span style="font-size: 9pt; color: #333333; font-family: 宋体">建立一个到此</span><span style="font-size: 9pt; color: #333333; font-family: Arial">service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的连接</span><span style="font-size: 9pt; color: #333333; font-family: Arial">. </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">这种情况下</span> <code><span style="font-size: 12pt">stopService()</span></code> <span style="font-size: 9pt; color: #333333; font-family: 宋体">在全部的连接关闭后才会真正停止</span><span style="font-size: 9pt; color: #333333; font-family: Arial">service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。</span></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">像</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">一样</span><span style="font-size: 9pt; color: #333333; font-family: Arial">, service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">也有可以通过监视状态实现的生命周期。但是比</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">要少――只有</span><span style="font-size: 9pt; color: #333333; font-family: Arial">3</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">个――而且是</span><span style="font-size: 9pt; color: #333333; font-family: Arial">public</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的而不是</span><span style="font-size: 9pt; color: #333333; font-family: Arial">protected</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的</span></p>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 30.1pt"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">void onCreate()</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> <br />
</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">void onStart(Intent <em>intent</em>)</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> <br />
</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">void onDestroy()</span></p>
<p style="text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333">通过实现这</span><span style="font-size: 9pt; color: #333333; font-family: Arial">3</span><span style="font-size: 9pt; color: #333333">个方法，可以监视</span><span style="font-size: 9pt; color: #333333; font-family: Arial">service</span><span style="font-size: 9pt; color: #333333">生命周期的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">2</span><span style="font-size: 9pt; color: #333333">个嵌套循环：</span></p>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 22.7pt"><span style="font-size: 10pt; color: #333333; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">整个生命周期</span></strong> <span style="font-size: 9pt; color: #333333; font-family: 宋体">从</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Service.html#onCreate()">onCreate()</a></span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">开始，从</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Service.html#onDestroy()">onDestroy()</a></span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">结束，像</span><span style="font-size: 9pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">一样</span><span style="font-size: 9pt; color: #333333; font-family: Arial">, a service </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">在</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onCreate()</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">中执行初始化操作，在</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onDestroy()</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">中释放所有用到的资源。如：后台播放音乐的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">可能在</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onCreate()</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">创建一个播放音乐的线程，在</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onDestroy()</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">中销毁这个线程。</span> </p>
<p style="margin: 12pt 0cm 0pt 27pt; text-indent: 22.6pt"><span style="font-size: 10pt; color: #333333; font-family: Symbol">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; color: #333333; font-family: Arial">&nbsp;</span><strong><span style="font-size: 9pt; color: #333333; font-family: 宋体">活动生命周期</span></strong> <span style="font-size: 9pt; color: #333333; font-family: 宋体">开始于</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Service.html#onStart(android.content.Intent, int)">onStart()</a></span><span style="font-size: 9pt; color: #333333; font-family: Arial">. </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">这个方法处理传入到</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">startService()</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">方法的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">音乐服务会打开</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">查看要播放哪首歌曲，并开始播放。</span></p>
<p style="text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: Arial">&nbsp;</span><span style="font-size: 9pt; color: #333333">当服务停止的时候，没有方法检测到――没有</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> onStop() </span><span style="font-size: 9pt; color: #333333">方法。</span></p>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 30.1pt"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onCreate()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onDestroy()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">用于所有通过</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Context.html#startService(android.content.Intent)">Context.startService()</a></span><span style="font-size: 9pt; color: #333333; font-family: Arial"> or </span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Context.html#bindService(android.content.Intent, android.content.ServiceConnection, int)">Context.bindService()</a></span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">启动的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onStart()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">只用于通过</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">startService()</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">开始的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">。</span></p>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">如果一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">是可以从外部绑定的，它就可以触发以下的方法：</span> </p>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 30.1pt"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">IBinder onBind(Intent <em>intent</em>)</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> <br />
</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">boolean onUnbind(Intent <em>intent</em>)</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> <br />
</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">void onRebind(Intent <em>intent</em>)</span></p>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 30.1pt"><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Service.html#onBind(android.content.Intent)">onBind()</a></span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">回调被传递给调用</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">bindService</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">，</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Service.html#onUnbind(android.content.Intent)">onUnbind()</a></span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">被</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">unbindService()</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">中的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">处理。如果服务允许被绑定，那么</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onBind()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">方法返回客户端和</span><span style="font-size: 9pt; color: #333333; font-family: Arial">sercie</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的沟通通道。如果一个新的客户端连接到服务，</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onUnbind()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">会触发</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Service.html#onRebind(android.content.Intent)">onRebind()</a></span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">调用。</span> </p>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">下面的图表说明了</span><span style="font-size: 9pt; color: #333333; font-family: Arial">sercice</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的回调方法。下面的图片将通过</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">startService</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">和通过</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">bindService()</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">启动的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">分开了，但是要注意不管他们怎么启动的，都有可能被客户端连接，因此都有可能触发到</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onBind()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">和</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onUnbind()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">方法。</span></p>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 22.6pt"></p>
<p style="margin: 0cm 0cm 0pt 169.25pt; text-indent: 27.7pt; line-height: normal"><strong>&nbsp;</strong></p>
<p style="margin: 0cm 0cm 0pt 27pt; text-indent: 27.7pt; line-height: normal"><strong><span style="font-size: 11pt; color: #222222; font-family: Arial">Broadcast receiver </span></strong><strong><span style="font-size: 11pt; color: #222222; font-family: 宋体">的生命周期</span></strong><strong></strong></p>
<p style="margin: 0cm 0cm 12pt 18pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: Arial">&nbsp;broadcast receiver</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">只有一个回调方法：</span> </p>
<p style="margin: 0cm 0cm 12pt 27pt; text-indent: 30.1pt"><code><span style="font-size: 12pt">void onReceive(Context <em>curContext</em>, Intent <em>broadcastMsg</em>)</span></code></p>
<p style="text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: Arial">&nbsp;</span><span style="font-size: 9pt; color: #333333">当经过</span><span style="font-size: 9pt; color: #333333; font-family: Arial">receiver </span><span style="font-size: 9pt; color: #333333">请求，</span><span style="font-size: 9pt; color: #333333; font-family: Arial">broadcast message</span><span style="font-size: 9pt; color: #333333">到达的时候</span><span style="font-size: 9pt; color: #333333; font-family: Arial">, Android </span><span style="font-size: 9pt; color: #333333">调用持有</span><span style="font-size: 9pt; color: #333333; font-family: Arial">message</span><span style="font-size: 9pt; color: #333333">的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">intent</span><span style="font-size: 9pt; color: #333333">的</span> <span style="color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/BroadcastReceiver.html#onReceive(android.content.Context, android.content.Intent)">onReceive()</a></span> <span style="font-size: 9pt; color: #333333">方法，只有</span><span style="font-size: 9pt; color: #333333; font-family: Arial">broadcast receivers</span><span style="font-size: 9pt; color: #333333">执行此方法的时候才是激活的，当</span> <span style="color: #007000; font-family: 'Courier New'">onReceive()</span><span style="font-size: 9pt; color: #333333">返回的时候，它就是非激活状态</span> </p>
<p style="margin: 0cm 0cm 12pt 9pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">一个含有激活的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">broadcast receiver</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的进程是不会被中止的。但是只含有非激活组件的进程在它占用的内存被其他程序请求的时候，任何时间都可以被中止。</span> </p>
<p style="margin: 0cm 0cm 12pt 9pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">当响应</span><span style="font-size: 9pt; color: #333333; font-family: Arial">broadcast message</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">的程序因为消耗很多时间而在另外一个线程</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">而非</span><span style="font-size: 9pt; color: #333333; font-family: Arial">UI</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">所在的线程处理的时候会出现一个问题，，当</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onReceive()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">开启一个线程并返回后，整个程序（包括新建的线程）状态是非激活的</span><span style="font-size: 9pt; color: #333333; font-family: Arial">(</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">除非此进程中有其他激活的组件</span><span style="font-size: 9pt; color: #333333; font-family: Arial">), </span><span style="font-size: 9pt; color: #333333; font-family: 宋体">因此这个进程就有被中止的危险。解决这个问题的办法是</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'">onReceive()</span> <span style="font-size: 9pt; color: #333333; font-family: 宋体">方法启动一个</span><span style="font-size: 9pt; color: #333333; font-family: Arial">service</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">，让</span><span style="font-size: 9pt; color: #333333; font-family: Arial">sercie</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">去做耗时的工作，这样系统就知道此进程中还有活动的工作。</span> </p>
<p style="margin: 0cm 0cm 12pt 9pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: 宋体">下面的章节有更多关于进程被中止的讨论。</span><span style="font-size: 9pt; color: #333333; font-family: Arial"> </span></p>
<p style="margin: 0cm 0cm 12pt 9pt; text-indent: 22.6pt">&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: 27.7pt; line-height: normal"><strong><span style="font-size: 11pt; color: #222222; font-family: 宋体">进程生命周期</span></strong><strong></strong></p>
<p style="margin: 0cm 0cm 12pt 9pt; text-indent: 22.6pt"><span style="font-size: 9pt; color: #333333; font-family: Arial">Android</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">尽量不去中止一个进程，但是当内存不足的时候它必须中止一些老的线程。为了决定哪些进程保留哪些进程中止，</span><span style="font-size: 9pt; color: #333333; font-family: Arial">Android</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">给这些进程一个&#8220;重要级&#8221;，这个级别取决于进程中的组件和组件的状态。最不重要的进程先被中止，然后是次不重要的，依此类推。重要级别有</span><span style="font-size: 9pt; color: #333333; font-family: Arial">5</span><span style="font-size: 9pt; color: #333333; font-family: 宋体">个程度，以下详细说明：</span> </p>
<p style="margin: 0cm 0cm 12pt 63pt; text-indent: 25.2pt"><span style="font-size: 10pt; color: #333333; font-family: Arial">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: #333333; font-family: 宋体">前台进程</span></strong><span style="font-size: 10pt; color: #333333; font-family: 宋体">是用户当前正在使用的进程。如果满足以下条件之一则进程可以作为前台进程。</span> </p>
<p style="margin: 0cm 0cm 12pt 63pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 'Courier New'">o<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #333333; font-family: 宋体">有一个用户正在交互的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">，</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> (Activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">对象的</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onResume()">onResume()</a></span><span style="font-size: 10pt; color: #333333; font-family: 宋体">方法被调用</span><span style="font-size: 10pt; color: #333333; font-family: Arial">). </span></p>
<p style="margin: 12pt 0cm 0pt 63pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 'Courier New'">o<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #333333; font-family: 宋体">有一个响应用户正在交互的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">sercie.</span></p>
<p style="margin: 12pt 0cm 0pt 63pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 'Courier New'">o<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #333333; font-family: 宋体">有一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Service.html">Service</a> </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">对象正在执行生命周期的方法</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> (</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Service.html#onCreate()">onCreate()</a></span><span style="font-size: 10pt; color: #333333; font-family: Arial">, </span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Service.html#onStart(android.content.Intent, int)">onStart()</a></span><span style="font-size: 10pt; color: #333333; font-family: Arial">, or </span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Service.html#onDestroy()">onDestroy()</a></span><span style="font-size: 10pt; color: #333333; font-family: Arial">).</span></p>
<p style="margin: 12pt 0cm 0pt 63pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 'Courier New'">o<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #333333; font-family: 宋体">有一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/BroadcastReceiver.html">BroadcastReceiver</a> </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">对象在执行</span><span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/BroadcastReceiver.html#onReceive(android.content.Context, android.content.Intent)">onReceive()</a></span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">方法</span><span style="font-size: 10pt; color: #333333; font-family: Arial">.</span></p>
<p style="margin: 12pt 0cm 0pt 63pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">只有一些前台进程可以在任何时候都存在。他们是最后一个被结束的――当内存低到根本连他们都不能运行的时候。一般来说，在这种情况下，设备会进行内存调度，中止一些前台进程来保持对用户交互的响应。</span><span style="font-size: 10pt; color: #333333; font-family: Arial">. </span></p>
<p style="margin: 12pt 0cm 0pt 63pt; text-indent: 25.2pt"><span style="font-size: 10pt; color: #333333; font-family: Arial">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: #333333; font-family: 宋体">可见进程</span></strong><span style="font-size: 10pt; color: #333333; font-family: 宋体">不包含前台的组件但是会在屏幕上显示。如果满足了以下任意一个条件，进程就可以视为可见：</span></p>
<p style="margin: 0cm 0cm 12pt 63pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 'Courier New'">o<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #333333; font-family: 宋体">有一个非前台的但是仍然对用户可见的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">（</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onPause()">onPause()</a></span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">方法被调用）</span><span style="font-size: 10pt; color: #333333; font-family: Arial">. </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">这种情况发生于，例如，当前前台的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">是一个对话框，上一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">还是可见的。</span> </p>
<p style="margin: 12pt 0cm 0pt 63pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 'Courier New'">o<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #333333; font-family: 宋体">具有一个绑定到可见</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">service</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">。</span></p>
<p style="margin: 12pt 0cm 0pt 63pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">一个可见的进程是的重要程度很高，除非前台进程需要获取它的资源，不然不会被中止。</span> </p>
<p style="margin: 12pt 0cm 0pt 63pt; text-indent: 25.2pt"><span style="font-size: 10pt; color: #333333; font-family: Arial">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: #333333; font-family: 宋体">服务进程</span></strong> <span style="font-size: 10pt; color: #333333; font-family: 宋体">中运行着一个通过</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/content/Context.html#startService(android.content.Intent)">startService()</a></span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">方法启动的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">service</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">，这个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">service</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">不属于上面提到的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">2</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">种更高重要性的。</span><span style="font-size: 10pt; color: #333333; font-family: Arial">service</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">所在的进程虽然对用户不是直接可见的，但是他们执行了用户非常关注的任务（比如播放</span><span style="font-size: 10pt; color: #333333; font-family: Arial">mp3</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">，从网络下载数据）。只要前台进程和可见进程有足够的内存，系统不会回收他们。</span> </p>
<p style="margin: 12pt 0cm 0pt 63pt; text-indent: 25.2pt"><span style="font-size: 10pt; color: #333333; font-family: Arial">4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: #333333; font-family: 宋体">后台进程</span></strong> <span style="font-size: 10pt; color: #333333; font-family: 宋体">中运行着一个对用户不可见的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">（调用过</span> <span style="font-size: 12pt; color: #007000; font-family: 'Courier New'"><a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/reference/android/app/Activity.html#onStop()">onStop()</a></span> <span style="font-size: 10pt; color: #333333; font-family: 宋体">方法</span><span style="font-size: 10pt; color: #333333; font-family: Arial">).</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">这些进程对用户体验没有直接的影响，可以在服务进程、可见进程、前台进程需要内存的时候回收。通常，系统中会有很多不可见进程在运行，他们被保存在</span><span style="font-size: 10pt; color: #333333; font-family: Arial">LRU (least recently used) </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">列表中，以便内存不足的时候被第一时间回收。如果一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">正确的执行了它的生命周期，关闭这个进程对于用户体验没有太大的影响。</span> </p>
<p style="margin: 12pt 0cm 0pt 63pt; text-indent: 25.2pt"><span style="font-size: 10pt; color: #333333; font-family: Arial">5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: #333333; font-family: 宋体">空进程</span></strong> <span style="font-size: 10pt; color: #333333; font-family: 宋体">中未运行任何程序组件。运行这些进程的唯一原因是作为一个缓存，缩短下次程序需要重新使用的启动时间。系统经常中止这些进程，这样可以调节程序缓存和系统缓存的平衡。</span><span style="font-size: 10pt; color: #333333; font-family: Arial">.</span></p>
<p style="margin: 0cm 0cm 12pt 63pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: Arial">Android </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">对进程的重要性评级的时候，选取它最高的级别。例如一个进程中有一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">service</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">和可以可见的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">，则</span><span style="font-size: 10pt; color: #333333; font-family: Arial">Android</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">将此进程评判为&#8220;可见进程&#8221;而非&#8220;服务进程。&#8221;</span> </p>
<p style="margin: 0cm 0cm 12pt 63pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">另外，当被另外的一个进程依赖的时候，某个进程的级别可能会增高。一个为其他进程服务的进程永远不会比被服务的进程重要级低。例如，进程</span><span style="font-size: 10pt; color: #333333; font-family: Arial">A</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">中的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">content provider </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">正在为客户进程</span><span style="font-size: 10pt; color: #333333; font-family: Arial">B</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">提供数据</span><span style="font-size: 10pt; color: #333333; font-family: Arial">,</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">或者</span><span style="font-size: 10pt; color: #333333; font-family: Arial">A</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">中的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">service</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">绑定到进程</span><span style="font-size: 10pt; color: #333333; font-family: Arial">B</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">中，那么</span><span style="font-size: 10pt; color: #333333; font-family: Arial">A</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的重要级最少都是</span><span style="font-size: 10pt; color: #333333; font-family: Arial">B</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">的重要级。</span> </p>
<p style="margin: 0cm 0cm 12pt 63pt; text-indent: 25.1pt"><span style="font-size: 10pt; color: #333333; font-family: 宋体">因为服务进程比后台</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">进程重要级高，因此一个要进行耗时工作的</span><span style="font-size: 10pt; color: #333333; font-family: Arial">acitvity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">最好启动一个</span><span style="font-size: 10pt; color: #333333; font-family: Arial">service</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">来做这个工作，而不是开启一个子进程――特别是这个操作需要的时间比</span><span style="font-size: 10pt; color: #333333; font-family: Arial">activity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">存在的时间还要长的时候。例如，在后台播放音乐，向网上上传摄像头拍到的图片，使用</span><span style="font-size: 10pt; color: #333333; font-family: Arial">service</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">可以使进程最少获取到&#8220;服务进程&#8221;级别的重要级，而不用考虑</span><span style="font-size: 10pt; color: #333333; font-family: Arial">acrivity</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">目前是什么状态。向</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> <a href="http://www.cnblogs.com/xxpyeippx/admin/file:///E:/android-sdk-windows-1.1_r1/android-sdk-windows-1.1_r1/docs/guide/topics/fundamentals.html#broadlife#broadlife">Broadcast receiver lifecycle</a> </span><span style="font-size: 10pt; color: #333333; font-family: 宋体">章节讲到的，</span><span style="font-size: 10pt; color: #333333; font-family: Arial"> broadcast receivers</span><span style="font-size: 10pt; color: #333333; font-family: 宋体">做费时的工作的时候，也应该启用一个服务而不是开一个线程。</span> </p>
<p style="margin: 12pt 0cm 0pt 9pt; text-indent: 25.1pt">&nbsp;</p>
<p style="margin: 12pt 0cm 0pt 63pt; text-indent: 25.1pt">&nbsp;</p>
<img src="http://www.cnblogs.com/xxpyeippx/aggbug/1447269.html?type=1" width="1" height="1" alt=""/><p>评论: 3　<a href="http://www.cnblogs.com/xxpyeippx/archive/2009/04/30/1447269.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/xxpyeippx/archive/2009/04/30/1447269.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/>· <a href="http://news.cnblogs.com/n/56852/" target="_blank">淘宝网通过索引模式涉足网络文学</a><span style="color:gray">(2010-02-10 15:59)</span><br/>· <a href="http://news.cnblogs.com/n/56851/" target="_blank">苹果发布 iPhone/iPad SDK 3.2 beta2 开发包</a><span style="color:gray">(2010-02-10 15:37)</span><br/>· <a href="http://news.cnblogs.com/n/56850/" target="_blank">“谷姐”：披着“谷歌”羊皮的悲哀？</a><span style="color:gray">(2010-02-10 15:32)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>php,mysql下中文编码解决方案</title><link>http://www.cnblogs.com/xxpyeippx/archive/2009/03/08/1406545.html</link><dc:creator>xxp</dc:creator><author>xxp</author><pubDate>Sun, 08 Mar 2009 14:36:00 GMT</pubDate><guid>http://www.cnblogs.com/xxpyeippx/archive/2009/03/08/1406545.html</guid><description><![CDATA[<p>阅读: 151 评论: 0 作者: <a href="http://www.cnblogs.com/xxpyeippx/" target="_blank">xxp</a> 发表于 2009-03-08 22:36 <a href="http://www.cnblogs.com/xxpyeippx/archive/2009/03/08/1406545.html" target="_blank">原文链接</a></p><p>文档：</p>
<p>&nbsp;</p>
<p>sample enviroment:<br />
it's not simle to yours but I think it will work.<br />
windows server 2003 Simple Chinese edition<br />
apache 2.2.11<br />
php-5.2.8-Win32<br />
MySQL-5.1.31<br />
=============</p>
<p><br />
0.编码选择：UTF-8 还是 GB2312还是GBK。<br />
UTF-8可以兼容ASCII编码，会根据需要占用1个或者2个字节，比较小。（其他如UTF-16和UTF-32是固定死占用2个字节或者4个字节的）<br />
GB2312只能包括6000多常用字<br />
GBK可以包含简体、繁体，范围广</p>
<p>1. PHP中的设置<br />
php中要对php.ini文件中设置开启extension=php_mbstring.dll，按照需要修改mb_string的相关编码配置<br />
2.MySql中的设置：<br />
因为mySql字符集的支持细化到四个层次: 服务器(server)，数据库(database)，数据表(table)和连接(connection)。因此可以后面再设置<br />
3.Apache中的设置：<br />
如果是UTF-8就不用设置，如果是GBK需要设置一下httpd.conf ，开启AddDefaultCharset<br />
4.具体操作：<br />
第一步：建立数据库<br />
默认是latine的encoding和collection的。因为只有一个字段是中文的，所以不用修改数据库的默认配置文件。<br />
只要建立数据库的时候，对这个字段设置为gbk_chinese_ci即可<br />
第二步：设置网页的charset和encoding。如果是没有设置，将根据客户端的Request来<br />
第三步，建立连接的时候需要<br />
SET character_set_client='gbk'<br />
SET character_set_connection='gbk'<br />
SET character_set_results='gbk'<br />
（这个配置就等价于 SET NAMES 'gbk'。<br />
）</p>
<p><br />
================================================</p>
<p>0.choose an encoding<br />
you have 3 choises:utf-8,gb2312 and GBK.<br />
UTF-8 contains ASKII, and it uses 1 or 2 bytes so it's smaller to transform in web.<br />
but it's contains less Chinese Characters.(Others like UTF-16 and UTF-32,is fixed to user 2 or 4 bytes)<br />
GB2312 contains only 6000 more popular characters, such as '朱镕基' can't be contained.<br />
GBK contains simple Chinese and Tranditional Chinese ,I think it's pro. my sample is for GBK.</p>
<p><br />
1. config PHP<br />
modify php.ini , and set the line<br />
extension=php_mbstring.dll<br />
on<br />
.maybe you need to configurate the mb_string.<br />
2.mySql configration<br />
as mySql supports defferent charset in 4 layers, the server, the database,the table and connection.<br />
and you have only one table ,one field in Chinese, you need not to modify the whole mysql configration</p>
<p>3.Apache configuration<br />
If you are willing to use UTF-8 , you need not to configurate anything for it support utf-8 by default.<br />
if you want to use GBK you need to modify httpd.conf and open the AddDefaultCharset</p>
<p>4.sample steps:<br />
firstly, create a database<br />
and the database's collection is latine.<br />
when you create the table, the field, set the field's collection to gbk_chinese_ci</p>
<p>secondly, set the special pages you want to show the Chinese Characters.<br />
set the charset and encoding</p>
<p><br />
third, when you build a connection ,either in commandline or php , you need to run the 3 lines script:</p>
<p>SET character_set_client='gbk'<br />
SET character_set_connection='gbk'<br />
SET character_set_results='gbk'</p>
<p>these three lines are equle to </p>
<p>&nbsp;SET NAMES 'gbk'</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>例子：</p>
<p>&nbsp;</p>
<p>php文件</p>
<p>&nbsp;</p>
<p>&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=GBK" /&gt;<br />
&lt;title&gt;测试中文入数据库&lt;/title&gt;<br />
&lt;/head&gt;</p>
<p>&lt;body&gt;<br />
&lt;ul&gt;<br />
&nbsp;&lt;?php <br />
&nbsp;$conn = mysql_connect("localhost","root","sa");<br />
mysql_query("set names 'gbk'");//关键是这句<br />
mysql_select_db("test");<br />
$sql = "select * from chinesetest ";<br />
$result = mysql_query($sql,$conn);</p>
<p><br />
while($row = mysql_fetch_assoc($result))<br />
{<br />
&nbsp;echo&nbsp; "&lt;li&gt;".$row['id']."-".$row["CF"]."&lt;/li&gt;";<br />
}</p>
<p>$sql2 = "Insert Into chinesetest (CF) values('中文插入测试');";<br />
mysql_query($sql2);<br />
$sql2 = "Insert Into chinesetest (CF) values('請看，這裡是繁體中文')";<br />
//echo $sql2;<br />
mysql_query($sql2);<br />
echo mysql_error();</p>
<p>mysql_close();<br />
?&gt;&nbsp; <br />
&lt;/ul&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
&nbsp;整体解决方案：</p>
<p><a href="http://www.cnblogs.com/Files/xxpyeippx/chinese_on_mysql.zip">/Files/xxpyeippx/chinese_on_mysql.zip</a></p>
<p>建表语句：</p>
<p>CREATE TABLE IF NOT EXISTS `chinesetest` (<br />
&nbsp; `id` int(11) NOT NULL AUTO_INCREMENT,<br />
&nbsp; `CF` varchar(255) CHARACTER SET gbk NOT NULL,<br />
&nbsp; PRIMARY KEY (`id`)<br />
) ENGINE=MyISAM&nbsp; DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;<br />
<br />
</p>
<p>&nbsp;</p>
<img src="http://www.cnblogs.com/xxpyeippx/aggbug/1406545.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/xxpyeippx/archive/2009/03/08/1406545.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/xxpyeippx/archive/2009/03/08/1406545.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/>· <a href="http://news.cnblogs.com/n/56852/" target="_blank">淘宝网通过索引模式涉足网络文学</a><span style="color:gray">(2010-02-10 15:59)</span><br/>· <a href="http://news.cnblogs.com/n/56851/" target="_blank">苹果发布 iPhone/iPad SDK 3.2 beta2 开发包</a><span style="color:gray">(2010-02-10 15:37)</span><br/>· <a href="http://news.cnblogs.com/n/56850/" target="_blank">“谷姐”：披着“谷歌”羊皮的悲哀？</a><span style="color:gray">(2010-02-10 15:32)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title> asp.net中使用ajax中的三种方式</title><link>http://www.cnblogs.com/xxpyeippx/archive/2009/02/21/1395489.html</link><dc:creator>xxp</dc:creator><author>xxp</author><pubDate>Sat, 21 Feb 2009 09:02:00 GMT</pubDate><guid>http://www.cnblogs.com/xxpyeippx/archive/2009/02/21/1395489.html</guid><description><![CDATA[<p>阅读: 124 评论: 0 作者: <a href="http://www.cnblogs.com/xxpyeippx/" target="_blank">xxp</a> 发表于 2009-02-21 17:02 <a href="http://www.cnblogs.com/xxpyeippx/archive/2009/02/21/1395489.html" target="_blank">原文链接</a></p><p>asp.net中使用php常用的jquery等类库来实现ajax不是很容易。因为</p>
<p>asp.net的机制已经被封装了，依靠内部的viewstate，如果硬用js修改了控件的值，跟他的viewstate对不上，而这些控件又是不可修改的，将对程序造成安全性困扰，后台获取值也是一个麻烦。</p>
<p>另外，asp.net的控件也封装了html控件，使用js操作不是这么直接。</p>
<p>根据Surance（ <a href="http://www.fltek.com.cn/">http://www.fltek.com.cn/</a>)研究发现，在asp.net中，有3种方法使用ajax比较简单。算是ms的一个补偿方案来的。</p>
<p>一个是PageMethod，一个是使用ICallbackEventHandler，还有一个是用ms自带的ajax控件。</p>
<p>分别举例说明，</p>
<p>以下例子要实现的功能为：</p>
<p>在页面有一个div，一个按钮。点击按钮要调用后台方法获取一个时间，然后将时间写入div。要求页面不刷新</p>
<p>另外有个后台的按钮，点击此按钮，取到保存后的值</p>
<p>1.PageMehtod</p>
<p>第一步，建立一个asp.net的ajax网站（或者建立普通网站后修改webconfig）</p>
<p>第二步，在页面建立控件：</p>
<p>&nbsp;&lt;asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" /&gt;</p>
<p>&nbsp;&lt;div id="show" runat="server"&gt;aaaa<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/div&gt;</p>
<p>&nbsp; &lt;asp:HiddenField ID="HiddenField1" runat="server" /&gt;</p>
<p>&nbsp; &lt;input type="button" value="1111" onclick="myFun()" id="Button2" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Button ID="Button1" runat="server" Text="getValue" OnClick="Button1_Click" /&gt;</p>
<p>&nbsp;</p>
<p>第三步，js</p>
<p>&nbsp;&lt;script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function myFun()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red">PageMethods</span>.GetDate('a',myCallBack)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function myCallBack(result)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var di = document.getElementById("HiddenField1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; di.value=result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;var di = document.getElementById("show");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; di.innerHTML=result;<br />
<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/script&gt;</p>
<p>&nbsp;</p>
<p>第四步，后台代码</p>
<p>注意，这个方法必须是静态方法，必须是写入以下特性。</p>
<p>因此这个方法不可以直接访问页面的值</p>
<p>&nbsp;[System.Web.Services.WebMethod]<br />
&nbsp;&nbsp;&nbsp; public static DateTime GetDate(string a)<br />
&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return DateTime.Now;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; protected void Button1_Click(object sender, EventArgs e)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataTable dt = (DataTable)this.DataList1.DataSource;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(dt.Rows.Count);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>2.使用ICallbackEventHandler</p>
<p>第一步同上</p>
<p>第二步，页面实现接口</p>
<p>public partial class Default2 : System.Web.UI.Page, ICallbackEventHandler<br />
</p>
<p>第三步，建立控件</p>
<p>&nbsp;</p>
<p>&nbsp;&lt;form id="form1" runat="server"&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;div id="show"&gt;<br />
&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; &lt;/div&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;input type="button" onclick="CallServer()" value="CallServer"&gt;&lt;/input&gt;</p>
<p>&nbsp;</p>
<p>第四步，</p>
<p>写入js</p>
<p>&nbsp;&lt;script type="text/javascript"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function CallServer()<br />
&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var product = "1";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%= ClientScript.GetCallbackEventReference(this, "product", "ReceiveServerData",null)%&gt;;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; function ReceiveServerData(rValue)<br />
&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(rValue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var di = document.getElementById("show");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; di.innerHTML=rValue;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&lt;/script&gt;</p>
<p>&nbsp;</p>
<p>第五步，</p>
<p>后台代码</p>
<p>声明变量：&nbsp;public&nbsp; string CallBackValue;</p>
<p>接口方法：</p>
<p>&nbsp;public string GetCallbackResult()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return CallBackValue + ",ok";</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void RaiseCallbackEvent(string eventArgument)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.CallBackValue = eventArgument;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p><br />
}</p>
<p>&nbsp;</p>
<p>说明：RaiseCallbackEvent是实际做事的方法</p>
<p>GetCallbackResult是执行完动作回调的方法。</p>
<p>可以修改控件的值。</p>
<p>先执行后台的回调方法，后执行前台js的回调方法</p>
<p>可以使用RenderControl等类，来将asp.net控件输出为html</p>
<p>可以在RaiseCallbackEvent中switchargument，看看是什么地方传来的，以便调用不同的函数。</p>
<img src="http://www.cnblogs.com/xxpyeippx/aggbug/1395489.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/xxpyeippx/archive/2009/02/21/1395489.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/xxpyeippx/archive/2009/02/21/1395489.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/>· <a href="http://news.cnblogs.com/n/56852/" target="_blank">淘宝网通过索引模式涉足网络文学</a><span style="color:gray">(2010-02-10 15:59)</span><br/>· <a href="http://news.cnblogs.com/n/56851/" target="_blank">苹果发布 iPhone/iPad SDK 3.2 beta2 开发包</a><span style="color:gray">(2010-02-10 15:37)</span><br/>· <a href="http://news.cnblogs.com/n/56850/" target="_blank">“谷姐”：披着“谷歌”羊皮的悲哀？</a><span style="color:gray">(2010-02-10 15:32)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>翻译：xoops搜索功能的使用</title><link>http://www.cnblogs.com/xxpyeippx/archive/2008/08/16/1269517.html</link><dc:creator>xxp</dc:creator><author>xxp</author><pubDate>Sat, 16 Aug 2008 14:20:00 GMT</pubDate><guid>http://www.cnblogs.com/xxpyeippx/archive/2008/08/16/1269517.html</guid><description><![CDATA[<p>阅读: 74 评论: 0 作者: <a href="http://www.cnblogs.com/xxpyeippx/" target="_blank">xxp</a> 发表于 2008-08-16 22:20 <a href="http://www.cnblogs.com/xxpyeippx/archive/2008/08/16/1269517.html" target="_blank">原文链接</a></p><p>原文地址：<a href="http://www.xoops.org/modules/mediawiki/index.php?title=Dev:search_function&amp;curid=355&amp;oldid=1067">http://www.xoops.org/modules/mediawiki/index.php?title=Dev:search_function&amp;curid=355&amp;oldid=1067</a><br />
注意：我是一个新的xoops开发者，请时刻留意这一点<br />
记录一下我开发myguestBook模块时候学到的搜索功能<br />
1. 第一，向xoops_version.php文件加入以下的代码</p>
<p>&nbsp;Search $modversion['hasSearch'] = 1; <br />
&nbsp;$modversion['search']['file'] = "include/search.inc.php";<br />
&nbsp;$modversion['search']['func'] = "guestbook_search";<br />
2.第二，按照以上的设定添加文件，并写代码：</p>
<p>&nbsp;</p>
<p>=====</p>
<p>翻译者：Surance Yin&nbsp; (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#83;&#117;&#114;&#97;&#110;&#99;&#101;&#121;&#105;&#110;&#64;&#121;&#97;&#104;&#111;&#111;&#46;&#99;&#111;&#109;&#46;&#99;&#110;">Suranceyin@yahoo.com.cn</a>)</p>
<p>&#169;：http://www.fltek.com.cn</p>
<p>=====</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_221812" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_221812').style.display='none'; document.getElementById('Code_Open_Image_221812').style.display='inline'; document.getElementById('Code_Open_Text_221812').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_221812" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_221812').style.display='none'; getElementById('Code_Closed_Image_221812').style.display='inline'; getElementById('Code_Closed_Text_221812').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_221812">Code</span><span id="Code_Open_Text_221812" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&lt;?</span><span style="color: #000000">php<br />
<br />
</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;这些代码是从newbb借鉴的<br />
<br />
//&nbsp;函数名是在xoops_version.php里面定义的<br />
<br />
//&nbsp;加入参数&nbsp;"$queryarray,&nbsp;$andor,&nbsp;$limit,&nbsp;$offset,&nbsp;$userid"&nbsp;<br />
<br />
//&nbsp;注意:&nbsp;$andor&nbsp;默认值为&nbsp;AND,&nbsp;可以设置为&nbsp;'AND',&nbsp;'OR'&nbsp;or&nbsp;'exact',&nbsp;取决于高级搜索界面的三个选项。你的搜索逻辑必须考虑以上的三个值</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;guestbook_search(</span><span style="color: #800080">$queryarray</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">$andor</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">$limit</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">$offset</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">$userid</span><span style="color: #000000">){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">global</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">$xoopsDB</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;开始构造sql语句</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">$sql</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">SELECT&nbsp;id,name,title,message,time&nbsp;FROM&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">.</span><span style="color: #800080">$xoopsDB</span><span style="color: #000000">-&gt;</span><span style="color: #000000">prefix(</span><span style="color: #000000">"</span><span style="color: #000000">myguestbook</span><span style="color: #000000">"</span><span style="color: #000000">)</span><span style="color: #000000">.</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;如果$queryarray不是一个数组，count()函数也会返回1.&nbsp;因此要使用is_array()检查是否是数组</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;</span><span style="color: #008080">is_array</span><span style="color: #000000">(</span><span style="color: #800080">$queryarray</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">$count</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #008080">count</span><span style="color: #000000">(</span><span style="color: #800080">$queryarray</span><span style="color: #000000">)&nbsp;)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">$sql</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">.=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;WHERE&nbsp;((name&nbsp;LIKE&nbsp;'%</span><span style="color: #800080">$queryarray</span><span style="color: #000000">[0]%'&nbsp;OR&nbsp;title&nbsp;LIKE&nbsp;'%</span><span style="color: #800080">$queryarray</span><span style="color: #000000">[0]%'&nbsp;OR&nbsp;message&nbsp;LIKE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%</span><span style="color: #800080">$queryarray</span><span style="color: #000000">[0]%')</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #800080">$i</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000">;</span><span style="color: #800080">$i</span><span style="color: #000000">&lt;</span><span style="color: #800080">$count</span><span style="color: #000000">;</span><span style="color: #800080">$i</span><span style="color: #000000">++</span><span style="color: #000000">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">$sql</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">.=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">$andor</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">$sql</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">.=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">(name&nbsp;LIKE&nbsp;'%</span><span style="color: #800080">$queryarray</span><span style="color: #000000">[</span><span style="color: #800080">$i</span><span style="color: #000000">]%'&nbsp;OR&nbsp;title&nbsp;LIKE&nbsp;'%</span><span style="color: #800080">$queryarray</span><span style="color: #000000">[</span><span style="color: #800080">$i</span><span style="color: #000000">]%'&nbsp;OR&nbsp;message&nbsp;LIKE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'%</span><span style="color: #800080">$queryarray</span><span style="color: #000000">[</span><span style="color: #800080">$i</span><span style="color: #000000">]%')</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">$sql</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">.=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;end&nbsp;if</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">$sql</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">.=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">ORDER&nbsp;BY&nbsp;id&nbsp;DESC</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;因为Gusetbook的index.php显示了我需要知道的实体<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;既然用index.php代码</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">$query</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">$xoopsDB</span><span style="color: #000000">-&gt;</span><span style="color: #000000">query(</span><span style="color: #000000">"</span><span style="color: #000000">SELECT&nbsp;COUNT(*)&nbsp;FROM&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">.</span><span style="color: #800080">$xoopsDB</span><span style="color: #000000">-&gt;</span><span style="color: #000000">prefix(</span><span style="color: #000000">"</span><span style="color: #000000">myguestbook</span><span style="color: #000000">"</span><span style="color: #000000">)</span><span style="color: #000000">.</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;WHERE&nbsp;id&gt;0</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">list</span><span style="color: #000000">(</span><span style="color: #800080">$numrows</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">$xoopsDB</span><span style="color: #000000">-&gt;</span><span style="color: #000000">fetchrow(</span><span style="color: #800080">$query</span><span style="color: #000000">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;假设sql获取到数据</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">$result</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">$xoopsDB</span><span style="color: #000000">-&gt;</span><span style="color: #000000">query(</span><span style="color: #800080">$sql</span><span style="color: #000000">,</span><span style="color: #800080">$limit</span><span style="color: #000000">,</span><span style="color: #800080">$offset</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">$ret</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">array</span><span style="color: #000000">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">$i</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;使用搜索结果创建到query的连接对象</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #800080">$myrow</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">$xoopsDB</span><span style="color: #000000">-&gt;</span><span style="color: #000000">fetchArray(</span><span style="color: #800080">$result</span><span style="color: #000000">)){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;你可以用任何图片</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">$ret</span><span style="color: #000000">[</span><span style="color: #800080">$i</span><span style="color: #000000">][</span><span style="color: #000000">'</span><span style="color: #000000">image</span><span style="color: #000000">'</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">images/url.gif</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设置结果查看明细的信息</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">$ret</span><span style="color: #000000">[</span><span style="color: #800080">$i</span><span style="color: #000000">][</span><span style="color: #000000">'</span><span style="color: #000000">link</span><span style="color: #000000">'</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">index.php?start=</span><span style="color: #000000">"</span><span style="color: #000000">.</span><span style="color: #000000">(</span><span style="color: #800080">$numrows</span><span style="color: #000000">-</span><span style="color: #800080">$myrow</span><span style="color: #000000">[</span><span style="color: #000000">'</span><span style="color: #000000">id</span><span style="color: #000000">'</span><span style="color: #000000">]);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">$ret</span><span style="color: #000000">[</span><span style="color: #800080">$i</span><span style="color: #000000">][</span><span style="color: #000000">'</span><span style="color: #000000">title</span><span style="color: #000000">'</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">$myrow</span><span style="color: #000000">[</span><span style="color: #000000">'</span><span style="color: #000000">name</span><span style="color: #000000">'</span><span style="color: #000000">];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">$ret</span><span style="color: #000000">[</span><span style="color: #800080">$i</span><span style="color: #000000">][</span><span style="color: #000000">'</span><span style="color: #000000">time</span><span style="color: #000000">'</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">$myrow</span><span style="color: #000000">[</span><span style="color: #000000">'</span><span style="color: #000000">time</span><span style="color: #000000">'</span><span style="color: #000000">];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;guestbook中，id没有用</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">$ret</span><span style="color: #000000">[</span><span style="color: #800080">$i</span><span style="color: #000000">][</span><span style="color: #000000">'</span><span style="color: #000000">uid</span><span style="color: #000000">'</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">$i</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">$ret</span><span style="color: #000000">;<br />
<br />
}<br />
<br />
</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;注意:&nbsp;象上面声明的一样，&nbsp;$ret&nbsp;是一个多维数组，这个多维数组的第一维是一个顺序号，第二维是图片、连接、标题、uid和时间。这些属性指向搜索到的一个实体。&nbsp;image,&nbsp;uid&nbsp;and&nbsp;time&nbsp;是可选的，time&nbsp;是一个unix的标准时间戳<br />
<br />
//&nbsp;参见xoops中的&nbsp;search.php&nbsp;.&nbsp;路径为：&nbsp;kernel/module.php&nbsp;调用了各个模块的搜索方法?&gt;&nbsp;</span></span></div>
<img src="http://www.cnblogs.com/xxpyeippx/aggbug/1269517.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/xxpyeippx/archive/2008/08/16/1269517.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/xxpyeippx/archive/2008/08/16/1269517.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/>· <a href="http://news.cnblogs.com/n/56852/" target="_blank">淘宝网通过索引模式涉足网络文学</a><span style="color:gray">(2010-02-10 15:59)</span><br/>· <a href="http://news.cnblogs.com/n/56851/" target="_blank">苹果发布 iPhone/iPad SDK 3.2 beta2 开发包</a><span style="color:gray">(2010-02-10 15:37)</span><br/>· <a href="http://news.cnblogs.com/n/56850/" target="_blank">“谷姐”：披着“谷歌”羊皮的悲哀？</a><span style="color:gray">(2010-02-10 15:32)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>发布新软件：史上最轻量级的ORM－－EasyDBOperation</title><link>http://www.cnblogs.com/xxpyeippx/archive/2008/05/25/EasyDBOperation.html</link><dc:creator>xxp</dc:creator><author>xxp</author><pubDate>Sun, 25 May 2008 12:27:00 GMT</pubDate><guid>http://www.cnblogs.com/xxpyeippx/archive/2008/05/25/EasyDBOperation.html</guid><description><![CDATA[<p>阅读: 952 评论: 17 作者: <a href="http://www.cnblogs.com/xxpyeippx/" target="_blank">xxp</a> 发表于 2008-05-25 20:27 <a href="http://www.cnblogs.com/xxpyeippx/archive/2008/05/25/EasyDBOperation.html" target="_blank">原文链接</a></p><p><font style="background-color: #fffbf0" face="Verdana">标题：最轻量级的ORM(含实例）<br />
下载地址：<font style="background-color: #fffbf0" face="Verdana"><a href="http://www.cnblogs.com/Files/xxpyeippx/EasyDBOperationV3.0.rar"><font style="background-color: #fffbf0" face="Verdana"><font style="background-color: #fffbf0" face="Verdana">http://www.cnblogs.com/Files/xxpyeippx/EasyDBOperationV3.0.rar</font><br />
</font></a></font></font><font style="background-color: #fffbf0" face="Verdana">作者介绍：<br />
Surance Yin<br />
个人主页： <a href="www.fltek.com.cn">www.fltek.com.cn<br />
</a>Cnblogs： www.cnblogs.com/xxpyieppx/<br />
邮箱：suranceyin@yahoo.com.cn</font></p>
<font style="background-color: #fffbf0" face="Verdana">
<p><br />
基本信息：<br />
类型：类库<br />
协议：GPL<br />
环境：.net framework 2.0<br />
数据库：Sqlserver 2000/2005<br />
最好配合CodeSurance一起使用</p>
<p><br />
特性：<br />
1.最轻量级的ORM。<br />
2.实现了字符串过滤<br />
3.支持分页（不需要存储过程）</p>
<p><br />
升级记录（2.0-3.0)<br />
增加了字符串过滤<br />
增机阿拉分页支持</p>
<p>&nbsp;</p>
<p>额外说明：<br />
1.最好结合aspnetPager<br />
2.ConsoleApplicationTest里面包含了使用范例</p>
<p><br />
到底有多简单：<br />
p.Add();<br />
p.Edit();<br />
manager3.Delete();<br />
ProductInfo info = (ProductInfo)manager2.GetOne((object)id);</p>
<p><br />
操作过程：<br />
1.生成实体类（可以使用CodeSurance来生成）<br />
2.继承CommonOperation，建立对操作类。（主要是要指定表名）<br />
3.在客户端调用操作类即可。</font></p>
 <img src="http://www.cnblogs.com/xxpyeippx/aggbug/1207060.html?type=1" width="1" height="1" alt=""/><p>评论: 17　<a href="http://www.cnblogs.com/xxpyeippx/archive/2008/05/25/EasyDBOperation.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/xxpyeippx/archive/2008/05/25/EasyDBOperation.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/>· <a href="http://news.cnblogs.com/n/56852/" target="_blank">淘宝网通过索引模式涉足网络文学</a><span style="color:gray">(2010-02-10 15:59)</span><br/>· <a href="http://news.cnblogs.com/n/56851/" target="_blank">苹果发布 iPhone/iPad SDK 3.2 beta2 开发包</a><span style="color:gray">(2010-02-10 15:37)</span><br/>· <a href="http://news.cnblogs.com/n/56850/" target="_blank">“谷姐”：披着“谷歌”羊皮的悲哀？</a><span style="color:gray">(2010-02-10 15:32)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>XOOPS模块开发快速入门中文翻译－－索引</title><link>http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160883.html</link><dc:creator>xxp</dc:creator><author>xxp</author><pubDate>Sat, 19 Apr 2008 02:20:00 GMT</pubDate><guid>http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160883.html</guid><description><![CDATA[<p>阅读: 532 评论: 0 作者: <a href="http://www.cnblogs.com/xxpyeippx/" target="_blank">xxp</a> 发表于 2008-04-19 10:20 <a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160883.html" target="_blank">原文链接</a></p><p>&nbsp;
<table cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160880.html">XOOPS模块开发快速入门中文翻译（十）</a> (4-19 10:17) </span></p>
            </td>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm"></td>
        </tr>
        <tr>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm">
            <p style="text-align: center" align="center"><span style="font-size: 12pt; font-family: 宋体"><a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160870.html">XOOPS模块开发快速入门中文翻译（九）</a> (4-19 10:10) </span></p>
            </td>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm"></td>
        </tr>
        <tr>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160841.html">XOOPS模块开发快速入门中文翻译（八）</a> (4-19 09:37) </span></p>
            </td>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm"></td>
        </tr>
        <tr>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm">
            <p style="text-align: center" align="center"><span style="font-size: 12pt; font-family: 宋体"><a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/18/1160307.html">XOOPS模块开发快速入门中文翻译（七）</a>(4-18 18:42) </span></p>
            </td>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm"></td>
        </tr>
        <tr>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/17/1158910.html">XOOPS模块开发快速入门中文翻译（六）</a> (4-17 22:40) </span></p>
            </td>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm"></td>
        </tr>
        <tr>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm">
            <p style="text-align: center" align="center"><span style="font-size: 12pt; font-family: 宋体"><a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/17/1158829.html">XOOPS模块开发快速入门中文翻译（五）</a> (4-17 21:43) </span></p>
            </td>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm"></td>
        </tr>
        <tr>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/17/1158815.html">XOOPS模块开发快速入门中文翻译（四）</a> (4-17 21:37) </span></p>
            </td>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm"></td>
        </tr>
        <tr>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm">
            <p style="text-align: center" align="center"><span style="font-size: 12pt; font-family: 宋体"><a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/17/1158772.html">XOOPS模块开发快速入门中文翻译（三）</a> (4-17 21:17) </span></p>
            </td>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm"></td>
        </tr>
        <tr>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/17/1158759.html">XOOPS模块开发快速入门中文翻译（二）</a> (4-17 21:06) </span></p>
            </td>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm"></td>
        </tr>
        <tr>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm">
            <p style="text-align: center" align="center"><span style="font-size: 12pt; font-family: 宋体"><a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/17/1158728.html">XOOPS模块开发快速入门中文翻译（一）</a> (4-17 20:33) </span></p>
            </td>
            <td style="padding-right: 0cm; padding-left: 0cm; padding-bottom: 0cm; padding-top: 0cm"></td>
        </tr>
    </tbody>
</table>
</p>
<img src="http://www.cnblogs.com/xxpyeippx/aggbug/1160883.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160883.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160883.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/>· <a href="http://news.cnblogs.com/n/56852/" target="_blank">淘宝网通过索引模式涉足网络文学</a><span style="color:gray">(2010-02-10 15:59)</span><br/>· <a href="http://news.cnblogs.com/n/56851/" target="_blank">苹果发布 iPhone/iPad SDK 3.2 beta2 开发包</a><span style="color:gray">(2010-02-10 15:37)</span><br/>· <a href="http://news.cnblogs.com/n/56850/" target="_blank">“谷姐”：披着“谷歌”羊皮的悲哀？</a><span style="color:gray">(2010-02-10 15:32)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>XOOPS模块开发快速入门中文翻译（十）</title><link>http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160880.html</link><dc:creator>xxp</dc:creator><author>xxp</author><pubDate>Sat, 19 Apr 2008 02:17:00 GMT</pubDate><guid>http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160880.html</guid><description><![CDATA[<p>阅读: 355 评论: 2 作者: <a href="http://www.cnblogs.com/xxpyeippx/" target="_blank">xxp</a> 发表于 2008-04-19 10:17 <a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160880.html" target="_blank">原文链接</a></p><font style="background-color: #fffbf0" face="Verdana">&nbsp; 由于这两天一直研究XOOPS的模块，所以找到了这篇很好的模块开发快速入门。<br />
看了以后，就兴致勃勃的来开发模块了，可是开发的过程中遇到一些问题。<br />
应该是我看的太快了，要学而时习之啊。因此翻译在这里。<br />
＝＝＝＝＝＝＝＝＝＝＝===<br />
作者：Surance Yin<br />
邮箱：Suranceyin@yahoo.com.cn<br />
主页：http://www.fltek.com.cn<br />
=================</font><br />
&nbsp;&nbsp;&nbsp;
<p class="MsoNormal" style="text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align="left"><strong><span style="font-size: 13.5pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">第八章――数据库操作和类<span lang="EN-US"><o:p></o:p></span></span></strong></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; font-family: 宋体">CRUD </span></strong><strong><span style="font-size: 13.5pt; font-family: 宋体">增删改查</span></strong><span style="font-size: 12pt; font-family: 宋体"><br />
</span><span style="font-size: 12pt; font-family: 宋体">数据库操作有4个基本功能，分别是: <strong>C</strong>reate, <strong>R</strong>ead, <strong>U</strong>pdate, <strong>D</strong>elete; 缩写为 <a href="http://en.wikipedia.org/wiki/CRUD_(acronym)">CRUD</a>. 之前我们演示了增加和读取，现在我们来演示一下.</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">Create </span></strong><strong><span style="font-size: 12pt; font-family: 宋体">增加</span></strong></p>
<table style="background: #9df8ff; width: 669.75pt" cellpadding="0" width="893" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 665.25pt; padding-top: 0.75pt" width="887">
            <p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$query</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: green; font-family: 'Courier New'">"Insert into "</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$xoopsDB</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">-&gt;prefix(</span><span style="font-size: 10pt; color: green; font-family: 'Courier New'">"tutorial_myform"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">).</span><span style="font-size: 10pt; color: green; font-family: 'Courier New'">" (name, address, telephone, email) values ('</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$name</span><span style="font-size: 10pt; color: green; font-family: 'Courier New'">', '</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$address</span><span style="font-size: 10pt; color: green; font-family: 'Courier New'">', '</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$tel</span><span style="font-size: 10pt; color: green; font-family: 'Courier New'">', '</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$email</span><span style="font-size: 10pt; color: green; font-family: 'Courier New'">' )"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$res</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$xoopsDB</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">-&gt;query(</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$query</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span></p>
            <p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">if</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(!</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$res</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">)</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">{</span></p>
            <p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">echo</span></strong><span style="font-size: 10pt; color: green; font-family: 'Courier New'">"error: </span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$query</span><span style="font-size: 10pt; color: green; font-family: 'Courier New'">"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
            <p style="margin-bottom: 10pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">Read </span></strong><strong><span style="font-size: 12pt; font-family: 宋体">读取</span></strong></p>
<table style="background: #9df8ff; width: 669.75pt" cellpadding="0" width="893" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 665.25pt; padding-top: 0.75pt" width="887">
            <p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$query</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$xoopsDB</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">-&gt;query(</span><span style="font-size: 10pt; color: green; font-family: 'Courier New'">' SELECT * FROM '</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$xoopsDB</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">-&gt;prefix(</span><span style="font-size: 10pt; color: green; font-family: 'Courier New'">'tutorial_myform'</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">)</span><span style="font-size: 10pt; color: green; font-family: 'Courier New'">" WHERE id='</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$myid</span><span style="font-size: 10pt; color: green; font-family: 'Courier New'">' "</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$myrow</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$xoopsDB</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">-&gt;fetchArray(</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$query</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$myrow</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">[</span><span style="font-size: 10pt; color: green; font-family: 'Courier New'">'name'</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">];</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">$ad</span></p>
            </td>
        </tr>
    </tbody>
</table>
<img src="http://www.cnblogs.com/xxpyeippx/aggbug/1160880.html?type=1" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160880.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160880.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/>· <a href="http://news.cnblogs.com/n/56852/" target="_blank">淘宝网通过索引模式涉足网络文学</a><span style="color:gray">(2010-02-10 15:59)</span><br/>· <a href="http://news.cnblogs.com/n/56851/" target="_blank">苹果发布 iPhone/iPad SDK 3.2 beta2 开发包</a><span style="color:gray">(2010-02-10 15:37)</span><br/>· <a href="http://news.cnblogs.com/n/56850/" target="_blank">“谷姐”：披着“谷歌”羊皮的悲哀？</a><span style="color:gray">(2010-02-10 15:32)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>XOOPS模块开发快速入门中文翻译（九）</title><link>http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160870.html</link><dc:creator>xxp</dc:creator><author>xxp</author><pubDate>Sat, 19 Apr 2008 02:10:00 GMT</pubDate><guid>http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160870.html</guid><description><![CDATA[<p>阅读: 456 评论: 1 作者: <a href="http://www.cnblogs.com/xxpyeippx/" target="_blank">xxp</a> 发表于 2008-04-19 10:10 <a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160870.html" target="_blank">原文链接</a></p>&nbsp;&nbsp;<font style="background-color: #fffbf0" face="Verdana">&nbsp; 由于这两天一直研究XOOPS的模块，所以找到了这篇很好的模块开发快速入门。<br />
看了以后，就兴致勃勃的来开发模块了，可是开发的过程中遇到一些问题。<br />
应该是我看的太快了，要学而时习之啊。因此翻译在这里。<br />
＝＝＝＝＝＝＝＝＝＝＝===<br />
作者：Surance Yin<br />
邮箱：Suranceyin@yahoo.com.cn<br />
主页：http://www.fltek.com.cn<br />
=================</font>
<p style="text-align: center" align="center"><strong><span style="font-size: 18pt; font-family: 宋体">第四章――xoops区块</span></strong></p>
<p style="text-align: right" align="right"><span style="font-size: 12pt; font-family: 宋体"><a href="http://www.kaotik.biz/tutorial/buildmodule1.html">Part 1 Building a simple module<br />
</a><a href="http://www.kaotik.biz/tutorial/tutorial_part_2.html">Part 2 - using Smarty templates in a module</a><br />
<a href="http://www.kaotik.biz/tutorial/tutorial_part3.html">Part 3 - Building an AJAX module</a></span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">Xoops</span><span style="font-size: 12pt; font-family: 宋体">中，区块是一个非常重要的概念, 不过开发区块并不是很容易，尤其是options，所以我写了这个教程。</span></p>
<table style="width: 100%" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 77%; padding-top: 0.75pt" width="77%">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">下载第三章已经完成的模块</span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; background: yellow; padding-bottom: 0.75pt; width: 23%; padding-top: 0.75pt" width="23%">
            <p style="text-align: center" align="center"><span style="font-size: 12pt; font-family: Arial"><br />
            <a href="http://www.kaotik.biz/tutorial/tutorial_part3_complete.zip">Completed Module from part 3</a></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">一个xoops区块包含2部分： <br />
1- 一个php 函数，用来控制区块内容<br />
2- 一个smarty模板，用来控制区块的显示.<br />
以下是 xoops_version.php 中的定义，我们从这里讲起</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">第一步- 设置 xoops_version.php</span></strong><span style="font-size: 12pt; font-family: 宋体"><br />
</span><span style="font-size: 12pt; font-family: 宋体">打开 <span style="color: #006600">tutorial/xoops_version.php</span>. 在<span style="color: blue">?&gt;</span>之前输入<span style="color: blue">：</span></span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">// Blocks<br />
            $modversion['blocks'][1]['file'] = "tutorial_block.php";<br />
            $modversion['blocks'][1]['name'] = 'Block for Tutorial';<br />
            $modversion['blocks'][1]['description'] = 'This is a Block for the tutorial module';<br />
            $modversion['blocks'][1]['show_func'] = "tut_blockList";<br />
            $modversion['blocks'][1]['template'] = 'tutorial_block.html';</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 9pt; color: blue; font-family: 宋体">$modversion['blocks'][1]['file'] = "tutorial_block.php";</span><span style="font-size: 12pt; font-family: 宋体">第一行告诉xoops 那个文件来控制区块内容. 1个文件可以有很多个函数。我习惯把所有的函数都放在同一个文件里面，除非函数太庞大了。这样的话，可以很方便的通过文件来找函数。<br />
</span><span style="font-size: 9pt; color: blue; font-family: 宋体">$modversion['blocks'][1]['name'] = 'Block for Tutorial';</span><span style="font-size: 12pt; font-family: 宋体">这里是区块的名称。最好采用语言文件来定义这些东西，不过为了简单起见，我直接写在这里了。<br />
</span><span style="font-size: 9pt; color: blue; font-family: 宋体">$modversion['blocks'][1]['description'] = 'This is a Block for the tutorial module';</span><span style="font-size: 12pt; font-family: 宋体">非常容易明白，这里是区块的描述。会显示在区块管理界面的。<br />
</span><span style="font-size: 9pt; color: blue; font-family: 宋体">$modversion['blocks'][1]['show_func'] = "tut_blockList";</span><span style="font-size: 12pt; font-family: 宋体">这里是用来控制区块的内容的函数名称。我的经验是，尽量在函数名称前面，加上区块名称前缀，这样不会和xoops自带的函数混淆。我以前出现过这样的问题，你也要提起注意哦.<br />
</span><span style="font-size: 9pt; color: blue; font-family: 宋体">$modversion['blocks'][1]['template'] = 'tutorial_block.html';</span><span style="font-size: 12pt; font-family: 宋体">这里是区块用到的 smarty 模板。</span></p>
<div style="text-align: center" align="center"><span style="font-size: 12pt; font-family: 宋体">
<hr align="center" width="100%" size="2" />
</span></div>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 12pt; font-family: 宋体">小贴士</span></em></strong><span style="font-size: 12pt; font-family: 宋体"><br />
</span><span style="font-size: 12pt; font-family: 宋体">当创建一个模块的时候， xoops_version.php中的数字都是这样的:</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">// Templates</span><span style="font-size: 9pt; font-family: 宋体"><br />
            </span><span style="font-size: 9pt; font-family: 宋体">$modversion['templates'][1]['file'] = 'tut_form.html';</span><span style="font-size: 9pt; font-family: 宋体"><br />
            </span><span style="font-size: 9pt; font-family: 宋体">$modversion['templates'][1]['description'] = '';</span><span style="font-size: 9pt; font-family: 宋体"><br />
            </span><span style="font-size: 9pt; font-family: 宋体">$modversion['templates'][2]['file'] = 'tut_client_list.html';</span><span style="font-size: 9pt; font-family: 宋体"><br />
            </span><span style="font-size: 9pt; font-family: 宋体">$modversion['templates'][2]['description'] = '';</span><span style="font-size: 9pt; font-family: 宋体"><br />
            </span><span style="font-size: 9pt; font-family: 宋体">$modversion['templates'][3]['file'] = 'tut_main.html';</span><span style="font-size: 9pt; font-family: 宋体"><br />
            </span><span style="font-size: 9pt; font-family: 宋体">$modversion['templates'][3]['description'] = ''</span><span style="font-size: 12pt; font-family: 宋体">;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">如果只有两三个模板，数字的控制还相对容易，但是如果有40多个的时候，控制数字就成了一个非常繁琐的工作。怎么解决这个问题呢？很简单，使用一个计数变量。</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">// Templates</span><span style="font-size: 9pt; font-family: 宋体"><br />
            <span style="color: red">$i=1;</span><br />
            </span><span style="font-size: 9pt; font-family: 宋体">$modversion['templates'][</span><span style="font-size: 9pt; color: red; font-family: 宋体">$i</span><span style="font-size: 9pt; font-family: 宋体">]['file'] = 'tut_form.html';</span><span style="font-size: 9pt; font-family: 宋体"><br />
            </span><span style="font-size: 9pt; font-family: 宋体">$modversion['templates']</span><span style="font-size: 9pt; color: red; font-family: 宋体">[$i</span><span style="font-size: 9pt; font-family: 宋体">]['description'] = '';</span><span style="font-size: 9pt; font-family: 宋体"><br />
            <span style="color: red">$i++;</span><br />
            </span><span style="font-size: 9pt; font-family: 宋体">$modversion['templates'][</span><span style="font-size: 9pt; color: red; font-family: 宋体">$i</span><span style="font-size: 9pt; font-family: 宋体">]['file'] = 'tut_client_list.html';</span><span style="font-size: 9pt; font-family: 宋体"><br />
            </span><span style="font-size: 9pt; font-family: 宋体">$modversion['templates'][</span><span style="font-size: 9pt; color: red; font-family: 宋体">$i</span><span style="font-size: 9pt; font-family: 宋体">]['description'] = '';</span><span style="font-size: 9pt; font-family: 宋体"><br />
            <span style="color: red">$i++;</span><br />
            </span><span style="font-size: 9pt; font-family: 宋体">$modversion['templates'][</span><span style="font-size: 9pt; color: red; font-family: 宋体">$i</span><span style="font-size: 9pt; font-family: 宋体">]['file'] = 'tut_main.html';</span><span style="font-size: 9pt; font-family: 宋体"><br />
            </span><span style="font-size: 9pt; font-family: 宋体">$modversion['templates'][</span><span style="font-size: 9pt; color: red; font-family: 宋体">$i</span><span style="font-size: 9pt; font-family: 宋体">]['description'] = ''</span><span style="font-size: 12pt; font-family: 宋体">;<br />
            </span><span style="font-size: 9pt; color: red; font-family: 宋体">$i++;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">这样就可以很方便的创建模板了，不用担心序号了。因为变量<span style="color: blue">$i</span>负责计数。它从1开始，然后每次加1</span></p>
<div style="text-align: center" align="center"><span style="font-size: 12pt; font-family: 宋体">
<hr align="center" width="100%" size="2" />
</span></div>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">第二步- 创建必须的文件</span></strong><span style="font-size: 12pt; font-family: 宋体"><br />
</span><span style="font-size: 12pt; font-family: 宋体">创建2个文件夹:<br />
<span style="color: #006600">tutorial/blocks<br />
tutorial/templates/blocks<br />
</span>在<span style="color: #006600">tutorial/blocks</span>中，创建一个文件tutorial_block.php ，输入以下代码:</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">&lt;?php</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">function tut_blockList(){<br />
            $block=array();<br />
            $block['mytext']="Hello world! This is my new Block!";<br />
            return $block;<br />
            }</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">?&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">注意事项:</span></p>
<ul type="disc">
    <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">这个函数必须返回一个名为 <span style="color: blue">$block</span>的变量</span></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; color: blue; font-family: 宋体">$block</span><span style="font-size: 12pt; font-family: 宋体">必须为一个数组. </span></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">可以向这个数组内放任何东西，包括另外一个关联数组。</span></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">区块可以在模块之外的地方调用，因此如果你包含了其他的文件，务必保证区块可以知道被包含文件的确切位置。</span></li>
</ul>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
</span><span style="font-size: 12pt; font-family: 宋体">在 <span style="color: #006600">tutorial/templates/blocks</span>创建一个文件tutorial_block.html ，输入以下代码</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">&lt;{$block.mytext}&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">重新安装一下这个模块，就可以在区块管理页面中看到 <span style="color: black">'</span><span style="color: #990000">Block for Tutorial</span><span style="color: black">'</span>这个区块了，使它可见，然后到首页去看一下效果。. </span></p>
<p style="text-align: center" align="center"><em><span style="font-size: 12pt; font-family: 宋体">恭喜你，已经创建了第一个区块！</span></em></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">第三步- 创建options（参数）</span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">这个机制可以让我们创建更加灵活的区块。<br />
打开 <span style="color: #006600">tutorial/xoops_version.php</span>输入如下红色的内容：</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">// Blocks<br />
            $modversion['blocks'][1]['file'] = "tutorial_block.php";<br />
            $modversion['blocks'][1]['name'] = 'Block for Tutorial';<br />
            $modversion['blocks'][1]['description'] = 'This is a Block for the tutorial module';<br />
            $modversion['blocks'][1]['show_func'] = "tut_blockList";<br />
            $modversion['blocks'][1]['template'] = 'tutorial_block.html';<br />
            <span style="color: red">$modversion['blocks'][1]['edit_func'] = "tut_blockList_edit";<br />
            $modversion['blocks'][1]['options'] = 'Hello|1'; </span></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">第一行告诉Xoops 区块的编辑函数是什么。这个函数必须也在<span style="color: #006600">tutorial_block.php</span>中。第二行指定了参数默认值。这个区块中，有2个 options, 默认值分别为 "Hello" 和 "1". 采用'|'分隔.</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">打开 <span style="color: #006600">tutorial/blocks/tutorial_block.php</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">Replace all code with this:</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">&lt;?php</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">function tut_blockList(<span style="color: red">$options</span>){<br />
            $block=array();<br />
            <span style="color: red">$block['textOne']=$options[0];<br />
            $block['textTwo']=$options[1];</span><br />
            return $block;<br />
            }</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; color: red; font-family: 宋体">function tut_blockList_edit($options){<br />
            $form = "Option 1: &lt;input type='text' size='9' name='options[0]' value='$options[0]' /&gt;";<br />
            $form .= "&lt;br /&gt;";<br />
            $form .= "Option 2: &lt;input type='text' size='1' name='options[1]' value='$options[1]' /&gt;";<br />
            $form .= "&lt;br /&gt;";<br />
            return $form;<br />
            }</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">?&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">现在创建了一个新的函数 (<span style="color: blue">tut_blockList_edit) </span>，这个函数用来设置区块。函数的声明表明 <span style="color: blue">tut_blockList </span>它接受xoops传过来的参数 (<span style="color: blue">$options) <br />
</span>注意事项</span></p>
<ul type="disc">
    <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">这个函数必须返回一个叫做$form的变量. </span></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; color: blue; font-family: 宋体">$form</span><span style="font-size: 12pt; font-family: 宋体">必须是一个字符串，而不是数组。</span></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">可以有多个参数。</span></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">Xoops </span><span style="font-size: 12pt; font-family: 宋体">会自行存储这些参数到xoops的数据库，所以你不用担心保存、更新这些参数的值。</span></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; color: blue; font-family: 宋体">$form</span><span style="font-size: 12pt; font-family: 宋体">中必须有参数<span style="color: blue">命名</span>的表单内容. </span></li>
    <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; color: blue; font-family: 宋体">options</span><span style="font-size: 12pt; font-family: 宋体">（参数）必须从0开始，比如 <span style="color: blue">name='options[0]'</span>. </span></li>
</ul>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">打开 <span style="color: #006600">tutorial/templates/blocks/tutorial_block.html</span>输入</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">&lt;p&gt;My First option is: &lt;{$block.textOne}&gt;&lt;/p&gt;<br />
            &lt;p&gt;My Second option is: &lt;{$block.textTwo}&gt;&lt;/p&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">好，为了让参数正常运行，我们需要重新安装这个模块。<br />
重新安装后，设置区块可见，这首页，可以看到2个参数，一个是'Hello' ，另一个是 '1'. 从后台改变这2个参数，会发现首页也会跟着改变</span></p>
<p style="text-align: center" align="center"><em><span style="font-size: 27pt; font-family: 宋体">哈！成功了!</span></em></p>
<table style="width: 100%" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 77%; padding-top: 0.75pt" width="77%">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">这里是完成后的文件。</span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; background: yellow; padding-bottom: 0.75pt; width: 23%; padding-top: 0.75pt" width="23%">
            <p style="text-align: center" align="center"><span style="font-size: 12pt; font-family: Arial"><br />
            <a href="http://www.kaotik.biz/tutorial/tutorial_part4_complete.zip">Completed Module from part 4</a></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><a href="http://www.kaotik.biz/tutorial/tutorial_part5.html">Part 5 - Guidlines for Module Development</a></span></p>
<img src="http://www.cnblogs.com/xxpyeippx/aggbug/1160870.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160870.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160870.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/>· <a href="http://news.cnblogs.com/n/56852/" target="_blank">淘宝网通过索引模式涉足网络文学</a><span style="color:gray">(2010-02-10 15:59)</span><br/>· <a href="http://news.cnblogs.com/n/56851/" target="_blank">苹果发布 iPhone/iPad SDK 3.2 beta2 开发包</a><span style="color:gray">(2010-02-10 15:37)</span><br/>· <a href="http://news.cnblogs.com/n/56850/" target="_blank">“谷姐”：披着“谷歌”羊皮的悲哀？</a><span style="color:gray">(2010-02-10 15:32)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>XOOPS模块开发快速入门中文翻译（八）</title><link>http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160841.html</link><dc:creator>xxp</dc:creator><author>xxp</author><pubDate>Sat, 19 Apr 2008 01:37:00 GMT</pubDate><guid>http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160841.html</guid><description><![CDATA[<p>阅读: 367 评论: 1 作者: <a href="http://www.cnblogs.com/xxpyeippx/" target="_blank">xxp</a> 发表于 2008-04-19 09:37 <a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160841.html" target="_blank">原文链接</a></p>&nbsp;<font style="background-color: #fffbf0" face="Verdana">&nbsp; 由于这两天一直研究XOOPS的模块，所以找到了这篇很好的模块开发快速入门。<br />
看了以后，就兴致勃勃的来开发模块了，可是开发的过程中遇到一些问题。<br />
应该是我看的太快了，要学而时习之啊。因此翻译在这里。<br />
＝＝＝＝＝＝＝＝＝＝＝===<br />
作者：Surance Yin<br />
邮箱：Suranceyin@yahoo.com.cn<br />
主页：http://www.fltek.com.cn<br />
=================</font>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">第六步- 插入数据</span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">现在我们来创建一个让用户插入数据库的表单（参考<a href="http://www.kaotik.biz/tutorial/buildmodule1.html">第一章</a>). <br />
打开 <span style="color: #006600">tutorial/templates/tut_form.html</span>. 输入：</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">&lt;form id="myform" name="myform" method="post" action="index.php"&gt;<br />
            &lt;table width="400" border="0"&gt;<br />
            &lt;tr&gt;<br />
            &lt;td align="right"&gt;&lt;{$smarty.const.TT_NAME}&gt;&lt;/td&gt;<br />
            &lt;td&gt;&lt;input type="text" name="name"&gt;&lt;/td&gt;<br />
            &lt;/tr&gt;&lt;tr&gt;<br />
            &lt;td align="right"&gt;&lt;{$smarty.const.TT_ADDRESS}&gt;&lt;/td&gt;<br />
            &lt;td&gt;&lt;input type="text" name="address"&gt;&lt;/td&gt;<br />
            &lt;/tr&gt;&lt;tr&gt;<br />
            &lt;td align="right"&gt;&lt;{$smarty.const.TT_TELEPHONE}&gt;&lt;/td&gt;<br />
            &lt;td&gt;&lt;input type="text" name="tel"&gt;&lt;/td&gt;<br />
            &lt;/tr&gt;&lt;tr&gt;<br />
            &lt;td align="right"&gt;&lt;{$smarty.const.TT_EMAIL}&gt;&lt;/td&gt;<br />
            &lt;td&gt;&lt;input type="text" name="email"&gt;&lt;/td&gt;<br />
            &lt;/tr&gt;&lt;tr&gt;<br />
            &lt;td&gt;&lt;/td&gt;<br />
            &lt;td&gt;&lt;input type="button" value="Submit" onclick="xajax_processFormData(xajax.getFormValues('myform'));" /&gt;&lt;/td&gt;<br />
            &lt;/tr&gt;<br />
            &lt;/table&gt;<br />
            &lt;/form&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">打开 <span style="color: #006600">tutorial/functions.php</span>. 输入：</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">&lt;?php<br />
            <br />
            <span style="color: red">require_once XOOPS_ROOT_PATH . '/class/template.php';<br />
            if (!isset($xoopsTpl)) {<br />
            $xoopsTpl = new XoopsTpl();<br />
            }<br />
            $xoopsTpl-&gt;xoops_setCaching(0);</span><br />
            <br />
            function processFormData($arg)<br />
            {<br />
            // do some stuff based on $arg like query data from a database and<br />
            // put it into a variable like $newContent<br />
            <span style="color: red">$newContent = "Button pressed";</span><br />
            <br />
            // Instantiate the xajaxResponse object<br />
            $objResponse = new xajaxResponse();<br />
            <br />
            // add a command to the response to assign the innerHTML attribute of<br />
            // the element with id="SomeElementId" to whatever the new content is<br />
            $objResponse-&gt;assign("thisID","innerHTML", $newContent);<br />
            <br />
            //return the xajaxResponse object<br />
            return $objResponse;<br />
            }</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; color: red; font-family: 宋体">function showForm()<br />
            {<br />
            global $xoopsTpl;</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; color: red; font-family: 宋体">$text = $xoopsTpl-&gt;fetch('db:tut_form.html');</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; color: red; font-family: 宋体">$objResponse = new xajaxResponse();<br />
            $objResponse-&gt;assign("formDiv","innerHTML",$text);<br />
            return $objResponse;<br />
            }</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">?&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">require_once XOOPS_ROOT_PATH . '/class/template.php';</span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体"><br />
</span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">if (!isset($xoopsTpl)) {</span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体"><br />
</span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">$xoopsTpl = new XoopsTpl();</span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体"><br />
</span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">}</span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体"><br />
</span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">$xoopsTpl-&gt;xoops_setCaching(0);</span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体"><br />
</span></strong><span style="font-size: 12pt; font-family: 宋体">这一行对于2.0.x 系列版本的xoops (我不清楚 2.2.x)是必须的。 问题是：在<span style="color: #006600">tutorial/index.php</span>. xoops 2.2 </span><span style="font-size: 9pt; color: blue; font-family: 宋体">$xoopsTpl</span><span style="font-size: 12pt; font-family: 宋体">是在<span style="color: blue">require('http://www.cnblogs.com/mainfile.php')</span>定义的； 而 xoops 2.0.x 是在<span style="color: blue">require(XOOPS_ROOT_PATH.'/header.php')</span>定义的。这就是说，在 2.0.17 版本中开发的话， xajax 代码中需要获取</span><span style="font-size: 9pt; color: blue; font-family: 宋体">$xoopsTpl</span><span style="font-size: 12pt; font-family: 宋体">解决方案是我们自己声明 </span><span style="font-size: 9pt; color: blue; font-family: 宋体">$xoopsTpl</span><span style="font-size: 12pt; font-family: 宋体"> .</span><span style="font-size: 12pt; font-family: 宋体">这就是这几行要做的事情。第一行引入了包含 </span><span style="font-size: 9pt; color: blue; font-family: 宋体">$xoopsTpl</span><span style="font-size: 12pt; font-family: 宋体">类的文件。然后通过</span><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">isset</span></strong><span style="font-size: 12pt; font-family: 宋体">看是否设置过 </span><span style="font-size: 9pt; color: blue; font-family: 宋体">$xoopsTpl</span><span style="font-size: 12pt; font-family: 宋体">变量。如果没有则声明它。然后取消缓存，随时更新模板。这样我可以随时改变模板内容，还不怕无法更新缓存。最后发布的时候，可以取消这一行。<br />
<br />
</span><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">$newContent = "Button pressed";</span></strong><span style="font-size: 12pt; font-family: 宋体">对于xajax是必要的，因为即使是notice的报错，也会是xajax出错。有问题的话，可以用 </span><span style="font-size: 9pt; color: blue; font-family: 宋体">$xajax-&gt;setFlag("debug", true);</span><span style="font-size: 12pt; font-family: 宋体">来调试。<br />
</span><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">function showForm()</span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体"><br />
</span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">{</span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体"><br />
</span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">global $xoopsTpl;</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体"><br />
</span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">$text = $xoopsTpl-&gt;fetch('db:tut_form.html');</span></strong><span style="font-size: 12pt; font-family: 宋体">创建了一个函数showForm 声明</span><span style="font-size: 9pt; color: blue; font-family: 宋体">$xoopsTpl</span><span style="font-size: 12pt; font-family: 宋体">为全局变量，这样才可以在函数里面使用。开始有趣了：我创建爱了一个<span style="color: blue">$text</span>变量，这个变量抓取了</span><span style="font-size: 9pt; color: blue; font-family: 宋体">tut_form.html</span><span style="font-size: 12pt; font-family: 宋体">模板。（即模板中包含模板）。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">objResponse-&gt;assign("formDiv","innerHTML",$text);</span></strong><span style="font-size: 12pt; font-family: 宋体">变量<span style="color: blue">$text</span>里面含有另外一个模板，现在把它分配给div</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
</span><span style="font-size: 12pt; font-family: 宋体">打开 tutorial/index.php.输入：</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">&lt;?php<br />
            // Tutorial <br />
            // Created by KaotiK <br />
            require('http://www.cnblogs.com/mainfile.php');</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">require_once(XOOPS_ROOT_PATH.'/modules/tutorial/functions.php');<br />
            require_once(XOOPS_ROOT_PATH.'/modules/tutorial/class/xajax/xajax_core/xajax.inc.php');</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">$xajax = new xajax();<br />
            $xajax-&gt;registerFunction("processFormData");<br />
            <span style="color: red">$xajax-&gt;registerFunction("showForm");</span><br />
            //$xajax-&gt;setFlag("debug", true);<br />
            $xajax-&gt;processRequest();</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">$Xjavapath=XOOPS_URL.'/modules/tutorial/class/xajax';<br />
            $xajaxjava=$xajax-&gt;getJavascript($Xjavapath);</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">$xoopsOption['template_main'] = 'tut_main.html';<br />
            require(XOOPS_ROOT_PATH.'/header.php');<br />
            $xoopsTpl-&gt;assign('xajaxjava', $xajaxjava);</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">require(XOOPS_ROOT_PATH.'/footer.php');</span><span style="font-size: 9pt; font-family: 宋体"><br />
            </span><span style="font-size: 9pt; font-family: 宋体">?&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">$xajax-&gt;registerFunction("showForm");</span></strong><span style="font-size: 12pt; font-family: 宋体">新加了一个函数的注册。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
</span><span style="font-size: 12pt; font-family: 宋体">打开 tutorial/templates/tut_main.html. 输入</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">&lt;p&gt;&lt;{$xajaxjava}&gt;&lt;/p&gt;<br />
            <span style="color: red">&lt;p&gt;&lt;a href="#" onclick="xajax_showForm();return false;"&gt;formtest&lt;/a&gt;&lt;/p&gt;</span><br />
            <span style="color: red">&lt;p&gt;&lt;div id="formDiv"&gt;&lt;/div&gt;&lt;/p&gt;</span><br />
            &lt;div id="thisID"&gt;&lt;/div&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">&lt;a href="#" onclick="xajax_showForm();return false;"&gt;formtest&lt;/a&gt;</span></strong><span style="font-size: 12pt; font-family: 宋体">新加的一行可以调用showForm函数。<span style="color: #009933">return false;</span>停止响应<br />
<br />
测试一下。打开tutorial 主页面，点击 <span style="color: #009933">formtest</span>. 会出现一个表单，点击写有 <span style="color: #009933">submit</span>的按钮，可以看到新的一行，写着： <span style="color: #009933">Button pressed</span>.所以，我们现在有2个div来显示2个输出。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">第七步- 输入数据库</span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">下一步我们将表单内容存入数据库</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">打开tutorial/functions.php 输入：</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">&lt;?php</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">require_once XOOPS_ROOT_PATH . '/class/template.php';<br />
            if (!isset($xoopsTpl)) {<br />
            $xoopsTpl = new XoopsTpl();<br />
            }<br />
            $xoopsTpl-&gt;xoops_setCaching(0);</span><span style="font-size: 9pt; font-family: 宋体"><br />
            <br />
            function processFormData($arg)<br />
            {<br />
            // do some stuff based on $arg like query data from a database and<br />
            // put it into a variable like $newContent<br />
            <span style="color: red">$newContent = addClient($arg);</span><br />
            <br />
            // Instantiate the xajaxResponse object<br />
            $objResponse = new xajaxResponse();<br />
            <br />
            // add a command to the response to assign the innerHTML attribute of<br />
            // the element with id="SomeElementId" to whatever the new content is<br />
            $objResponse-&gt;assign("thisID","innerHTML", $newContent);<br />
            <br />
            //return the xajaxResponse object<br />
            return $objResponse;<br />
            }</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">function showForm()<br />
            {<br />
            global $xoopsTpl;</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">$text = $xoopsTpl-&gt;fetch('db:tut_form.html');</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">$objResponse = new xajaxResponse();<br />
            $objResponse-&gt;assign("formDiv","innerHTML",$text);<br />
            return $objResponse;<br />
            }</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; color: red; font-family: 宋体">function addClient($data)<br />
            {<br />
            global $xoopsDB;<br />
            $myts = myTextSanitizer::getInstance();<br />
            $name=$myts-&gt;addslashes($data['name']);<br />
            $address=$myts-&gt;addslashes($data['address']);<br />
            $tel=$myts-&gt;addslashes($data['tel']);<br />
            $email=$myts-&gt;addslashes($data['email']);<br />
            $query = "Insert into ".$xoopsDB-&gt;prefix("tutorial_myform")." (name, address, telephone, email) values ('$name', '$address', '$tel', '$email' )";<br />
            $res=$xoopsDB-&gt;query($query);<br />
            if(!$res) {<br />
            $msg="error: $query";<br />
            } else {<br />
            $msg="Data was correctly inserted into DB!";<br />
            }<br />
            return $msg;<br />
            }</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">?&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">调用了函数 addClient，这个函数从 </span><span style="font-size: 9pt; color: blue; font-family: 宋体">tutorial_myform</span><span style="font-size: 12pt; font-family: 宋体">表单提取数据插入了数据库。相应的，函数 </span><span style="font-size: 9pt; color: blue; font-family: 宋体">processFormData</span><span style="font-size: 12pt; font-family: 宋体">也改变了。这个函数会返回只是插入是否成功的 <span style="color: blue">$msg</span>。$msg 会显示在 &lt;div&gt; <span style="color: blue">thisID</span>中。 测试一下！</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">第八步－把users列表显示</span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">现在我们把数据库里面的user全部显示出来。<br />
打开 tutorial/xoops_version.php 并 <strong><span style="color: red">改变</span></strong>模板处：</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">// Templates<br />
            $modversion['templates'][1]['file'] = 'tut_form.html';<br />
            $modversion['templates'][1]['description'] = '';</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">$modversion['templates'][2]['file'] = 'tut_client_list.html';<br />
            $modversion['templates'][2]['description'] = '';</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">$modversion['templates'][<span style="color: red">3</span>]['file'] = 'tut_main.html';</span><span style="font-size: 9pt; font-family: 宋体"><br />
            </span><span style="font-size: 9pt; font-family: 宋体">$modversion['templates'][<span style="color: red">3</span>]['description'] = '';</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">创建一个新的文件: <span style="color: #006600">tutorial/templates/tut_client_list.html </span>输入:</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">&lt;table width="100%" border="0" cellspacing="0" cellpadding="0"&gt;<br />
            &lt;tr&gt;<br />
            &lt;td&gt;&lt;{$smarty.const.TT_NAME}&gt;&lt;/td&gt;<br />
            &lt;td&gt;&lt;{$smarty.const.TT_ADDRESS}&gt;&lt;/td&gt;<br />
            &lt;td&gt;&lt;{$smarty.const.TT_TELEPHONE}&gt;&lt;/td&gt;<br />
            &lt;td&gt;&lt;{$smarty.const.TT_EMAIL}&gt;&lt;/td&gt;<br />
            &lt;/tr&gt;<br />
            &lt;{foreach item=cli from=$clients}&gt;<br />
            &lt;tr&gt;<br />
            &lt;td&gt;&lt;{$cli.name}&gt;&lt;/td&gt;<br />
            &lt;td&gt;&lt;{$cli.address}&gt;&lt;/td&gt;<br />
            &lt;td&gt;&lt;{$cli.telephone}&gt;&lt;/td&gt;<br />
            &lt;td&gt;&lt;{$cli.email}&gt;&lt;/td&gt;<br />
            &lt;/tr&gt;<br />
            &lt;{/foreach}&gt;<br />
            &lt;/table&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">更新一下模块。<br />
打开 <span style="color: #006600">tutorial/index.php</span>输入</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">&lt;?php<br />
            // Tutorial <br />
            // Created by KaotiK <br />
            require('http://www.cnblogs.com/mainfile.php');</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">require_once(XOOPS_ROOT_PATH.'/modules/tutorial/functions.php');<br />
            require_once(XOOPS_ROOT_PATH.'/modules/tutorial/class/xajax/xajax_core/xajax.inc.php');</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">$xajax = new xajax();<br />
            $xajax-&gt;registerFunction("processFormData");<br />
            $xajax-&gt;registerFunction("showForm");<br />
            <span style="color: red">$xajax-&gt;registerFunction("listClients");</span><br />
            //$xajax-&gt;setFlag("debug", true);<br />
            $xajax-&gt;processRequest();</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">$Xjavapath=XOOPS_URL.'/modules/tutorial/class/xajax';<br />
            $xajaxjava=$xajax-&gt;getJavascript($Xjavapath);</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">$xoopsOption['template_main'] = 'tut_main.html';<br />
            require(XOOPS_ROOT_PATH.'/header.php');<br />
            $xoopsTpl-&gt;assign('xajaxjava', $xajaxjava);</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">require(XOOPS_ROOT_PATH.'/footer.php');</span><span style="font-size: 9pt; font-family: 宋体"><br />
            </span><span style="font-size: 9pt; font-family: 宋体">?&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">打开 <span style="color: #006600">tutorial/functions.php</span>输入：</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">&lt;?php<br />
            <br />
            <span style="color: black">require_once XOOPS_ROOT_PATH . '/class/template.php';<br />
            if (!isset($xoopsTpl)) {<br />
            $xoopsTpl = new XoopsTpl();<br />
            }<br />
            $xoopsTpl-&gt;xoops_setCaching(0);<br />
            </span><br />
            function processFormData($arg)<br />
            {<br />
            // do some stuff based on $arg like query data from a database and<br />
            // put it into a variable like $newContent<br />
            $newContent = addClient($arg);<br />
            <br />
            // Instantiate the xajaxResponse object<br />
            $objResponse = new xajaxResponse();<br />
            <br />
            // add a command to the response to assign the innerHTML attribute of<br />
            // the element with id="SomeElementId" to whatever the new content is<br />
            $objResponse-&gt;assign("thisID","innerHTML", $newContent);<br />
            <br />
            //return the xajaxResponse object<br />
            return $objResponse;<br />
            }</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">function showForm()<br />
            {<br />
            global $xoopsTpl;</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">$text = $xoopsTpl-&gt;fetch('db:tut_form.html');</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">$objResponse = new xajaxResponse();<br />
            $objResponse-&gt;assign("formDiv","innerHTML",$text);<br />
            return $objResponse;<br />
            }</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">function addClient($data)<br />
            {<br />
            global $xoopsDB;<br />
            $myts = myTextSanitizer::getInstance();<br />
            $name=$myts-&gt;addslashes($data['name']);<br />
            $address=$myts-&gt;addslashes($data['address']);<br />
            $tel=$myts-&gt;addslashes($data['tel']);<br />
            $email=$myts-&gt;addslashes($data['email']);<br />
            $query = "Insert into ".$xoopsDB-&gt;prefix("tutorial_myform")." (name, address, telephone, email) values ('$name', '$address', '$tel', '$email' )";<br />
            $res=$xoopsDB-&gt;query($query);<br />
            if(!$res) {<br />
            $msg="error: $query";<br />
            } else {<br />
            $msg="Data was correctly inserted into DB!";<br />
            }<br />
            return $msg;<br />
            }</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">function listClients(){<br />
            global $xoopsTpl;</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">$clients=clientLoader();<br />
            $xoopsTpl-&gt;assign('clients', $clients);</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">$text = $xoopsTpl-&gt;fetch('db:tut_client_list.html');</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">$objResponse = new xajaxResponse();<br />
            $objResponse-&gt;assign("clientListDiv","innerHTML",$text);<br />
            return $objResponse;</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">}</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">function clientLoader(){<br />
            global $xoopsDB;<br />
            $client=array();<br />
            $q=1;<br />
            $query = $xoopsDB-&gt;query(' SELECT * FROM ' . $xoopsDB-&gt;prefix('tutorial_myform'));<br />
            while($myrow = $xoopsDB-&gt;fetchArray($query) )<br />
            {<br />
            $client[$q]['name'] = $myrow['name'];<br />
            $client[$q]['address'] = $myrow['address'];<br />
            $client[$q]['telephone'] = $myrow['telephone'];<br />
            $client[$q]['email'] = $myrow['email'];<br />
            $q++;<br />
            }<br />
            return $client;<br />
            }</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">?&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">打开 <span style="color: #006600">tutorial/templates/tut_main.html</span>，输入</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">&lt;p&gt;&lt;{$xajaxjava}&gt;&lt;/p&gt;<br />
            &lt;p&gt;&lt;a href="#" onclick="xajax_showForm();return false;"&gt;formtest&lt;/a&gt;&lt;/p&gt;<br />
            <span style="color: red">&lt;p&gt;&lt;a href="#" onclick="xajax_listClients();return false;"&gt;List Clients&lt;/a&gt;&lt;/p&gt;</span><br />
            &lt;p&gt;&lt;div id="formDiv"&gt;&lt;/div&gt;&lt;/p&gt;<br />
            &lt;p&gt;&lt;div id="thisID"&gt;&lt;/div&gt;&lt;/p&gt;<br />
            <span style="color: red">&lt;p&gt;&lt;div id="clientListDiv"&gt;&lt;/div&gt;&lt;/p&gt;</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">测试一下！进入tutorial的主页面，有两个超链接，一个是formtest 另外一个是List Clients. 点击 List Clients. 可以看到我们刚才插入的数据.点击formtest会出现一个表单。这就是2个ajax的效果。</span></p>
<table style="width: 100%" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 77%; padding-top: 0.75pt" width="77%">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">这里是完整的文件下载</span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; background: yellow; padding-bottom: 0.75pt; width: 23%; padding-top: 0.75pt" width="23%">
            <p style="text-align: center" align="center"><span style="font-size: 12pt; font-family: Arial"><br />
            <a href="http://www.kaotik.biz/tutorial/tutorial_part3_complete.zip">Completed Module from part 3</a></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><a href="http://www.kaotik.biz/tutorial/tutorial_part4.html">Part 4 - Xoops Blocks</a></span></p>
<img src="http://www.cnblogs.com/xxpyeippx/aggbug/1160841.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160841.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/19/1160841.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/>· <a href="http://news.cnblogs.com/n/56852/" target="_blank">淘宝网通过索引模式涉足网络文学</a><span style="color:gray">(2010-02-10 15:59)</span><br/>· <a href="http://news.cnblogs.com/n/56851/" target="_blank">苹果发布 iPhone/iPad SDK 3.2 beta2 开发包</a><span style="color:gray">(2010-02-10 15:37)</span><br/>· <a href="http://news.cnblogs.com/n/56850/" target="_blank">“谷姐”：披着“谷歌”羊皮的悲哀？</a><span style="color:gray">(2010-02-10 15:32)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>XOOPS模块开发快速入门中文翻译（七） </title><link>http://www.cnblogs.com/xxpyeippx/archive/2008/04/18/1160307.html</link><dc:creator>xxp</dc:creator><author>xxp</author><pubDate>Fri, 18 Apr 2008 10:42:00 GMT</pubDate><guid>http://www.cnblogs.com/xxpyeippx/archive/2008/04/18/1160307.html</guid><description><![CDATA[<p>阅读: 398 评论: 1 作者: <a href="http://www.cnblogs.com/xxpyeippx/" target="_blank">xxp</a> 发表于 2008-04-18 18:42 <a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/18/1160307.html" target="_blank">原文链接</a></p><font style="background-color: #fffbf0" face="Verdana">&nbsp; 由于这两天一直研究XOOPS的模块，所以找到了这篇很好的模块开发快速入门。<br />
看了以后，就兴致勃勃的来开发模块了，可是开发的过程中遇到一些问题。<br />
应该是我看的太快了，要学而时习之啊。因此翻译在这里。<br />
＝＝＝＝＝＝＝＝＝＝＝===<br />
作者：Surance Yin<br />
邮箱：Suranceyin@yahoo.com.cn<br />
主页：http://www.fltek.com.cn<br />
=================&nbsp;</font><br />
<br />
<br />
&nbsp;
<p style="text-align: center" align="center"><strong><span style="font-size: 18pt; font-family: 宋体">第三章 ――建立一个具有Ajax功能的模块</span></strong></p>
<p style="text-align: right" align="right"><span style="font-size: 12pt; font-family: 宋体"><a href="http://www.kaotik.biz/tutorial/buildmodule1.html">Part 1 Building a simple module</a></span></p>
<p style="text-align: right" align="right"><span style="font-size: 12pt; font-family: 宋体"><a href="http://www.kaotik.biz/tutorial/tutorial_part_2.html">Part 2 - using Smarty templates in a module</a></span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">这一章，我会教会你怎么在模块里面用ajax。范例里面使用的是xajax. 当然，还有很多其他的ajax的工具，比如说主要由php实现的xajax, sajax 等. 还有一些是纯javascript脚本的，比如说<a href="http://script.aculo.us/">scriptaculous</a>. 当你看完这个教程的时候，可以大胆的尝试其他的ajax库。呵呵，我为什么会用Xajax呢？因为我比较熟悉php的编程，所以我觉得xajax更加灵活。<br />
ajax是什么? 就是不用刷新网页的情况下更改网页的部分显示。这个功能很有用；尤其当要降低服务器负载的时候.<br />
什么时候用ajax呢?举例说明：当你有一个数据表的时候，可以用ajax来存数据库.注意：ajax并不是万能的.这只是一个改善用户体验的工具而已。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">开始吧！</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">第一步：下载模块文件</span></strong></p>
<table style="width: 100%" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; width: 77%; padding-top: 0.75pt" width="77%">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">下载并安装这个文件。这里用的是第二章做好的文件。不同的是增加了一个</span><span style="font-size: 12pt; font-family: Arial">class</span><span style="font-size: 12pt; font-family: 宋体">文件夹，文件夹里面有一个</span><span style="font-size: 12pt; font-family: Arial">xajax</span><span style="font-size: 12pt; font-family: 宋体">子文件夹，里面放置了</span><span style="font-size: 12pt; font-family: Arial">xajax</span><span style="font-size: 12pt; font-family: 宋体">的文件</span><span style="font-size: 12pt; font-family: Arial"> (version 0.5 beta 4b)</span><span style="font-size: 12pt; font-family: 宋体">。另外，还要将</span><span style="font-size: 12pt; font-family: Arial"> index.php</span><span style="font-size: 12pt; font-family: 宋体">重命名为</span><span style="font-size: 12pt; font-family: Arial">index_from_part2.php </span><span style="font-size: 12pt; font-family: 宋体">并创建一个新的</span><span style="font-size: 12pt; font-family: Arial"> index file.</span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; background: yellow; padding-bottom: 0.75pt; width: 23%; padding-top: 0.75pt" width="23%">
            <p style="text-align: center" align="center"><span style="font-size: 12pt; font-family: Arial"><br />
            Tutorial module from part 2 with xajax files added<br />
            <a href="http://www.kaotik.biz/tutorial/tutorial_part3_start.zip">tutorial</a></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">第二步：使用xajax</span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">这里是新版本的 <span style="color: #336600">index.php</span>:</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">&lt;?php<br />
            // Tutorial <br />
            // Created by KaotiK <br />
            require('http://www.cnblogs.com/mainfile.php');</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; color: red; font-family: 宋体">require_once(XOOPS_ROOT_PATH.'/modules/tutorial/functions.php');<br />
            require_once(XOOPS_ROOT_PATH.'/modules/tutorial/class/xajax/xajax_core/xajax.inc.php');</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; color: red; font-family: 宋体">$xajax = new xajax();<br />
            $xajax-&gt;registerFunction("processFormData");<br />
            //$xajax-&gt;setFlag("debug", true);<br />
            $xajax-&gt;processRequest();</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; color: red; font-family: 宋体">$Xjavapath=XOOPS_URL.'/modules/tutorial/class/xajax';<br />
            $xajaxjava=$xajax-&gt;getJavascript($Xjavapath);</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">$xoopsOption['template_main'] = 'tut_main.html';<br />
            require(XOOPS_ROOT_PATH.'/header.php');</span><span style="font-size: 9pt; color: red; font-family: 宋体"><br />
            $xoopsTpl-&gt;assign('xajaxjava', $xajaxjava);</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">require(XOOPS_ROOT_PATH.'/footer.php');</span><span style="font-size: 9pt; font-family: 宋体"><br />
            </span><span style="font-size: 9pt; font-family: 宋体">?&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">让我们一步一步来解释:</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; color: red; font-family: 宋体">require_once(XOOPS_ROOT_PATH.'/modules/tutorial/functions.php');<br />
            require_once(XOOPS_ROOT_PATH.'/modules/tutorial/class/xajax/xajax_core/xajax.inc.php');</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">第一行引用了functions文件。这个文件里面有所有我的 xajax 和其他方法。在开始使用 xajax之前,可以创建2个文件，一个储存ajax方法，一个储存其他方法。第二行引用了xajax 的必须文件.</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; color: red; font-family: 宋体">$xajax = new xajax();<br />
            $xajax-&gt;registerFunction("processFormData");<br />
            //$xajax-&gt;setFlag("debug", true);<br />
            $xajax-&gt;processRequest();</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">第一行创建了一个xajax对象。使用xajax之前，要明确一点：所有要用到的方法都要先注册给xajax。这就是第二行做的事情： </span><span style="font-size: 9pt; color: blue; font-family: 宋体">$xajax-&gt;registerFunction("processFormData");</span><span style="font-size: 9pt; color: red; font-family: 宋体">.</span><span style="font-size: 12pt; font-family: 宋体">我会在解释functions.php时候再次说明的.第三行会给出一个输出，可以用来调试 xajax. 第四行启动xajax的功能. <strong><span style="color: red">注意:</span></strong>如果要在xoops里面使用xajax，以上代码的顺序是不能变化的。比如，如果将</span><span style="font-size: 9pt; color: blue; font-family: 宋体">$xajax-&gt;processRequest();</span><span style="font-size: 12pt; font-family: 宋体">写在 </span><span style="font-size: 9pt; color: blue; font-family: 宋体">require(XOOPS_ROOT_PATH.'/header.php');</span><span style="font-size: 12pt; font-family: 宋体">后面就不行了。为什么？因为xajax必须在没有html输出之前调用processRequest（）方法, 而 </span><span style="font-size: 9pt; color: blue; font-family: 宋体">XOOPS_ROOT_PATH.'/header.php</span><span style="font-size: 12pt; font-family: 宋体">具有一些html输出.</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; color: red; font-family: 宋体">$Xjavapath=XOOPS_URL.'/modules/tutorial/class/xajax';<br />
            $xajaxjava=$xajax-&gt;getJavascript($Xjavapath);</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">xajax </span><span style="font-size: 12pt; font-family: 宋体">的运行需要一个javascript 脚本文件。 因为要使用smarty，所以只能用这种方法来包含javascript文件了。第一行将xajax的根目录地址赋给变量</span><span style="font-size: 9pt; color: blue; font-family: 宋体">$Xjavapath.</span><span style="font-size: 12pt; font-family: 宋体">然后再通过xajax内置的方法获取他所有的javascript脚本，并赋给变量</span><span style="font-size: 9pt; color: blue; font-family: 宋体">$xajaxjava</span><span style="font-size: 12pt; font-family: 宋体">.</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">$xoopsOption['template_main'] = 'tut_main.html';<br />
            require(XOOPS_ROOT_PATH.'/header.php');</span><span style="font-size: 9pt; color: red; font-family: 宋体"><br />
            $xoopsTpl-&gt;assign('xajaxjava', $xajaxjava);</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">就像上一章讲到的，第一行指定了模板文件。第二行输出头部信息。第三行将xajax的脚本引用发给smarty模板。</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">require(XOOPS_ROOT_PATH.'/footer.php');</span><span style="font-size: 9pt; color: black; font-family: 宋体"><br />
            </span><span style="font-size: 9pt; color: black; font-family: 宋体">?&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">这句上一章解释过了。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">第三步- Functions.php</span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">打开 tutorial/functions.php 写入以下代码：</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">&lt;?php<br />
            function processFormData($arg)<br />
            {<br />
            // do some stuff based on $arg like query data from a database and<br />
            // put it into a variable like $newContent<br />
            $newContent = "Value of field: ".$arg['myfield'];<br />
            <br />
            // Instantiate the xajaxResponse object<br />
            $objResponse = new xajaxResponse();<br />
            <br />
            // add a command to the response to assign the innerHTML attribute of<br />
            // the element with id="SomeElementId" to whatever the new content is<br />
            $objResponse-&gt;assign("thisID","innerHTML", $newContent);<br />
            <br />
            //return the xajaxResponse object<br />
            return $objResponse;<br />
            }</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">?&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">function processFormData($arg)</span></strong><span style="font-size: 12pt; font-family: 宋体">创建了一个函数</span><span style="font-size: 9pt; font-family: 宋体">processFormData</span><span style="font-size: 12pt; font-family: 宋体">. </span><span style="font-size: 12pt; font-family: 宋体">这个函数接收参数$arg. 表单的所有内容会存放在 $arg 数组里面。<br />
</span><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">$newContent = "Value of field: ".$arg['myfield'];</span></strong><span style="font-size: 12pt; font-family: 宋体">创建变量来接收$arg里面的一个信息.<br />
</span><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">$objResponse = new xajaxResponse();</span></strong><span style="font-size: 12pt; font-family: 宋体"> xajax</span><span style="font-size: 12pt; font-family: 宋体">开始输出。当你的代码都写完后，就可以调用这个方法了。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">$objResponse-&gt;assign("thisID","innerHTML", $newContent); </span></strong><span style="font-size: 12pt; font-family: 宋体">这里将变量$newContent赋给一个ID为&#8220;thisID&#8221;的控件的&#8220;innerHTML&#8221;属性。这个控件是类似于这样的： <span style="color: blue">&lt;div id="thisID"&gt;</span>而不是 <span style="color: blue">&lt;div class="thisID"&gt;</span>.<br />
<strong><span style="color: #336600">重点：:</span></strong>虽然可以赋任何值给这个控件，不过不能做任何html输出。如果输入 <span style="color: blue">print_r($arg)</span>, 这样的语句，xajax就会出错了。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; color: #336600; font-family: 宋体">重点：:</span></strong><span style="font-size: 12pt; font-family: 宋体">想要调试xajax的时候，取消<span style="color: #006600">index.php</span>.中这句的注释 </span><span style="font-size: 9pt; color: blue; font-family: 宋体">$xajax-&gt;setFlag("debug", true);</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">return $objResponse;</span></strong><span style="font-size: 12pt; font-family: 宋体">结束函数，返回变量. </span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">好，现在xajax搞定了，我们来看一下如何写模板文件</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">第四步- Tut_main.html 模板</span></strong><span style="font-size: 12pt; font-family: 宋体"><br />
</span><span style="font-size: 12pt; font-family: 宋体">打开 <span style="color: #336600">/tutorial/templates/tut_main.html</span>.写入以下代码:</span></p>
<table style="background: #9df8ff; width: 300pt" cellpadding="0" width="400" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">&lt;{$xajaxjava}&gt;</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">&lt;form id="myform" name="myform" method="post" action="index.php"&gt;<br />
            &lt;input type="text" name="myfield" id="myfield" /&gt;<br />
            &lt;input type="button" value="Calculate" onclick="xajax_processFormData(xajax.getFormValues('myform'));" /&gt;<br />
            &lt;/form&gt;</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">&lt;div id="thisID"&gt;&lt;/div&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">&lt;{$xajaxjava}&gt;</span></strong><span style="font-size: 12pt; font-family: 宋体">这里会引用所有需要的javascript文件，放在模板的第一行。<br />
</span><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">&lt;form id="myform" name="myform" method="post" action="index.php"&gt;</span></strong><span style="font-size: 12pt; font-family: 宋体">这一行建立了名为 <span style="color: blue">myform</span>的表单 。表单的名称非常重要。<br />
</span><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">&lt;input type="text" name="myfield" id="myfield" /&gt;</span></strong><span style="font-size: 12pt; font-family: 宋体">创建了一个叫做<span style="color: blue">myfield</span>.的文本域<br />
</span><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">&lt;input type="button" value="Calculate" onclick="xajax_processFormData(xajax.getFormValues('myform'));" /&gt;</span></strong><span style="font-size: 12pt; font-family: 宋体">现在创建了一个向xajax提交数据的按钮.当用户点这个按钮后， </span><span style="font-size: 9pt; color: #006600; font-family: 宋体">'myform'</span><span style="font-size: 12pt; font-family: 宋体">会向 xajax 的函数 processFormData发送数据。 <strong><span style="color: #006600"><br />
</span><span style="color: #006600">注意：</span></strong> 当创建xajax函数的时候，方法名为</span><span style="font-size: 9pt; color: #006600; font-family: 宋体">processFormData</span><span style="font-size: 12pt; font-family: 宋体">但是在html文件中，函数名为： </span><span style="font-size: 9pt; color: #006600; font-family: 宋体">xajax_processFormData</span><span style="font-size: 12pt; font-family: 宋体">.<br />
</span><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">&lt;/form&gt;</span></strong><span style="font-size: 12pt; font-family: 宋体">结束表单. <br />
<strong><span style="color: #006600">注意:</span></strong> IE浏览器不允许嵌套表单，而firefox允许。嵌套表单的意思是一个form里面有另外一个form。当使用ajax这一点很重要,但是因为IE不支持，只能另寻它法了。 经常使用 xajax时,这个问题会显露出来。解决方案就是创建一个Form之前，关闭旧的Form。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">&lt;div id="thisID"&gt;&lt;/div&gt;</span></strong><span style="font-size: 12pt; font-family: 宋体">这就是xajax输出的地方。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: 宋体">第五步- 测试</span></strong><span style="font-size: 12pt; font-family: 宋体"><br />
</span><strong><span style="font-size: 12pt; color: red; font-family: 宋体">重点：</span></strong><span style="font-size: 12pt; font-family: 宋体"> 在测试之前，请保证xoops的debugging 是 OFF的。 不然Xajax 会出错。Why? 因为xajax运行之前，不能有任何html输出。我们可以开始测试了。打开tutorial的主页面， 可以看到一个文本框和一个按钮。在文本框中输入 <span style="color: blue">xajax is cool</span>，按下按钮。可以看到输出： <span style="color: blue">Value of field: xajax is cool</span>.id为<span style="color: blue">thisID</span><span style="color: blue">的</span>标签<span style="color: blue">&lt;div&gt;</span>负责更新数据。很酷吧！</span></p>
<img src="http://www.cnblogs.com/xxpyeippx/aggbug/1160307.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/18/1160307.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/xxpyeippx/archive/2008/04/18/1160307.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56855/" target="_blank">NDepend 3.0已与Visual Studio集成</a><span style="color:gray">(2010-02-10 16:17)</span><br/>· <a href="http://news.cnblogs.com/n/56854/" target="_blank">Ruby in Steel 1.5发布，去除IronRuby支持</a><span style="color:gray">(2010-02-10 16:14)</span><br/>· <a href="http://news.cnblogs.com/n/56852/" target="_blank">淘宝网通过索引模式涉足网络文学</a><span style="color:gray">(2010-02-10 15:59)</span><br/>· <a href="http://news.cnblogs.com/n/56851/" target="_blank">苹果发布 iPhone/iPad SDK 3.2 beta2 开发包</a><span style="color:gray">(2010-02-10 15:37)</span><br/>· <a href="http://news.cnblogs.com/n/56850/" target="_blank">“谷姐”：披着“谷歌”羊皮的悲哀？</a><span style="color:gray">(2010-02-10 15:32)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/news/tag/Buzz/" target="_blank">Google Buzz相关新闻</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>