<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Android Resource &#124; 资源 资讯 教程</title>
	<atom:link href="http://www.androidres.com/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.androidres.com</link>
	<description>Discuss developing Android applications using the Android framework and Collect android resource</description>
	<lastBuildDate>Tue, 12 Jan 2010 10:03:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<!-- Easy AdSense V2.82 -->
<!-- Post[count: 1] -->
<div class="ezAdsense adsense adsense-leadin" style="text-align:center;margin:12px;"><script type="text/javascript"><!--
google_ad_client = "pub-4703322803494425";
/* 468x60, Top_SinglePost */
google_ad_slot = "7939142022";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>	<item>
		<title>Android官方开发网站扩充资源模块</title>
		<link>http://www.androidres.com/index.php/2010/01/12/new-resources-and-sample-code-on-android-developers/</link>
		<comments>http://www.androidres.com/index.php/2010/01/12/new-resources-and-sample-code-on-android-developers/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 09:52:26 +0000</pubDate>
		<dc:creator>EGGer</dc:creator>
				<category><![CDATA[Daily Cakes]]></category>
		<category><![CDATA[Android Bluetooth]]></category>
		<category><![CDATA[Android Live Folders]]></category>
		<category><![CDATA[Android QuickContactsBadge]]></category>
		<category><![CDATA[Text-To-Speech]]></category>

		<guid isPermaLink="false">http://www.androidres.com/?p=717</guid>
		<description><![CDATA[
对于较细心的朋友而言，应该会注意到Android SDK官方网站新增了一个“Resource”分类。其目的为了更加集中式的介绍某些有价值的资源，最大程度的方便开发者更快速的获取帮助。其中一部分内容原本零散分布在其它板块，目前被统一整合到Resource分类中，例如：tutorials, sample code, 和FAQs。另外也从Android官方博客中精挑一些比较重要的内容放在technical articles子类中，其中大部分内容可以在AR中找到较详细的中文版本。


除了在Sample Code子类中保留原有的一些实例之外，又添加了一批新内容。Sample Code对于初学者深入了解Android平台开发非常有益，可以非常直观的了解不同功能模块的开发方法和技巧，避免对于某些功能模块仅处于术语上的认知，而无法灵活的将学到的技术应用在自己的实际项目中。


下面详细列举一些最新的Samples内容：

Multiple Resolutions : 包括两方面的内容，1）阐述如何巧妙的根据多种屏幕显示标准来匹配特定的资源目录。2）针对不同Android SDK版本的用户优化应用程序。
Wiktionary and WiktionarySimple: 介绍如何创建一个可交互的Home screen widget。
Contact Manager:介绍如何使用ContactsContract接口获取和维护用户的多个账户和Contact providers。
Bluetooth Chat:这个例子是对蓝牙功能的扩展，实现基于蓝牙的实时数据传输（包括聊天功能），其中涉及到扫描附近可用设备、初始化设备间蓝牙链接和传送实时数据。
NotePad (now with Live Folders):这个例子包含了与Live Folders相关的技术。
API Demoe&#62;APP&#62;Activity&#62;QuickContactsDemo: 介绍关于android.widget.QuickContactsBadge类的使用方法（Android 2.0中新添加的类）。
API Demoe&#62;APP&#62;Activity&#62;SetWallpaper: 介绍如何应用Android.app.WallpaperManager类使用户可以更换系统Wallpaper。
API Demoe&#62;APP&#62;Activity&#62;Text-To-Speech: 介绍应用Text-To-Speech技术添加软件的语音阅读功能。

]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-718" style="border: 3px solid #e6e6e6;" title="Adding new Resources in Android developers" src="http://www.androidres.com/wp-content/uploads/2010/01/resource.jpg" alt="" width="524" height="286" /></p>
<p>对于较细心的朋友而言，应该会注意到<a target="_blank" id="ul1r" title="Android SDK官方网站" href="http://developer.android.com/index.html" target="_blank">Android SDK官方网站</a>新增了一个“<a target="_blank" id="fcdk" title="Resource" href="http://developer.android.com/resources/index.html" target="_blank">Resource</a>”分类。其目的为了更加集中式的介绍某些有价值的资源，最大程度的方便开发者更快速的获取帮助。其中一部分内容原本零散分布在其它板块，目前被统一整合到Resource分类中，例如：<a target="_blank" href="http://developer.android.com/resources/tutorials/hello-world.html" target="_blank">tutorials</a>, <a target="_blank" href="http://developer.android.com/resources/samples/index.html" target="_blank">sample code</a>, 和<a target="_blank" href="http://developer.android.com/resources/faq/index.html" target="_blank">FAQs</a>。另外也从Android官方博客中精挑一些比较重要的内容放在<a target="_blank" href="http://developer.android.com/resources/articles/index.html" target="_blank">technical articles</a>子类中，其中大部分内容可以在<a target="_blank" id="yo5h" title="AR" href="../" target="_blank">AR</a>中找到较详细的中文版本。<span id="more-717"></span></p>
<div>
<div>
<div>除了在Sample Code子类中保留原有的一些实例之外，又<a href="http://www.androidres.com/index.php/2010/01/12/new-resources-and-sample-code-on-android-developers/">添加</a>了一批新内容。Sample Code对于初学者深入了解Android平台开发非常有益，可以非常直观的了解不同功能模块的开发方法和技巧，避免对于某些功能模块仅处于术语上的认知，而无法灵活的将学到的技术应用在自己的实际项目中。</div>
</div>
</div>
<p>下面详细列举一些最新的Samples内容：</p>
<ul>
<li style="text-align: left;"><strong><a target="_blank" href="http://developer.android.com/resources/samples/MultiResolution/index.html" target="_blank">Multiple Resolutions</a> </strong>: 包括两方面的内容，1）阐述如何巧妙的根据多种屏幕显示标准来匹配特定的资源目录。2）针对不同Android SDK版本的用户优化应用程序。</li>
<li style="text-align: left;"><strong><a target="_blank" href="http://developer.android.com/resources/samples/Wiktionary/index.html" target="_blank">Wiktionary</a> and <a target="_blank" href="http://developer.android.com/resources/samples/WiktionarySimple/index.html" target="_blank">WiktionarySimple</a></strong>: 介绍如何创建一个可交互的Home screen widget。</li>
<li style="text-align: left;"><strong><a target="_blank" href="http://developer.android.com/resources/samples/ContactManager/index.html" target="_blank">Contact Manager</a></strong>:介绍如何使用ContactsContract接口获取和维护用户的多个账户和Contact providers。</li>
<li style="text-align: left;"><strong><a target="_blank" href="http://developer.android.com/resources/samples/BluetoothChat/index.html" target="_blank">Bluetooth Chat</a></strong>:这个例子是对蓝牙功能的扩展，实现基于蓝牙的实时数据传输（包括聊天功能），其中涉及到扫描附近可用设备、初始化设备间蓝牙链接和传送实时数据。</li>
<li style="text-align: left;"><strong><a target="_blank" href="http://developer.android.com/resources/samples/NotePad/index.html" target="_blank">NotePad</a> (now with Live Folders)</strong>:这个例子包含了与Live Folders相关的技术。</li>
<li style="text-align: left;"><strong><a target="_blank" id="wihq" title="API Demoe" href="http://developer.android.com/resources/samples/ApiDemos/index.html" target="_blank">API Demoe</a>&gt;<a target="_blank" id="erxj" title="APP" href="http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/index.html" target="_blank">APP</a>&gt;Activity&gt;<a target="_blank" id="krjl" title="QuickContactsDemo" href="http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/QuickContactsDemo.html" target="_blank">QuickContactsDemo</a></strong>: 介绍关于<span style="font-family: Courier New;">android.widget.QuickContactsBadge</span>类的使用方法（<strong>Android 2.0中新添加的类</strong>）。</li>
<li style="text-align: left;"><strong><a target="_blank" id="brdl" title="API Demoe" href="http://developer.android.com/resources/samples/ApiDemos/index.html" target="_blank">API Demoe</a>&gt;<a target="_blank" id="ek0t" title="APP" href="http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/index.html" target="_blank">APP</a>&gt;Activity&gt;<a target="_blank" id="so:a" title="QuickContactsDemo" href="http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/WallpaperActivity.html" target="_blank">SetWallpaper</a></strong>: 介绍如何应用Android.app.WallpaperManager类使用户可以更换系统Wallpaper。</li>
<li style="text-align: left;"><strong><a target="_blank" id="ijac" title="API Demoe" href="http://developer.android.com/resources/samples/ApiDemos/index.html" target="_blank">API Demoe</a>&gt;<a target="_blank" id="fva8" title="APP" href="http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/index.html" target="_blank">APP</a>&gt;Activity&gt;<a target="_blank" id="b:y6" title="QuickContactsDemo" href="http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/TextToSpeechActivity.html" target="_blank">Text-To-Speech</a></strong>: 介绍应用Text-To-Speech技术添加软件的语音阅读功能。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.androidres.com/index.php/2010/01/12/new-resources-and-sample-code-on-android-developers/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>部署Android软件兼容性的参考信息</title>
		<link>http://www.androidres.com/index.php/2010/01/07/%e9%83%a8%e7%bd%b2android%e8%bd%af%e4%bb%b6%e5%85%bc%e5%ae%b9%e6%80%a7%e7%9a%84%e5%8f%82%e8%80%83%e4%bf%a1%e6%81%af/</link>
		<comments>http://www.androidres.com/index.php/2010/01/07/%e9%83%a8%e7%bd%b2android%e8%bd%af%e4%bb%b6%e5%85%bc%e5%ae%b9%e6%80%a7%e7%9a%84%e5%8f%82%e8%80%83%e4%bf%a1%e6%81%af/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 05:30:33 +0000</pubDate>
		<dc:creator>EGGer</dc:creator>
				<category><![CDATA[Daily Cakes]]></category>
		<category><![CDATA[Android Versions]]></category>
		<category><![CDATA[Device Dashboard]]></category>

		<guid isPermaLink="false">http://www.androidres.com/?p=712</guid>
		<description><![CDATA[
先道一声新年快乐！希望各位同学继续保持高昂的斗志，迎接新一年的挑战！
作为开发者经常需要权衡如何让待产中的软件更好的兼容市面上各种版本的Android系统手机，从而可以获得更多的用户保有量。然而当面对如此庞大的用户群体时，凸显一个不可忽视的问题：究竟是应该一如既往的关注于当前最新版本？还是充分考虑兼容性从而更好的支持各种版本的用户呢？面对这样的问题，我们将在下面给出一点参考意见。
在这里介绍一个最新发布的参照资源，它可以非常客观的帮助开发者权衡上面所阐述的问题：

接下来从开发者的视角更加详细的解读图表所包含的意义：

完全不需要考虑兼容Android平台最初的两个版本1.0 和 1.1。
Android 1.5依然在活跃手机用户中占有一定比例，建议开发者考虑对这部分用户的兼容性。
从Android 1.6开始，涌现出规格不相同的一些硬件设备（突出表现为屏幕尺寸），这对兼容性产生了一定的影响。开发者需要充分考虑软件适用于多种规格的硬件标准，发布之前要做好充分的测试。
两周之前刚刚发布了Android SDK 2.0 （09年底所有预置这个版本的设备将全面升级为Android 2.0.1）。

总的来看，占有比例较大的前三者分别是2.0.1/1.6/1.5。由于每次的更新都将带来革命性的改变，所以新版本将会快速的得到广泛的应用。Android开发小组将会经常性的更新类似一些统计数据，从而更好的帮助开发者提升产品价值。
]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-714" style="border: 3px solid #e6e6e6;" title="2010" src="http://www.androidres.com/wp-content/uploads/2010/01/2010.jpg" alt="" width="530" height="382" /></p>
<p><strong>先道一声新年快乐！希望各位同学继续保持高昂的斗志，迎接新一年的挑战！</strong></p>
<p>作为开发者经常需要权衡如何让待产中的软件更好的兼容市面上各种版本的Android系统手机，从而可以获得更多的用户保有量。然而当面对如此庞大的用户群体时，凸显一个不可忽视的问题：究竟是应该一如既往的关注于当前最新版本？还是充分考虑兼容性从而更好的支持各种版本的用户呢？面对这样的问题，我们将在下面给出一点参考意见。<span id="more-712"></span></p>
<p>在这里介绍一个最新发布的参照资源，它可以非常客观的帮助开发者权衡上面所阐述的问题：</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-713" title="Platform Versions Dashboard" src="http://www.androidres.com/wp-content/uploads/2010/01/dashboard.jpg" alt="" width="452" height="486" /></p>
<p>接下来从开发者的视角更加详细的解读图表所包含的意义：</p>
<ul>
<li>完全不需要考虑兼容Android平台最初的两个版本1.0 和 1.1。</li>
<li>Android 1.5依然在活跃手机用户中占有一定比例，建议开发者考虑对这部分用户的兼容性。</li>
<li>从Android 1.6开始，涌现出规格不相同的一些硬件设备（突出表现为屏幕尺寸），这对兼容性产生了一定的影响。开发者需要充分考虑软件适用于多种规格的硬件标准，发布之前要做好充分的测试。</li>
<li>两周之前刚刚发布了Android SDK 2.0 （09年底所有预置这个版本的设备将全面升级为Android 2.0.1）。</li>
</ul>
<p>总的来看，占有比例较大的前三者分别是2.0.1/1.6/1.5。由于每次的更新都将带来革命性的改变，所以新版本将会快速的得到广泛的应用。Android开发小组将会经常性的更新类似一些统计数据，从而更好的帮助开发者提升产品价值。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.androidres.com/index.php/2010/01/07/%e9%83%a8%e7%bd%b2android%e8%bd%af%e4%bb%b6%e5%85%bc%e5%ae%b9%e6%80%a7%e7%9a%84%e5%8f%82%e8%80%83%e4%bf%a1%e6%81%af/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>关于layoutopt的介绍和使用方法</title>
		<link>http://www.androidres.com/index.php/2009/12/12/use-layoutopt-to-optimize-xml-layout/</link>
		<comments>http://www.androidres.com/index.php/2009/12/12/use-layoutopt-to-optimize-xml-layout/#comments</comments>
		<pubDate>Sat, 12 Dec 2009 06:16:14 +0000</pubDate>
		<dc:creator>EGGer</dc:creator>
				<category><![CDATA[Resource]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[Layout]]></category>
		<category><![CDATA[layoutopt]]></category>

		<guid isPermaLink="false">http://www.androidres.com/?p=709</guid>
		<description><![CDATA[
介绍
对于一款获得用户青睐的 手机软件，单从实现层面上来分析大体包括两个重要的因素：缜密的逻辑运算和人性化的GUI设计。自由开发者普遍存在身兼数职的情况，除了编写程序以外，还 需兼顾GUI设计。编写程序完全需要依靠过硬的功底，一些简单的优化工具并不能对整体逻辑运算产生较大的帮助，这也决定了自由开发者的背景大部分是程序员 出身。在编写GUI方面由于Android平台的GUI系统采用了XML layout模式，遵循固定的排列规则关联界面元素。对于欠缺GUI编写经验的程序员，依然可以简单的实现比较复杂的操作界面。出于功能上的需求XML Layout会变得越来越臃肿，这使得优化过程变得非常困难，例如：容器类型的转换会影响到所有相关联的子元素、反复调整Views元素而导致某些混乱的问题等，由于以上的问题有时可能不会影响到界面的正常使用，非常容易导致忽略了一些影响执行效率的缺陷。为此Android开发小组在SDK Tools Revision 3中提供了Layout Optimization工具，简称：Layoutopt。由于XML Layout具有严格的定义规则，所以这个工具可以自动帮助开发者发现一些较常规的缺陷。目前还没有将其整合到Eclipse的开发环境中，暂时需要通过Command line来执行(运行-&#62;cmd)。
使用方法
layoutopt &#60;list of xml files or directories&#62;
note: 有两种参数形式：第一种，可以将xml文件的full path做为参数，如果有多个xml文件，需要用空格将其分隔开。第二种，直接提供多个xml文件所在folder路径。
例子：
$ layoutopt res/layout-land
$ layoutopt res/layout/main.xml res/layout-land/main.xml
]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-710" style="border: 3px solid #e6e6e6;" title="layout optimization" src="http://www.androidres.com/wp-content/uploads/2009/12/layout_optimization.jpg" alt="layout optimization" width="530" height="262" /></p>
<h2>介绍</h2>
<p>对于一款获得<a target="_blank" id="snev" title="用户青睐" href="../index.php/2009/12/05/10-user-experience-tips-for-successful-android-apps/" target="_blank">用户青睐</a>的 手机软件，单从实现层面上来分析大体包括两个重要的因素：缜密的逻辑运算和人性化的GUI设计。自由开发者普遍存在身兼数职的情况，除了编写程序以外，还 需兼顾GUI设计。编写程序完全需要依靠过硬的功底，一些简单的优化工具并不能对整体逻辑运算产生较大的帮助，这也决定了自由开发者的背景大部分是程序员 出身。在编写GUI方面由于Android平台的GUI系统采用了XML layout模式，遵循固定的排列规则关联界面元素。对于欠缺GUI编写经验的程序员，依然可以简单的实现比较复杂的操作界面。出于功能上的需求XML Layout会变得越来越臃肿，这使得优化过程变得非常困难，例如：<a target="_blank" id="kj83" title="容器类型" href="http://developer.android.com/guide/topics/ui/layout-objects.html" target="_blank">容器类型</a>的转换会影响到所有相关联的子元素、反复调整Views元素而导致某些混乱的问题等，由于以上的问题有时可能不会影响到界面的正常使用，非常容易导致忽略了一些影响执行效率的缺陷。为此Android开发小组在<a target="_blank" id="nz65" title="SDK Tools Revision 3" href="http://d.android.com/sdk/tools-notes.html" target="_blank">SDK Tools Revision 3</a>中提供了<a target="_blank" id="h.9q" title="Layout Optimization" href="http://d.android.com/guide/developing/tools/layoutopt.html">Layout Optimization</a>工具，简称：Layoutopt。由于XML Layout具有严格的定义规则，所以这个工具可以自动帮助开发者发现一些较常规的缺陷。目前还没有将其整合到Eclipse的开发环境中，暂时需要通过Command line来执行(运行-&gt;cmd)。</p>
<h2>使用方法</h2>
<blockquote><p><span style="color: #008000;">layoutopt &lt;list of xml files or directories&gt;</span></p></blockquote>
<blockquote><p><span style="color: #888888;">note: 有两种参数形式：第一种，可以将xml文件的full path做为参数，如果有多个xml文件，需要用空格将其分隔开。第二种，直接提供多个xml文件所在folder路径。</span></p></blockquote>
<p><span style="font-family: Courier New;">例子：</span></p>
<blockquote><p><span style="color: #008000;">$ layoutopt res/layout-land</span></p>
<p><span style="color: #008000;">$ layoutopt res/layout/main.xml res/layout-land/main.xml</span></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.androidres.com/index.php/2009/12/12/use-layoutopt-to-optimize-xml-layout/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>唠点与“细节”相关的事儿</title>
		<link>http://www.androidres.com/index.php/2009/12/05/10-user-experience-tips-for-successful-android-apps/</link>
		<comments>http://www.androidres.com/index.php/2009/12/05/10-user-experience-tips-for-successful-android-apps/#comments</comments>
		<pubDate>Sat, 05 Dec 2009 09:12:51 +0000</pubDate>
		<dc:creator>EGGer</dc:creator>
				<category><![CDATA[Essay]]></category>
		<category><![CDATA[Good Sales]]></category>
		<category><![CDATA[Optimize Apps]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[User Experience]]></category>

		<guid isPermaLink="false">http://www.androidres.com/?p=706</guid>
		<description><![CDATA[
曾经的ADC01举办之初，像我这样的老百姓对这项技术还处于无知状态。但凭借对Iphone的了解以及革命性的App Store，以至于当得知Android和它所肩负使命时，身体里流淌的血液便开始加速，筐唧筐唧往脑子里灌。如今ADC第二春已经落下帷幕，再一次对那 些构思巧妙的设计发出赞叹，大部分的成功作品都更加贴近生活，以至于平时我们不太注意的小细节，经过一番整理便可以成为手机上革命性的创新。“天下难事必做于易，天下大事必做于细” （什么？你第一次听说啊？那请您拜读一下《沃尔玛不败之谜》）。
从AndroidTapp.com看到一篇关于提高Android软件开发质量的总结，完全立足于用户的视角创建更加人性化的应用软件。AR对这篇文章的某些相关联的观点加以合并，增加和扩展了某些较重要的内容。如果你有更好的建议，希望可以通过提交Comments的方式与大家共享！
尊重用户对当前软件的绝对控制权
大部分人都有过被“流氓”软件骚扰的经历，其主要特点体现在如下几个特征：

在用户不知情的前提下强制安装。
无法轻易移除
盗取用户资料

尽管Android平台有着严密的安全体系，但依然无法避免某些新形势的恶意行为。之所以将这条法则放在第一个位置，完全是为了呼吁开发者善待用户对手机应 用市场的信任，同时更要齐心合力维护赖以生存的生命之泉。让用户轻松体验软件带来便利和快乐的同时，更需要确保他们具备自由选择的权利。当软件正常运行或 者正处于任务的处理状态时，允许随时便捷的终止、退出或者登出当前应用程序的操作。
善待用户的可存储资源（SD Card &#38; Internal Memory）
很多开发者常常出于便捷的考虑，直接将大量临时性或者一些初始化数据存储于手机的内置存储单元。这对于某些配置较低的手机，简直是一场灾难。建议在 存储数据之前先检测当前SD-Card的可用性。如果出现没有SD-Card或者其存储区域已满时，则可以考虑利用网络存储资源（受限于当前网络连接状 态）。如果处于“墙内”或者无法获得网络服务，那么不得不考虑依赖于内置的存储单元，但是需要尽可能优化数据量，确保资源的有效利用。
在软件设置菜单中预置清除数据功能，允许用户手动清除缓存或者移除所有与当前程序相关联的数据，
自定义更新周期
在软件设置菜单中增加修改更新周期的功能，允许用户根据当前需要选择恰当的周期。如果周期设置较短，不但影响到系统性能的表现力，而且会缩短电力的续航时 间。对于开发者而言，需要严格控制版本号，针对一批修改做统一更新，而不要频繁的更新某些局部细微改动（出现致命缺陷的情况除外）。
完整的功能描述和详实的更新日志
建议具备一定条件的开发者可以考虑为不同的应用软件或游戏创建独立的网站（或者将多个软件存放在同一个网站的不同页面中维护和管理）。这 样有助于用户可以第一时间了解应用程序的完整介绍，包括可能修改用户手机设置的明确说明（是否增加后台进程等&#8230;）。另外每次版本更新的详细信息需要保 持与软件更新同步：

修复了什么缺陷？
当前版本添加了哪些新功能？
下一版本可能会实现哪些值得期待的功能？

这样做的好处不需要过多介绍。难道你不希望了解当前手机软件的更新都做了哪些修改吗？另外，作为一个实时的反馈平台，可以及时的了解到当前用户遇到的疑问和收集非常有价值的建设性意见。
搭建漂亮的门面
赏心悦目的操作界面总是可以第一时间俘获用户的心。从恰当合理的色彩搭配到摆放和组织界面元素，其任何环节都直接影响产品的质量。大街上花枝招展的个性人 类，绝对可以毫不留情的吸引住你的眼球，但你真的有勇气和他对视吗？摆放错位的汽车堵在胡同里，你是否有强烈的正义感涌上心头呢？没错，视觉会对人的情绪 产生非常深远的影响。当无法通过视觉测试的食物，估计很难送到嘴里（饥饿状态除外）。对于要求苛刻的用户而言，其很难忍受手机主菜单中存在破坏和谐气氛的 Icons。所以对于呕心沥血之作，在保证后台可以高效运作的前提下，非常有必要装备一整套体面的行头。
清晰流畅的操作流程
如果将应用软件的内容比作为整个系统的功能器官，那么导航系统可以看做为大脑，它的意义在于“思考”如何调配当前系统资源。堵塞或者混乱的大脑无法高效的 提供准确内容，一旦内容无法被用到，其存在的意义等价于零。在设计软件功能导航时，可以考虑遵循大众普遍习惯的操作方式，确保某些常用功能的摆放位置和顺 序（千万不要在这里体现另类的个性，否则会酿成惨剧）。然而这样也并不是最稳妥的办法，针对不同情况需要考虑复杂的地域差异。巧妙的根据功能性分类，并使 用具有组织和约束功能的Views元素加以区分等。
基于缺乏耐心的用户为考量来设计和优化
凡事如果以最坏的情况来考虑，必定可以再市场的角逐中获得更多人的青睐。根据此前一些抽样数据的统计，手机软件的群体中有相当一部分人对事物缺乏耐心，尤 其是面对狭小屏幕所反映出的压抑情绪会加大对某些设计蹩脚的应用程序的厌烦感。针对硬件条件的限制，尽管暂时很难直接给用户带来与桌面应用程序痛快淋漓的 体验，但至少可以对某些软件做出操作流程上的优化，已达到简便和更加容易使用。由于具体的要求存在多样性，所以无法客观的给出统一的量化标准，但作为开发 者需要时刻提醒自己对这个问题的关注。
避免处于BP状态的Activities依然频繁占用系统资源
Background processes被官方直接定义为：onStop()方 法已经被调用、并对当前用户处于不可见状态的Activities。开发者根据应用程序的需求慎重考量是否一定有必要保证处于BP状态的 Activities仍然需要处理各种数据，以至于频繁占用过多的网络和计算资源。手机用户普遍非常在意系统的执行效率，有时宁愿放弃某些功能以保证当前 系统的可持续高效的处理任何请求。
需要将用户服务的因素绑定在完整的技术支持体系中
自由开发者在Android Market从事商业行为时，往往都非常看重为用户提供完善的技术支持，以期待得到比较好的口碑和保证软件销量持续增长。但是这里所提到的另外一种用户服 务不同于技术支持，它更倾向于是Android Market应该提供的一种用户保障体系。然而目前Google在这方面缺乏完整的解决方法，不得不由开发者面对诸如信用卡付款或者已经付款却无法正常下 载软件等问题。如果开发者可以承担起这样的职责，用户会将某种程度的感激转嫁为对产品的信任和支持，转而提供良好的口碑效应。相反，如果忽视这样问题的存 在，由于用户选择你的产品而发生的问题无法得到解决，那么会直接将问题转化成对产品和开发者的不信任。此前有人手机应用软件经济模式总结了一种比较简单的 成功法则：（好主意+ 有利抢占市场的时机 = 完美的销量） 这的确是可以第一时间赢得用户青睐的方法。但是如果想建立稳定的销售增长曲线，那么还需要结合以上论述的内容，为用户处理一系列与产品相关的问题。
]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-707" title="sell-your-apps-in-serious-volume" src="http://www.androidres.com/wp-content/uploads/2009/12/sell-your-apps-in-serious-volume.jpg" alt="sell-your-apps-in-serious-volume" width="530" height="222" /></p>
<p>曾经的ADC01举办之初，像我这样的老百姓对这项技术还处于无知状态。但凭借对Iphone的了解以及革命性的App Store，以至于当得知Android和它所肩负使命时，身体里流淌的血液便开始加速，筐唧筐唧往脑子里灌。如今ADC第二春已经落下帷幕，再一次对那 些构思巧妙的设计发出赞叹，大部分的成功作品都更加贴近生活，以至于平时我们不太注意的小细节，经过一番整理便可以成为手机上革命性的创新。“<strong>天下难事必做于易，天下大事必做于细</strong>” （什么？你第一次听说啊？那请您拜读一下《沃尔玛不败之谜》）。</p>
<p>从AndroidTapp.com看到一篇关于<a target="_blank" id="zk7i" title="提高Android软件开发质量的总结" href="http://www.androidtapp.com/10-user-experience-tips-for-successful-android-apps/" target="_blank">提高Android软件开发质量的总结</a>，完全立足于用户的视角创建更加人性化的应用软件。AR对这篇文章的某些相关联的观点加以合并，增加和扩展了某些较重要的内容。如果你有更好的建议，希望可以通过提交Comments的方式与大家共享！<span id="more-706"></span></p>
<h2><strong>尊重用户对当前软件的绝对控制权</strong></h2>
<p>大部分人都有过被“流氓”软件骚扰的经历，其主要特点体现在如下几个特征：</p>
<ul>
<li>在用户不知情的前提下强制安装。</li>
<li>无法轻易移除</li>
<li>盗取用户资料</li>
</ul>
<p>尽管Android平台有着严密的安全体系，但依然无法避免某些新形势的恶意行为。之所以将这条法则放在第一个位置，完全是为了呼吁开发者善待用户对手机应 用市场的信任，同时更要齐心合力维护赖以生存的生命之泉。让用户轻松体验软件带来便利和快乐的同时，更需要确保他们具备自由选择的权利。当软件正常运行或 者正处于任务的处理状态时，允许随时便捷的终止、退出或者登出当前应用程序的操作。</p>
<h2><strong>善待用户的可存储资源（SD Card &amp; Internal Memory）</strong></h2>
<p>很多开发者常常出于便捷的考虑，直接将大量临时性或者一些初始化数据存储于手机的内置存储单元。这对于某些配置较低的手机，简直是一场灾难。建议在 存储数据之前先检测当前SD-Card的可用性。如果出现没有SD-Card或者其存储区域已满时，则可以考虑利用网络存储资源（受限于当前网络连接状 态）。如果处于“墙内”或者无法获得网络服务，那么不得不考虑依赖于内置的存储单元，但是需要尽可能优化数据量，确保资源的有效利用。</p>
<p>在软件设置菜单中预置清除数据功能，允许用户手动清除缓存或者移除所有与当前程序相关联的数据，</p>
<h2><strong>自定义更新周期</strong></h2>
<p>在软件设置菜单中增加修改更新周期的功能，允许<a href="http://www.androidres.com/index.php/2009/12/05/10-user-experience-tips-for-successful-android-apps/" target="_blank">用户</a>根据当前需要选择恰当的周期。如果周期设置较短，不但影响到系统性能的表现力，而且会缩短电力的续航时 间。对于开发者而言，需要严格控制版本号，针对一批修改做统一更新，而不要频繁的更新某些局部细微改动（出现致命缺陷的情况除外）。</p>
<h2><strong>完整的功能描述和详实的更新日志</strong></h2>
<p>建议具备一定条件的开发者可以考虑为不同的应用软件或游戏创建独立的网站（或者将多个软件存放在同一个网站的不同页面中维护和管理）。这 样有助于用户可以第一时间了解应用程序的完整介绍，包括可能修改用户手机设置的明确说明（是否增加后台进程等&#8230;）。另外每次版本更新的详细信息需要保 持与软件更新同步：</p>
<ul>
<li>修复了什么缺陷？</li>
<li>当前版本添加了哪些新功能？</li>
<li>下一版本可能会实现哪些值得期待的功能？</li>
</ul>
<p>这样做的好处不需要过多介绍。难道你不希望了解当前手机软件的更新都做了哪些修改吗？另外，作为一个实时的反馈平台，可以及时的了解到当前用户遇到的疑问和收集非常有价值的建设性意见。</p>
<h2><strong>搭建漂亮的门面</strong></h2>
<p>赏心悦目的操作界面总是可以第一时间俘获用户的心。从恰当合理的色彩搭配到摆放和组织界面元素，其任何环节都直接影响产品的质量。大街上花枝招展的个性人 类，绝对可以毫不留情的吸引住你的眼球，但你真的有勇气和他对视吗？摆放错位的汽车堵在胡同里，你是否有强烈的正义感涌上心头呢？没错，视觉会对人的情绪 产生非常深远的影响。当无法通过视觉测试的食物，估计很难送到嘴里（饥饿状态除外）。对于要求苛刻的用户而言，其很难忍受手机主菜单中存在破坏和谐气氛的 Icons。所以对于呕心沥血之作，在保证后台可以高效运作的前提下，非常有必要装备一整套体面的行头。</p>
<h2><strong>清晰流畅的操作流程</strong></h2>
<p>如果将应用软件的内容比作为整个系统的功能器官，那么导航系统可以看做为大脑，它的意义在于“思考”如何调配当前系统资源。堵塞或者混乱的大脑无法高效的 提供准确内容，一旦内容无法被用到，其存在的意义等价于零。在设计软件功能导航时，可以考虑遵循大众普遍习惯的操作方式，确保某些常用功能的摆放位置和顺 序（千万不要在这里体现另类的<a href="http://www.androidres.com/index.php/2009/12/05/10-user-experience-tips-for-successful-android-apps/">个性</a>，否则会酿成惨剧）。然而这样也并不是最稳妥的办法，针对不同情况需要考虑复杂的地域差异。巧妙的根据功能性分类，并使 用具有组织和约束功能的Views元素加以区分等。</p>
<h2><strong>基于缺乏耐心的用户为考量来设计和优化</strong></h2>
<p>凡事如果以最坏的情况来考虑，必定可以再市场的角逐中获得更多人的青睐。根据此前一些抽样数据的统计，手机软件的群体中有相当一部分人对事物缺乏耐心，尤 其是面对狭小屏幕所反映出的压抑情绪会加大对某些设计蹩脚的应用程序的厌烦感。针对硬件条件的限制，尽管暂时很难直接给用户带来与桌面应用程序痛快淋漓的 体验，但至少可以对某些软件做出操作流程上的优化，已达到简便和更加容易使用。由于具体的要求存在多样性，所以无法客观的给出统一的量化标准，但作为开发 者需要时刻提醒自己对这个问题的关注。</p>
<h2><strong>避免处于<a target="_blank" id="p3_i" title="BP" href="http://developer.android.com/guide/topics/fundamentals.html" target="_blank">BP</a>状态的Activities依然频繁占用系统资源</strong></h2>
<p><a target="_blank" id="n7.8" title="Background processes" href="http://developer.android.com/guide/topics/fundamentals.html" target="_blank">Background processes</a>被官方直接定义为：<a target="_blank" id="xzbe" title="onStop()" href="http://developer.android.com/reference/android/app/Activity.html#onStop%28%29" target="_blank">onStop()</a>方 法已经被调用、并对当前用户处于不可见状态的Activities。开发者根据应用程序的需求慎重考量是否一定有必要保证处于BP状态的 Activities仍然需要处理各种数据，以至于频繁占用过多的网络和计算资源。手机用户普遍非常在意系统的执行效率，有时宁愿放弃某些功能以保证当前 系统的可持续高效的处理任何请求。</p>
<h2><strong>需要将用户服务的因素绑定在完整的技术支持体系中</strong></h2>
<p>自由<a href="http://www.androidres.com/index.php/2009/12/05/10-user-experience-tips-for-successful-android-apps/">开发者</a>在Android Market从事商业行为时，往往都非常看重为用户提供完善的技术支持，以期待得到比较好的口碑和保证软件销量持续增长。但是这里所提到的另外一种用户服 务不同于技术支持，它更倾向于是Android Market应该提供的一种用户保障体系。然而目前Google在这方面缺乏完整的解决方法，不得不由开发者面对诸如信用卡付款或者已经付款却无法正常下 载软件等问题。如果开发者可以承担起这样的职责，用户会将某种程度的感激转嫁为对产品的信任和支持，转而提供良好的口碑效应。相反，如果忽视这样问题的存 在，由于用户选择你的产品而发生的问题无法得到解决，那么会直接将问题转化成对产品和开发者的不信任。此前有人手机应用软件经济模式总结了一种比较简单的 成功法则：（好主意+ 有利抢占市场的时机 = 完美的销量） 这的确是可以第一时间赢得用户青睐的方法。但是如果想建立稳定的销售增长曲线，那么还需要结合以上论述的内容，为用户处理一系列与产品相关的问题。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.androidres.com/index.php/2009/12/05/10-user-experience-tips-for-successful-android-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>利用Intents实现软件的开放接口</title>
		<link>http://www.androidres.com/index.php/2009/11/29/integrating-application-with-intents/</link>
		<comments>http://www.androidres.com/index.php/2009/11/29/integrating-application-with-intents/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 04:53:14 +0000</pubDate>
		<dc:creator>EGGer</dc:creator>
				<category><![CDATA[Resource]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Intent]]></category>

		<guid isPermaLink="false">http://www.androidres.com/?p=697</guid>
		<description><![CDATA[
今年九月份的统计数据显示，目前在Android Market中已经有超过10K的Softwares和Games提供给Android手机用户下载。一些曾经在IPhone APP Store创下辉煌战绩的Applications已经开始集体移植到这个拥有巨大潜力的平台。官方第二届Android Development Challenge（简称:ADC2）已经进入到了最后评审阶段，据称这次拥有大量惊奇创新的应用软件，AR会针对排名靠前的一些软件和游戏提供比较详细的技术剖析，希望大家保持关注。今天要说的内容与创新无关，主要是讲解如何将现有功能互补的软件通过Intents无 缝整合，使其最大限度的提高用户体验（不同的软件之间相互协调，不但可以达到优势互补的目的，而且通过相互间的合作可以在某个领域创造出相对完整的应用体 验）。手机用户尤其厌烦手动输入大量信息（奥巴马曾对外界声称自己不使用Twitter的理由是不想忍受用手机输入信息的痛苦感受），所以这样的整合可以 促成多方软件协同工作的“共赢”局面。而在这其中起到绝对关键性的技术因素是利用了Android平台最独特和最优雅的“Intent机 制”，平凡的岗位创造出不平凡的“成就”。为此，大家需要多多留意那些看似微小的事物，往往越是简单的东西越容易改变这个世界。下面引述一个例子来形象展现这项应用所带来的好处：正在使用WHERE和GoodFood的用户可以基于当前数据直接快速利用OpenTable程序完成订餐服务，整个过程避免对 某些已经存在信息的重复调用。
名词解释：

OpenTable（用户可以指定特定的区域，搜索符合用餐时间和用餐人数的餐馆，并将其标注在地图上）


Where（基于精确地理位置的本地化信息检索工具，例如：哪里的汽油最便宜，路况信息和距离最近的咖啡店等等）


uLocate （与Where出自同一个公司，同样也是利用地理位置信息，提供一个完整的沟通服务平台）

发挥Intent整合优势的准备工作
首先第一个步骤是需要设计使用的Intent接口（或者API）。例如：OpenTable开放了可供使用的公共RESERVE Intent ，利用特定的参数通过URI传递给处理预约申请的Activities（包括地点、时间和人数等基本要求）下面是一个简单的例子：
startActivity(new Intent("com.opentable.action.RESERVE",
Uri.parse("reserve://opentable.com/2947?partySize=3")));
我们的目的是创建一个可供其他开发者容易理解和应用简单的开放接口，而这完全取决于如何定义Action和Uri的样式。那么问题来了：什么样才算得上是比较理想的开放接口呢？

首先考虑如何定义合适的Action。如果应用程序仅仅是在常规状态下被调用，一般比较好的方法是直接采用系统提供的标准。针对有特殊要求的应用，则需要采 用自定义的Action，从而更加准确的提供局部应用支持（局部应用的含义：Application包括多个Activities，通常仅仅是一个或者一 小部分Activities通过开放的接口被外部的其它应用程序调用）。自定义Action需要符合Android平台的命名规 范：&#60;package-name&#62;.action.&#60;action-name&#62;。因为考虑到Action完全是String格 式，所以需要特别强调Namespace的重要性。（在本文提供的例子中将Action定义 为：&#8221;com.opentable.action.RESERVE&#8221;）
其次考虑外部接口程序根据特定的需求初始化数据。Android平台提供了Bundle（mapping：通过String索引相匹配的数据）用于传递简单或者复杂的数据。在本文的例子中采用了另外一种较灵活的方式，将参数直接捆绑在Uri中（&#8221;reserve://opentable.com/2947?partySize=3&#8220;）。应用&#8221;reserve://&#8221;字头的目的是为了匹配我们所定义的Action（android:scheme），&#8221;opentable.com&#8221;可以理解为作用域（android:host），前两者将用来在AndroidManifest.xml中声明&#60;data /&#62; （&#60;data android:scheme=&#8221;reserve&#8221; android:host=&#8221;opentable.com&#8221;/&#62;）。最后2947和partySize分别代表了餐馆ID和限定用餐人数。

Exposing 在系统中注册Intents
前面已经创建了Intent的内容。当条件满足时，系统将负责启动匹配Intent的应用程序(例子中所指：OpenTable)。为了让系统认识这位 “新朋友”(Intent)，需要在&#60;Intent-filter&#62;标签中根据Intent的内容修改&#60;action&#62; 和&#60;category&#62;的属性，并根据Uri的描述创建一个&#60;data&#62;新标签：（以上设置都被包含在AndroidManifest.xml中）


...





...


如果程序中包含有多个开放的接口，那么可以根据上面的方法对每个Activity中的intent-filter根据需要修改成可以容易被外部直接调用的开放接口。在本文的例子中仅仅是修改了负责Reservation的Activity。Category设置成DEFAULT的 目的是为了保证当前Application可以直接被使用，而不会出现供用户选择启动程序的对话框，然而前提条件是保证这个Action在当前系统中的唯 一性，避免出现相同的Action同样以&#8221;DEFAULT&#8221;属性出现在不同的Activities中。&#60;data&#62;标签没有直接列出Uri中 提供的参数名称，在下面的小节中将讲解从Uri中解析参数值的方法。同时对于某些隐性的设置，有必要通过文档的方式让其它开发者能清楚的了解参数传递的标准。
Processing 处理调用请求
下面是OpenTable中负责处理Servation的Activity解析Intent中的参数和做出回应的主要部分：
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
    final Uri uri;
    final int restaurantId;
    try {
    [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="size-full wp-image-702 alignnone" title="Integrating application with intents" src="http://www.androidres.com/wp-content/uploads/2009/11/intents.jpg" alt="Integrating application with intents" width="530" height="303" /></p>
<p style="text-align: left;">今年九月份的统计数据显示，目前在<a target="_blank" href="http://www.android.com/market/" target="_blank">Android Market</a>中已经有超过10K的Softwares和Games提供给Android手机用户下载。一些曾经在IPhone APP Store创下辉煌战绩的Applications已经开始集体移植到这个拥有巨大潜力的平台。官方第二届<a target="_blank" id="za-c" title="Android Development Challenge" href="../index.php/2009/08/26/adc2-submission-opening/" target="_blank">Android Development Challenge</a>（简称:<a target="_blank" id="sqov" title="ADC2" href="../index.php/2009/08/26/adc2-submission-opening/" target="_blank">ADC2</a>）已经进入到了最后评审阶段，据称这次拥有大量惊奇创新的应用软件，AR会针对排名靠前的一些软件和游戏提供比较详细的技术剖析，希望大家保持<a target="_blank" id="rws3" title="关注" href="http://feeds2.feedburner.com/AndroidResource" target="_blank">关注</a>。今天要说的内容与创新无关，主要是讲解如何将现有功能互补的软件通过<a target="_blank" id="iv38" title="Intents" href="http://developer.android.com/reference/android/content/Intent.html" target="_blank">Intents</a>无 缝整合，使其最大限度的提高用户体验（不同的软件之间相互协调，不但可以达到优势互补的目的，而且通过相互间的合作可以在某个领域创造出相对完整的应用体 验）。<span id="more-697"></span>手机用户尤其厌烦手动输入大量信息（奥巴马曾对外界声称自己不使用<a target="_blank" href="http://www.twitter.com" target="_blank">Twitter</a>的理由是不想忍受用手机输入信息的痛苦感受），所以这样的整合可以 促成多方软件协同工作的“共赢”局面。而在这其中起到绝对关键性的技术因素是利用了Android平台最独特和最优雅的“<a target="_blank" id="d838" title="Intents" href="http://developer.android.com/reference/android/content/Intent.html" target="_blank">Intent</a>机 制”，平凡的岗位创造出不平凡的“成就”。为此，大家需要多多留意那些看似微小的事物，往往越是简单的东西越容易改变这个世界。下面引述一个例子来形象展现这项应用所带来的好处：正在使用WHERE和GoodFood的用户可以基于当前数据直接快速利用OpenTable程序完成订餐服务，整个过程避免对 某些已经存在信息的重复调用。</p>
<p><strong>名词解释：</strong></p>
<ul>
<li><a target="_blank" id="e56x" title="OpenTable" href="http://blog.opentable.com/2009/opentable-for-android-now-available/" target="_blank">OpenTable</a>（用户可以指定特定的区域，搜索符合用餐时间和用餐人数的餐馆，并将其标注在地图上）</li>
</ul>
<ul>
<li><a target="_blank" id="uosm" title="uLocate" href="http://www.where.com/" target="_blank">Where</a>（基于精确地理位置的本地化信息检索工具，例如：哪里的汽油最便宜，路况信息和距离最近的咖啡店等等）</li>
</ul>
<ul>
<li><a target="_blank" id="ffhu" title="uLocate" href="http://www.ulocate.com/" target="_blank">uLocate</a> （与Where出自同一个公司，同样也是利用地理位置信息，提供一个完整的沟通服务平台）</li>
</ul>
<h2>发挥Intent整合优势的准备工作</h2>
<p style="text-align: left;">首先第一个步骤是需要设计使用的<a target="_blank" id="gmsk" title="Intents" href="http://developer.android.com/reference/android/content/Intent.html" target="_blank">Intent</a>接口（或者API）。例如：OpenTable开放了可供使用的公共RESERVE <a target="_blank" id="afu1" title="Intents" href="http://developer.android.com/reference/android/content/Intent.html" target="_blank">Intent</a> ，利用特定的参数通过URI传递给处理预约申请的Activities（包括地点、时间和人数等基本要求）下面是一个简单的例子：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">startActivity(new Intent("com.opentable.action.RESERVE",
Uri.parse("reserve://opentable.com/2947?partySize=3")));</pre>
<p style="text-align: left;">我们的目的是创建一个可供其他开发者容易理解和应用简单的开放接口，而这完全取决于如何定义Action和Uri的样式。那么问题来了：什么样才算得上是比较理想的开放接口呢？</p>
<ul>
<li style="text-align: left;">首先考虑如何定义合适的Action。如果应用程序仅仅是在常规状态下被调用，一般比较好的方法是直接采用<a href="http://www.androidres.com/index.php/2009/11/29/integrating-application-with-intents/">系统</a>提供的标准。针对有特殊要求的应用，则需要采 用自定义的Action，从而更加准确的提供局部应用支持（局部应用的含义：Application包括多个Activities，通常仅仅是一个或者一 小部分Activities通过开放的接口被外部的其它应用程序调用）。自定义Action需要符合Android平台的命名规 范：&lt;package-name&gt;.action.&lt;action-name&gt;。因为考虑到Action完全是String格 式，所以需要特别强调Namespace的重要性。（在本文提供的例子中将Action定义 为：&#8221;com.opentable.action.RESERVE&#8221;）</li>
<li style="text-align: left;">其次考虑外部接口程序根据特定的需求初始化数据。Android平台提供了<a target="_blank" href="http://developer.android.com/reference/android/os/Bundle.html">Bundle</a>（mapping：通过<a target="_blank" href="http://www.androidres.com/index.php/2009/11/29/integrating-application-with-intents/">String</a>索引相匹配的数据）用于传递简单或者复杂的数据。在本文的例子中采用了另外一种较灵活的方式，将参数直接捆绑在Uri中（&#8221;<span style="font-family: Courier New;">reserve://opentable.com/2947?partySize=3</span>&#8220;）。应用&#8221;reserve://&#8221;字头的目的是为了匹配我们所定义的Action（<span style="font-family: Courier New;">android:scheme</span>），&#8221;opentable.com&#8221;可以理解为作用域（<span style="font-family: Courier New;">android:host</span>），前两者将用来在<a href="http://developer.android.com/guide/topics/manifest/manifest-intro.html">AndroidManifest.xml</a>中声明&lt;data /&gt; （<span style="font-family: Courier New;">&lt;data android:scheme=&#8221;reserve&#8221; android:host=&#8221;opentable.com&#8221;/&gt;</span>）。最后2947和partySize分别代表了餐馆ID和限定用餐人数。</li>
</ul>
<h2>Exposing 在系统中注册Intents</h2>
<p style="text-align: left;">前面已经创建了Intent的内容。当条件满足时，系统将负责启动匹配Intent的应用程序(例子中所指：OpenTable)。为了让系统认识这位 “新朋友”(Intent)，需要在&lt;Intent-filter&gt;标签中根据Intent的内容修改&lt;action&gt; 和&lt;category&gt;的属性，并根据Uri的描述创建一个&lt;data&gt;新标签：（以上设置都被包含在<a target="_blank" href="http://developer.android.com/guide/topics/manifest/manifest-intro.html">AndroidManifest.xml</a>中）</p>
<pre lang="xml" line="n">
<activity android:name=".activity.Splash" ... >
...
<intent-filter>
<action android:name="com.opentable.action.RESERVE"/>
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="reserve" android:host="opentable.com"/>
</intent-filter>
...
</activity>
</pre>
<p style="text-align: left;"><span style="font-family: Courier New;">如果程序中包含有多个开放的接口，那么可以根据上面的方法对每个Activity中的<a target="_blank" id="xkac" title="intent-filter" href="http://developer.android.com/guide/topics/manifest/intent-filter-element.html" target="_blank">intent-filter</a>根据需要修改成可以容易被外部直接<a target="_blank" href="http://www.androidres.com/index.php/2009/11/29/integrating-application-with-intents/">调用</a>的开放接口。在本文的例子中仅仅是修改了负责</span>Reservation的Activity<span style="font-family: Courier New;">。Category设置成</span><a href="http://developer.android.com/reference/android/content/Intent.html#CATEGORY_DEFAULT">DEFAULT</a><span style="font-family: Courier New;">的 目的是为了保证当前Application可以直接被使用，而不会出现供用户选择启动程序的对话框，然而前提条件是保证这个Action在当前系统中的唯 一性，避免出现相同的Action同样以&#8221;DEFAULT&#8221;属性出现在不同的Activities中。&lt;data&gt;标签没有直接列出Uri中 提供的参数名称，在下面的小节中将讲解从Uri中解析参数值的方法。同时对于某些隐性的设置，有必要通过文档的方式让其它开发者能清楚的了解参数传递的标准。</span></p>
<h2>Processing 处理调用请求</h2>
<p>下面是OpenTable中负责处理Servation的Activity解析Intent中的参数和做出回应的主要部分：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
    final Uri uri;
    final int restaurantId;
    try {
        uri = getIntent().getData();
        restaurantId = Integer.parseInt( uri.getPathSegments().get(0));
    } catch(Exception e) {
        // Restaurant ID is required
        Log.e(e);
        startActivity( FindTable.start(FindTablePublic.this));
        finish();
        return;
    }
    final String partySize = uri.getQueryParameter("partySize");
    ...
}</pre>
<p style="text-align: left;"><span style="font-family: Courier New;">定义两个final的成员变量（<a target="_blank" id="d82o" title="final" href="http://www.codeguru.com/java/tij/tij0071.shtml" target="_blank">final</a>：表明变量仅可以被赋值一次）“uir”和“restaurantId”，分别用于存储Uri字符串和餐馆ID。<br />
</span></p>
<ul>
<li style="text-align: left;"><span style="font-family: Courier New;">getIntent().<a target="_blank" id="uaz5" title="getData" href="http://developer.android.com/reference/android/content/Intent.html#getData%28%29" target="_blank">getData</a>()可以返回当前Intent中包含的Uri。</span></li>
<li style="text-align: left;"><span style="font-family: Courier New;"><a target="_blank" id="ct1b" title="getPathSegments" href="http://developer.android.com/reference/android/net/Uri.html#getPathSegments%28%29" target="_blank">getPathSegments</a>().get(int index)可以返回索引&lt;index&gt;代表的参数值。</span></li>
<li style="text-align: left;"><span style="font-family: Courier New;"><a target="_blank" id="wzsj" title="getQueryParameter(String Key)" href="http://developer.android.com/reference/android/net/Uri.html#getQueryParameter%28java.lang.String%29" target="_blank">getQueryParameter(String Key)</a>d 这是另外一种获取参数值的方法，适合于Key=Value（例子中：</span><span style="font-family: Courier New;">partySize=3</span><span style="font-family: Courier New;">）。</span></li>
</ul>
<p style="text-align: left;">尽管没有包括完整的代码，但是基本上阐述了如何实现接口的方法。但仅仅实现了基本功能还是远远不够的，一个<a target="_blank" id="svf0" title="健壮的" href="http://nob.cs.ucdavis.edu/bishop/secprog/robust.html" target="_blank">健壮的</a>应 用程序需要考虑非常多的复杂情况。利用Intent机制完成某些功能调用的系统，需要特别强调参数的合法性以及如何有效的应对错误信息等。例如：当解析的 Restaurant ID出现问题时，需要提供用户另外一种可以手动输入的方法。 由此需要特别注意：满足常规功能仅是整个开发周期的一部分，另外还需要投入更多的时间处理异常情况。</p>
<h2>优雅的处理一些特殊情况</h2>
<p style="text-align: left;">以下是几种可预见的特殊情况：如何处理客户端没有安装OpenTable？如何处理传递了无效的Restaurant ID？</p>
<table style="height: 75px;" border="1" cellspacing="0" cellpadding="3" width="503" bordercolor="#000000">
<tbody>
<tr>
<td style="text-align: left;" width="33%"><span style="font-size: xx-small;"><br />
</span></td>
<td style="text-align: left;" width="33%"><span style="font-size: xx-small;"><strong>Restaurant ID known</strong></span></td>
<td style="text-align: left;" width="33%"><span style="font-size: xx-small;"><strong>Restaurant ID unknown</strong></span></td>
</tr>
<tr>
<td style="text-align: left;" width="33%"><span style="font-size: xx-small;"><strong>User has OpenTable</strong></span></td>
<td style="text-align: left;" width="33%"><span style="font-size: xx-small;">Call OpenTable Intent</span></td>
<td style="text-align: left;" width="33%"><span style="font-size: xx-small;">Don&#8217;t show reserve button</span></td>
</tr>
<tr>
<td style="text-align: left;" width="33%"><span style="font-size: xx-small;"><strong>User doesn&#8217;t have OpenTable</strong></span></td>
<td style="text-align: left;" width="33%"><span style="font-size: xx-small;">Call Market Intent</span></td>
<td style="text-align: left;" width="33%"><span style="font-size: xx-small;">Don&#8217;t show reserve button</span></td>
</tr>
</tbody>
</table>
<p style="text-align: left;">下面的代码提供了处理当前上面特殊情况的方法：1)如果当前传递的Restaurant ID无效，那么Opentable按钮将设为不可用状态。2）如果当前客户端没有安装Opentable，那么将Intent切换为Market，并自动转为Opentable下载界面。</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">// setup the Intent to call OpenTable
Uri reserveUri = Uri.parse(String.format( "reserve://opentable.com/%s?refId=5449",
opentableId));
Intent opentableIntent = new Intent("com.opentable.action.RESERVE", reserveUri);

// setup the Intent to deep link into Android Market
Uri marketUri = Uri.parse("market://search?q=pname:com.opentable");
Intent marketIntent = new Intent(Intent.ACTION_VIEW).setData(marketUri);

opentableButton.setVisibility(opentableId &gt; 0 ? View.VISIBLE : View.GONE);
opentableButton.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v) {
        PackageManager pm = getPackageManager();
        startActivity(pm.queryIntentActivities(opentableIntent, 0).size() == 0 ? opentableIntent : marketIntent);
   }
});
}</pre>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-703" style="border: 3px solid #e6e6e6;" title="goodFood" src="http://www.androidres.com/wp-content/uploads/2009/11/cdpg6jh8_207x8wg5ch_b.png" alt="cdpg6jh8_207x8wg5ch_b" width="320" height="480" /></p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-704" style="border: 3px solid #e6e6e6;" title="openTable" src="http://www.androidres.com/wp-content/uploads/2009/11/cdpg6jh8_21cgpsdqcz_b.png" alt="openTable" width="320" height="480" /></p>
<h2>公布当前Application开放接口的应用标准</h2>
<p style="text-align: left;">到目前与技术相关的内容已经完成。还剩下最后一步，同时也是最重要的环节。必须让其他开发者了解开放接口的使用方法，否则前面的努力都将变得毫无价值。其中最简单的方式是将使用文档发布在网站上供其他开发者查阅，而且建议文档中带有较全面的实例。</p>
<p style="text-align: left;"><a target="_blank" href="http://feedproxy.google.com/~r/blogspot/hsDu/~3/6U7Eycxrq7o/integrating-application-with-intents.html" target="_blank">访问官方博客原文</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.androidres.com/index.php/2009/11/29/integrating-application-with-intents/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google创造 “GO” 文明</title>
		<link>http://www.androidres.com/index.php/2009/11/15/google-go-programming-language/</link>
		<comments>http://www.androidres.com/index.php/2009/11/15/google-go-programming-language/#comments</comments>
		<pubDate>Sat, 14 Nov 2009 20:46:51 +0000</pubDate>
		<dc:creator>EGGer</dc:creator>
				<category><![CDATA[Essay]]></category>
		<category><![CDATA[Concurrency]]></category>
		<category><![CDATA[Garbage Collection]]></category>
		<category><![CDATA[GO Programming language]]></category>
		<category><![CDATA[Parallel Computing]]></category>

		<guid isPermaLink="false">http://www.androidres.com/?p=690</guid>
		<description><![CDATA[
“如果想成就一个辉煌的&#8217;文明&#8217;，首先需要创造一种强大和健壮的语言”
创造出一种更加高效的方法来诠释整个物质世界，Google帝国迈出了最重要的一步。人类发展过程中总是要经历大大小小不同的变革，计算机世界更是如此，而且其变革的速度远远快过于其它任何发展中的事物。暂时无法量化这种新的编程语言会对整个行业带来的变化，但至少有一点可以肯定，&#8221;Go&#8221; 的特性将加速整个计算机工业的发展进程。或许可以让我们这一代人将更多的梦想变为现实。
高度关注Google产品的人会感悟到其简单的哲学理念 &#8220;Efficiency&#8221; ，正是秉持这样的精神，才使得我们完全可以在毫秒间搜遍整个人类文明、体验前所未有的电子邮件服务 &#8220;Gmail&#8221;或者革命性的沟通工具 &#8220;Google Wave&#8221; 等等&#8230;
为了符合日益高效的生活节奏，Google在2009年11月份正式对外宣布 带给这个世界另外一个惊喜 &#8211; &#8220;Go&#8220;。 其主要的特点是将动态语言（例如：Python）的高效开发特性与编译语言（例如：C/C++）的安全特点相结合，同时还支持当前比较热门的技术 garbage collected和concurrent ，Google的同事们在当前的条件下正努力的创造一款近乎完美的语言。
HighLight:

高效的静态类型编译语言 + 轻松灵活编程的动态语言
类型安全（Type Safe）+ 内存安全（Memory Safe）
较好的支持并行和线程间通讯
高效和无延迟的Garbage Collection
较高的编译速度

与此同时还存在一个同名的GO programming languag的，从维基百科中了解到其最早的记录时间是2003年，由两个人共同创建Francis McCabe, Keith Clark。今天暂且不去讨论这两个同名语言的争议话题（其维基百科的页面已经发出删除通知，特将以下截图作为一个纪念，目前这两个同名的语言其在Wikipedia的链接仅仅是相差一个&#8221;!&#8221;符号。）

Go语言本质上属于C家族的分支，很大程度上仍然保留着C的特点。Google开发小组对声明语法（Declaration Syntax）上作出了较大的改进，其目的是为了实现更高效的语义分析和摒弃利用符号表（Symbol Table）解析的模式。从而更加容易开发辅助工具，例如：Debuggers、dependency analyzers（从属分析）和自动文档提取器等&#8230; ，鉴于这个原因对于C或其它分支在实现上相对难度较大。刚刚接触Go的开发者即便是有过C语言的开发经验，但依然有必要对Go的语法重新做一次完整的了解。
一直以来，系统编程语言较少提供对诸如：垃圾回收（Garbage Collection）和并行计算（Parallel computing）的支持。
Garbage Collection是一种不需要人为干预的动态内存管理机制，其可以自动清除应用程序遗留在内存中的废弃资源（有一篇详细介绍Garbage Collection历史的文章发表于 2004年第二期的《CSDN开发高手》，通过它可以简单了解Garbage Collection发展的历史）。尽管这项技术在最近一段时间内有了长足的进步，但是依然有非常多的程序员青睐于手动执行 Free 和 Delete 命令。因为他们担心这项技术会增加系统的负担，这就好比当初放弃高级语言，而执着于直接编写机器语言的虔诚教徒。Go包含了Garbage Collection技术，但Google并没有正面阐明其所采用的技术可以消减人们对于应用它所产生的负面影响，个人感觉它的秘而不宣似乎说明了Google并不完全满意当前的GC处理技术，以后将帮助大家密切留意这方面的动向。
Parallel computing是现阶段热度较高的应用技术，开发基于多核心运行环境的应用程序。目前多核心对于家用PC已经是个非常普遍的现象（Tilera最近刚刚宣布包含100个核心的Cpu）。从Go语言的这个特性上可以反映出Google对这一领域的探索的兴趣。
引用同事的一句评论“Google真的非常清楚我们的需求 ”。目前Go语言仅仅处于测试阶段，Google非常鼓励喜欢尝试新事物的开发者可以亲自体验这种新语言所带来的编程乐趣。到此已不再需要过的正面修饰，有空的时候适当的摆弄摆弄吧。下面使一些代码片段，可以让大家快速了解其真正面貌：
package main

import (
	"os";
	"flag"; // command line option parser
)

var omitNewline = flag.Bool("n", false, "don't [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-692" style="border: 3px solid #e6e6e6;" title="Google Go Programming language" src="http://www.androidres.com/wp-content/uploads/2009/11/tiangongkaiwu.jpg" alt="Google Go Programming language" width="530" height="248" /></p>
<p><strong>“如果想成就一个辉煌的&#8217;文明&#8217;，首先需要创造一种强大和健壮的语言”</strong></p>
<p style="text-align: left;">创造出一种更加高效的方法来诠释整个物质世界，<a target="_blank" href="http://googleblog.blogspot.com/" target="_blank">Google</a>帝国迈出了最重要的一步。人类发展过程中总是要经历大大小小不同的变革，计算机世界更是如此，而且其变革的速度远远快过于其它任何发展中的事物。暂时无法量化这种新的编程语言会对整个行业带来的变化，但至少有一点可以肯定，&#8221;<a target="_blank" href="http://en.wikipedia.org/wiki/Go_%28programming_language%29" target="_blank">Go</a>&#8221; 的特性将加速整个计算机工业的发展进程。或许可以让我们这一代人将更多的梦想变为现实。<span id="more-690"></span></p>
<p style="text-align: left;">高度关注Google产品的人会感悟到其简单的哲学理念 &#8220;<a target="_blank" href="http://www.androidres.com/index.php/2009/04/04/beyond-life-hacks-reusable-solutions-to-common-productivity-problems/" target="_blank">Efficiency</a>&#8221; ，正是秉持这样的精神，才使得我们完全可以在毫秒间搜遍整个人类文明、体验前所未有的电子邮件服务 &#8220;Gmail&#8221;或者革命性的沟通工具 &#8220;<a href="../index.php/2009/06/03/google-wave/" target="_blank">Google Wave</a>&#8221; <a target="_blank" href="http://www.google.com/intl/en/options/" target="_blank">等等</a>&#8230;</p>
<p style="text-align: left;">为了符合日益高效的生活节奏，Google在2009年11月份正式对外宣布 带给这个世界另外一个惊喜 &#8211; &#8220;<strong>Go</strong>&#8220;。 其主要的特点是将动态语言（例如：Python）的高效开发特性与编译语言（例如：C/C++）的安全特点相结合，同时还支持当前比较热门的技术 <a target="_blank" title="Garbage collection (computer science)" href="http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29">garbage collected</a>和<a target="_blank" href="http://www.google.com/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;ved=0CAgQFjAA&amp;url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FConcurrent_computing&amp;rct=j&amp;q=concurrent++programming+language&amp;ei=Ytz8Sqa8KIrk6gO_kdzmCg&amp;usg=AFQjCNGxQh2O1K1wGIAz-bfvRcaRyTSCGA&amp;sig2=qAl2DN5n-hFc4lfFSXDuZA" target="_blank">concurrent </a>，Google的同事们在当前的条件下正努力的创造一款近乎完美的语言。</p>
<p><strong>HighLight:</strong></p>
<ul>
<li>高效的静态类型编译语言 + 轻松灵活编程的动态语言</li>
<li>类型安全（Type Safe）+ 内存安全（Memory Safe）</li>
<li>较好的支持并行和线程间通讯</li>
<li>高效和无延迟的Garbage Collection</li>
<li>较高的编译速度<!--more--></li>
</ul>
<blockquote><p><span style="color: #7d7d7d;">与此同时还存在一个同名的<a target="_blank" href="http://en.wikipedia.org/wiki/Go%21_%28programming_language%29">GO programming languag</a>的，从维基百科中了解到其最早的记录时间是2003年，由两个人共同创建<a target="_blank" title="Francis McCabe (page does not exist)" href="http://en.wikipedia.org/w/index.php?title=Francis_McCabe&amp;action=edit&amp;redlink=1">Francis McCabe</a>, <a target="_blank" title="Keith Clark" href="http://en.wikipedia.org/wiki/Keith_Clark">Keith Clark</a>。今天暂且不去讨论这两个同名语言的争议话题（其维基百科的页面已经发出删除通知，特将以下截图作为一个纪念，目前这两个同名的语言其在Wikipedia的链接仅仅是相差一个&#8221;!&#8221;符号。）</span></p>
<p><img class="aligncenter size-full wp-image-691" title="go - Francis McCabe - Keith Clark" src="http://www.androidres.com/wp-content/uploads/2009/11/go.jpg" alt="go - Francis McCabe - Keith Clark" width="477" height="504" /></p></blockquote>
<p style="text-align: left;"><a target="_blank" href="http://en.wikipedia.org/wiki/Go_%28programming_language%29" target="_blank">Go</a>语言本质上属于C家族的分支，很大程度上仍然保留着C的特点。Google开发小组对声明语法（Declaration Syntax）上作出了较大的改进，其目的是为了实现更高效的语义分析和摒弃利用符号表（Symbol Table）解析的模式。从而更加容易开发辅助工具，例如：Debuggers、dependency analyzers（从属分析）和自动文档提取器等&#8230; ，鉴于这个原因对于C或其它分支在实现上相对难度较大。刚刚接触Go的开发者即便是有过C语言的开发经验，但依然有必要对Go的语法重新做一次完整的了解。</p>
<p style="text-align: left;">一直以来，系统编程语言较少提供对诸如：垃圾回收（<a target="_blank" title="Garbage collection (computer science)" href="http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29">Garbage Collection</a>）和并行计算（<a target="_blank" href="http://en.wikipedia.org/wiki/Parallel_computation" target="_blank">Parallel computing</a>）的支持。</p>
<p style="text-align: left;"><a target="_blank" title="Garbage collection (computer science)" href="http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29">Garbage Collection</a>是一种不需要人为干预的动态内存管理机制，其可以自动清除应用程序遗留在内存中的废弃资源（有一篇详细介绍<a target="_blank" href="http://www.google.cn/search?hl=zh-CN&amp;newwindow=1&amp;q=%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E8%B6%A3%E5%8F%B2&amp;btnG=Google+%E6%90%9C%E7%B4%A2&amp;aq=f&amp;oq=" target="_blank">Garbage Collection历史</a>的文章发表于 2004年第二期的《CSDN开发高手》，通过它可以简单了解Garbage Collection发展的历史）。尽管这项技术在最近一段时间内有了长足的进步，但是依然有非常多的程序员青睐于手动执行 Free 和 Delete 命令。因为他们担心这项技术会增加系统的负担，这就好比当初放弃高级语言，而执着于直接编写机器语言的虔诚教徒。Go包含了Garbage Collection技术，但<a href="http://www.androidres.com/index.php/2009/11/13/google-go-a-new-programming-language">Google</a>并没有正面阐明其所采用的技术可以消减人们对于应用它所产生的负面影响，个人感觉它的秘而不宣似乎说明了Google并不完全满意当前的GC处理技术，以后将帮助大家密切留意这方面的动向。</p>
<p style="text-align: left;"><a target="_blank" href="http://en.wikipedia.org/wiki/Parallel_computation" target="_blank">Parallel computing</a>是现阶段热度较高的应用技术，开发基于多核心运行环境的应用程序。目前多核心对于家用PC已经是个非常普遍的现象（<a target="_blank" href="http://www.tilera.com/" target="_blank">Tilera</a>最近刚刚<a target="_blank" href="http://www.technewsworld.com/story/68473.html" target="_blank">宣布</a>包含100个核心的Cpu）。从Go语言的这个特性上可以反映出Google对这一领域的探索的兴趣。</p>
<p style="text-align: left;">引用同事的一句评论“<strong>Google真的非常清楚我们的需求</strong> ”。目前Go语言仅仅处于测试阶段，Google非常鼓励喜欢尝试新事物的开发者可以亲自体验这种新语言所带来的编程乐趣。到此已不再需要过的正面修饰，有空的时候适当的摆弄摆弄吧。下面使一些代码片段，可以让大家快速了解其真正面貌：</p>
<pre class="brush: c; smart-tabs: true;toolbar: false" style="text-align: left;">package main

import (
	"os";
	"flag"; // command line option parser
)

var omitNewline = flag.Bool("n", false, "don't print final newline")

const (
	Space = " ";
	Newline = "\n";
)

func main()  {
	flag.Parse(); // Scans the arg list and sets up flags
	var s string = "";
	for i := 0; i &lt; flag.NArg(); i++ {
         if i &gt; 0 {
			s += Space
		}
		s += flag.Arg(i)
	}
	if !*omitNewline {
		s += Newline
	}
	os.Stdout.WriteString(s);
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.androidres.com/index.php/2009/11/15/google-go-programming-language/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>添加Click Listener的简便方法</title>
		<link>http://www.androidres.com/index.php/2009/11/08/easier-click-listeners/</link>
		<comments>http://www.androidres.com/index.php/2009/11/08/easier-click-listeners/#comments</comments>
		<pubDate>Sun, 08 Nov 2009 03:48:10 +0000</pubDate>
		<dc:creator>EGGer</dc:creator>
				<category><![CDATA[Resource]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Button]]></category>
		<category><![CDATA[Click]]></category>
		<category><![CDATA[Listener]]></category>

		<guid isPermaLink="false">http://www.androidres.com/?p=689</guid>
		<description><![CDATA[对于任何一个开发者而言，常常需要为Views元素添加各种 “Listener”，响应用户的各种交互信息。下面的代码对于一般的开发者而言再熟悉不过了，是一种最原始的添加Click listener的方法：
findViewById(R.id.myButton).setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
    // Do stuff
    }
});
下面这个方法较前一种稍微简单了一些，允许多个Buttons共享一个Listener。通过Switch控制对不同Button Click事件的响应方法：
View.OnClickListener handler = View.OnClickListener() {
    public void onClick(View v) {
        switch (v.getId()) {
          [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">对于任何一个开发者而言，常常需要为Views元素添加各种 “<a target="_blank" href="http://developer.android.com/reference/android/view/View.OnClickListener.html" target="_blank">Listener</a>”，响应用户的各种交互信息。下面的代码对于一般的开发者而言再熟悉不过了，是一种最原始的添加<a target="_blank" href="http://developer.android.com/reference/android/view/View.OnClickListener.html" target="_blank">Click listener</a>的方法：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">findViewById(R.id.myButton).setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
    // Do stuff
    }
});</pre>
<p style="text-align: left;">下面这个方法较前一种稍微简单了一些，允许多个Buttons共享一个<a target="_blank" href="http://developer.android.com/reference/android/view/View.OnClickListener.html" target="_blank">Listener</a>。通过<a href="http://www.androidres.com/index.php/2009/11/08/easier-click-listeners/">Switch</a>控制对不同Button Click事件的响应方法：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">View.OnClickListener handler = View.OnClickListener() {
    public void onClick(View v) {
        switch (v.getId()) {
           case R.id.myButton: // doStuff
           break;
           case R.id.myOtherButton: // doStuff
           break;
        }
    }
}</pre>
<p>最后依然需要在程序中调用setOnClickListener()方法为所有的<a target="_blank" href="http://developer.android.com/reference/android/widget/Button.html" target="_blank">Buttons</a>添加公共Listener:</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">findViewById(R.id.myButton).setOnClickListener(handler);
findViewById(R.id.myOtherButton).setOnClickListener(handler);</pre>
<p style="text-align: left;">Android开发小组对上边的方法又做了进一步的改善，从Android 1.6开始将允许开发者直接将Click listener捆绑XML layout中的Views元素。在程序中定义的Listener方法需要带有一个View类型的参数。下面提供了完整的例子来说明：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">class MyActivity extends Activity {
    public void myClickHandler(View target) {
    // Do stuff
    }
}</pre>
<p style="text-align: left;">在XML Layout中将已经声明的Listener函数名赋给Button的onClick属性：</p>
<pre lang="xml" line="n">
<Button android:onClick="myClickHandler" />
</pre>
<p>英文原文： <a target="_blank" href="http://android-developers.blogspot.com/2009/10/ui-framework-changes-in-android-16.html">Android Blog</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.androidres.com/index.php/2009/11/08/easier-click-listeners/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RelativeLayout的缺陷得到修复</title>
		<link>http://www.androidres.com/index.php/2009/11/01/more-flexible-more-robust-relativelayout/</link>
		<comments>http://www.androidres.com/index.php/2009/11/01/more-flexible-more-robust-relativelayout/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 18:18:43 +0000</pubDate>
		<dc:creator>EGGer</dc:creator>
				<category><![CDATA[Documentation]]></category>
		<category><![CDATA[Resource]]></category>
		<category><![CDATA[UI Framework]]></category>
		<category><![CDATA[Bugs]]></category>
		<category><![CDATA[RelativeLayout]]></category>

		<guid isPermaLink="false">http://www.androidres.com/?p=685</guid>
		<description><![CDATA[Android UI toolkit提供了多个Layout类，其中RelativeLayout的强大功能可以满足大多数情况下的需求，同时可以有效的组织和管理程序中包含 的Views。然而，由于存在一些缺陷限制，导致初学者经常会遇到某些奇怪的问题而影响正常的应用。基于这样的问题，Android开发小组重构了 RelativeLayout类。不仅仅除掉了一些零零散散的Bugs，最主要的是修复了一个比较严重的缺陷：Views必须以特定的顺序声明，否则无法 依据属性设置正确显示。下面根据一个具体的例子来了解实际情况：













代码中的RelateiveLayout包含有两个TextView和一个ImageView。从参 数设置来分析ImageView处在TextViews的左边，而两个TextViews则应该是靠左垂直排列。然而，以上的配置却无法在Android 1.5中得到正确的解析，结果如下所示：

问题最主要的原因是由于RelativeLayout处理Views关联是从当前向前查找已经解析的Views，而忽略后边的Views。例如，上个例子 中“band”的位置与“track”相关联，然而“track”是在“band”之后声明。在Android 1.5中，由于RelativeLayout存在缺陷，使得它无法处理这样的问题。值得庆幸的是目前已经修复了这个问题，依然是上边的代码，在 Android 1.6中完全按照正确的逻辑显示Views的位置：

为了帮助Android小组开发更加健壮的程序，提交你发现的缺陷或者Bugs。
]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Android UI toolkit提供了多个Layout类，其中RelativeLayout的强大功能可以满足大多数情况下的需求，同时可以有效的组织和管理程序中包含 的Views。然而，由于存在一些缺陷限制，导致初学者经常会遇到某些奇怪的问题而影响正常的应用。基于这样的问题，Android开发小组重构了 RelativeLayout类。不仅仅除掉了一些零零散散的Bugs，最主要的是修复了一个比较严重的缺陷：Views必须以特定的顺序声明，否则无法 依据属性设置正确显示。下面根据一个具体的例子来了解实际情况：</p>
<pre lang="xml" line="n">
<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="64dip"
android:padding="6dip">

<TextView
android:id="@+id/band"
android:layout_width="fill_parent"
android:layout_height="26dip"

android:layout_below="@+id/track"
android:layout_alignLeft="@id/track"
android:layout_alignParentBottom="true"

android:gravity="top"
android:text="The Airborne Toxic Event" />

<TextView
android:id="@id/track"
android:layout_marginLeft="6dip"
android:layout_width="fill_parent"
android:layout_height="26dip"

android:layout_toRightOf="@+id/artwork"

android:textAppearance="?android:attr/textAppearanceMedium"
android:gravity="bottom"
android:text="Sometime Around Midnight" />

<ImageView
android:id="@id/artwork"
android:layout_width="56dip"
android:layout_height="56dip"
android:layout_gravity="center_vertical"

android:src="@drawable/artwork" />

</RelativeLayout>
</pre>
<p style="text-align: left;">代码中的RelateiveLayout包含有两个TextView和一个ImageView。从参 数设置来分析ImageView处在TextViews的左边，而两个TextViews则应该是靠左垂直排列。然而，以上的配置却无法在Android 1.5中得到正确的解析，结果如下所示：</p>
<p style="text-align: center;"><img class="size-full wp-image-686 alignnone" title="relativelayout 01" src="http://www.androidres.com/wp-content/uploads/2009/11/relativelayout_01.jpg" alt="relativelayout 01" width="320" height="152" /></p>
<p style="text-align: left;">问题最主要的原因是由于RelativeLayout处理Views关联是从当前向前查找已经解析的Views，而忽略后边的Views。例如，上个例子 中“band”的位置与“track”相关联，然而“track”是在“band”之后声明。在Android 1.5中，由于RelativeLayout存在缺陷，使得它无法处理这样的问题。值得庆幸的是目前已经修复了这个问题，依然是上边的代码，在 Android 1.6中完全按照正确的逻辑显示Views的位置：</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-687" title="relativelayout 02" src="http://www.androidres.com/wp-content/uploads/2009/11/relativelayout_02.jpg" alt="relativelayout 02" width="320" height="152" /></p>
<p style="text-align: left;">为了帮助Android小组开发更加健壮的程序，<a target="_blank" id="gjzc" title="提交" href="http://b.android.com/" target="_blank">提交</a>你发现的缺陷或者Bugs。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.androidres.com/index.php/2009/11/01/more-flexible-more-robust-relativelayout/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>给程序添加一个控制WIFI的Switcher</title>
		<link>http://www.androidres.com/index.php/2009/10/22/add-a-wifi-switcher-into-your-application/</link>
		<comments>http://www.androidres.com/index.php/2009/10/22/add-a-wifi-switcher-into-your-application/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 17:10:11 +0000</pubDate>
		<dc:creator>EGGer</dc:creator>
				<category><![CDATA[Resource]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Wifi]]></category>
		<category><![CDATA[WifiManager]]></category>

		<guid isPermaLink="false">http://www.androidres.com/?p=680</guid>
		<description><![CDATA[什么是WIFI？
Wi-Fi（发音为 /&#8217;waɪfaɪ/）是一個無線網路通信技術的品牌，由Wi-Fi聯盟（Wi-Fi Alliance）所持有，使用在经验证的基于IEEE 802.11标准的产品上，目的是改善基於IEEE 802.11標準的無線網路產品之間的互通性(查看完整内容:维基百科)。
現時一般人會把Wi-Fi及IEEE 802.11混為一談。甚至把Wi-Fi等同于無線互聯網。
Wi-Fi聯盟成立于1999年，當時的名稱叫做Wireless Ethernet Compatibility Alliance (WECA)。在2002年10月，正式改名為Wi-Fi Alliance
作为手机平台应用最广泛的一种无限网络协议（中国受限），其在地球上的覆盖面积达到了惊人的程度（结论凭主观判断，目前还没有确切的数据来源）。此前有文章讨论“如何检测当前区域内可用的网络资源？” ，下面将围绕网络应用的话题介绍与WIFI应用开发的一些方法。
首先，需要在Manifest中添加如下permissions：









其次，在调用的函数中声明一个WIFIManager实体：
private WifiManager wifiManager;
...
@Override
public void onCreate...
       wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
然后通过WIFIManager所提供的方法处理各种与WIFI相关的应用：

检测当前网络信号质量：static                          int calculateSignalLevel(int rssi, int [...]]]></description>
			<content:encoded><![CDATA[<p><strong>什么是WIFI？</strong></p>
<blockquote><p><strong><img class="alignleft size-medium wp-image-681" title="Wifi-android" src="http://www.androidres.com/wp-content/uploads/2009/10/Wifi_logo-150x67.gif" alt="Wifi-android" width="150" height="67" />Wi-Fi</strong>（发音为 <span title="在国际音标（IPA）中的读音">/&#8217;waɪfaɪ/</span>）是一個無線網路通信技術的品牌，由Wi-Fi聯盟（Wi-Fi Alliance）所持有，使用在经验证的基于<a target="_blank" title="IEEE 802.11" href="http://zh.wikipedia.org/wiki/IEEE_802.11">IEEE 802.11</a>标准的产品上，目的是改善基於IEEE 802.11標準的無線網路產品之間的互通性(<a target="_blank" title="IEEE 802.11" href="http://zh.wikipedia.org/wiki/Wi-Fi">查看完整内容:维基百科</a>)。</p>
<p>現時一般人會把Wi-Fi及<a target="_blank" title="IEEE 802.11" href="http://zh.wikipedia.org/wiki/IEEE_802.11">IEEE 802.11</a>混為一談。甚至把Wi-Fi等同于無線<a target="_blank" title="互聯網" href="http://zh.wikipedia.org/wiki/%E4%BA%92%E8%81%AF%E7%B6%B2">互聯網</a>。</p>
<p>Wi-Fi聯盟成立于<a target="_blank" title="1999年" href="http://zh.wikipedia.org/wiki/1999%E5%B9%B4">1999年</a>，當時的名稱叫做Wireless Ethernet Compatibility Alliance (WECA)。在<a target="_blank" title="2002年" href="http://zh.wikipedia.org/wiki/2002%E5%B9%B4">2002年</a>10月，正式改名為Wi-Fi Alliance</p></blockquote>
<p>作为手机平台应用最广泛的一种无限网络协议（中国受限），其在地球上的覆盖面积达到了惊人的程度（结论凭主观判断，目前还没有确切的数据来源）。此前有文章讨论“<a href="http://www.androidres.com/index.php/2009/09/03/detect-current-network-resource-in-android/" target="_blank">如何检测当前区域内可用的网络资源？</a>” ，下面将围绕网络应用的话题介绍与WIFI应用开发的一些方法。</p>
<p>首先，需要在Manifest中添加如下permissions：</p>
<pre lang="xml">
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>

<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"></uses-permission>

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>

<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
</pre>
<p>其次，在调用的函数中声明一个<a href="http://www.androidres.com/index.php/2009/10/22/add-a-wifi-switcher-into-your-application/" target="_blank">WIFIManager</a>实体：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">private WifiManager wifiManager;
...
@Override
public void onCreate...
       wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);</pre>
<p>然后通过WIFIManager所提供的方法处理各种与WIFI相关的应用：</p>
<ul>
<li>检测当前网络信号质量：<span style="color: #008000;">static                          int</span> <a target="_blank" href="http://developer.android.com/reference/android/net/wifi/WifiManager.html#calculateSignalLevel%28int,%20int%29">calculateSignalLevel</a>(int rssi, int numLevels)</li>
<li>得到当前WIFI的Enabled状态：<span style="color: #008000;">boolean</span> <a target="_blank" href="http://developer.android.com/reference/android/net/wifi/WifiManager.html#isWifiEnabled%28%29">isWifiEnabled</a>()</li>
<li>启动/中止WIFI服务：<span style="color: #008000;">boolean</span> <a target="_blank" href="http://developer.android.com/reference/android/net/wifi/WifiManager.html#setWifiEnabled%28boolean%29">setWifiEnabled</a>(boolean enabled)</li>
<li>断开当前连接：<span style="color: #008000;">boolean </span><span><a target="_blank" href="http://developer.android.com/reference/android/net/wifi/WifiManager.html#disconnect%28%29">disconnect</a></span>()</li>
</ul>
<p>查看更多有关<a target="_blank" href="http://developer.android.com/reference/android/net/wifi/WifiManager.html" target="_blank">调用方法</a>的介绍。</p>
<p>[Via <a target="_blank" href="http://almondmendoza.com/2009/10/17/turn-off-turn-on-wifi-in-android-using-code-tutorial/" target="_self">Almond Mendoza</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.androidres.com/index.php/2009/10/22/add-a-wifi-switcher-into-your-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mozilla FireFox for Android孕育中</title>
		<link>http://www.androidres.com/index.php/2009/10/21/mozilla-firefox-is-coming-to-android/</link>
		<comments>http://www.androidres.com/index.php/2009/10/21/mozilla-firefox-is-coming-to-android/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 18:51:37 +0000</pubDate>
		<dc:creator>EGGer</dc:creator>
				<category><![CDATA[Essay]]></category>
		<category><![CDATA[add-ons]]></category>
		<category><![CDATA[FireFox]]></category>

		<guid isPermaLink="false">http://www.androidres.com/?p=677</guid>
		<description><![CDATA[
适用于Android平台的FireFox经官方证实已经在孕育中，目前还无法获取准确的发布时间。本人完全是FireFox的拥护者（主观立场并不代表其是当今最好的浏览器，至少用着比较方便），同时也提倡大家利用Firefox浏览AR（此前在IE中的显示问题已经解决）。通过某媒体对Mozilla CEO John Lilly 和 VP Jay Sullivan的采访，获得了与FireFox for Android进展相关的重要信息。最初由于Android基于Java作为开发核心的技术特点，Mozilla并没有过早的涉及到这个平台的扩展。直到Android NDK的来临，这似乎让“便秘”中的Mozilla可以开始针对Android平台顺畅的“排泄”了。John Lilly在这个话题的基础上更进一步的解释：当初无法开展Android平台扩展的原因，由于硬件平台的限制，无法让智能手机平台的浏览器完全套用桌面电脑的技术，毕竟一些主流的Web应用技术无法保证可以在所有智能手机平台得到支持。
Android平台本身已经有了默认的浏览器，FireFox的优势在于可以革命性的实现手机浏览器支持扩展功能（add-ons），相信大部分人都将被这样的诱惑所吸引。
让我们一同静静的等待FireFox真正来临的那一天。
[via GigaOm]
]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-678" title="Mozilla FireFox for Android" src="http://www.androidres.com/wp-content/uploads/2009/10/firefoxAndroid.jpg" alt="Mozilla FireFox for Android" width="530" height="242" /></p>
<p>适用于Android平台的FireFox经官方证实已经在孕育中，目前还无法获取准确的发布时间。本人完全是FireFox的拥护者（主观立场并不代表其是当今最好的浏览器，至少用着比较方便），同时也提倡大家利用Firefox浏览<a target="_blank" href="http://www.androidres.com/index.php/2009/10/21/mozilla-firefox-is-coming-to-android/" target="_blank">AR</a>（此前在IE中的显示问题已经解决）。通过某媒体对Mozilla CEO John Lilly 和 VP Jay Sullivan的采访，获得了与FireFox for Android进展相关的重要信息。最初由于Android基于Java作为开发核心的技术特点，Mozilla并没有过早的涉及到这个平台的扩展。<span id="more-677"></span>直到<a href="http://developer.android.com/sdk/ndk/1.5_r1/index.html#overview" target="_blank">Android NDK</a>的来临，这似乎让“便秘”中的Mozilla可以开始针对Android平台顺畅的“排泄”了。John Lilly在这个话题的基础上更进一步的解释：当初无法开展Android平台扩展的原因，由于硬件平台的限制，无法让智能手机平台的浏览器完全套用桌面电脑的技术，毕竟一些主流的Web应用技术无法保证可以在所有智能手机平台得到支持。</p>
<p>Android平台本身已经有了默认的浏览器，FireFox的优势在于可以革命性的实现手机浏览器支持扩展功能（<a target="_blank" href="http://www.google.com/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;ved=0CAwQFjAA&amp;url=https%3A%2F%2Faddons.mozilla.org%2F&amp;rct=j&amp;q=firefox+add+ons&amp;ei=DgjeSs6DCo2PkQWR_8ES&amp;usg=AFQjCNGoTdPVJJYDmaDkKoFSpuasv6HVCg&amp;sig2=kk7C7Rpr4gmqxZbazG4J9g" target="_blank">add-ons</a>），相信大部分人都将被这样的诱惑所吸引。</p>
<p>让我们一同静静的等待FireFox真正来临的那一天。</p>
<p>[via <a target="_blank" href="http://gigaom.com/2009/10/19/on-mobile-phones-firefoxs-big-bet-is-nokia-android/" target="_blank">GigaOm</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.androidres.com/index.php/2009/10/21/mozilla-firefox-is-coming-to-android/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>关于Zipalign的介绍和使用方法</title>
		<link>http://www.androidres.com/index.php/2009/10/18/use-zipalign-to-optimize-your-application-packages/</link>
		<comments>http://www.androidres.com/index.php/2009/10/18/use-zipalign-to-optimize-your-application-packages/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 07:17:22 +0000</pubDate>
		<dc:creator>EGGer</dc:creator>
				<category><![CDATA[Resource]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[align]]></category>
		<category><![CDATA[Data structure alignment]]></category>
		<category><![CDATA[Effective android]]></category>
		<category><![CDATA[zipalign]]></category>

		<guid isPermaLink="false">http://www.androidres.com/?p=676</guid>
		<description><![CDATA[Android 1.6 SDK中包含了一个用于优化APK的新工具zipalign。 它提高了优化后的Applications与Android系统的交互效率（俗话：“要致富先修路”，Android小组重新为Applications 与Android系统之间搭建了一条高速公路），从而可以使整个系统的运行速度有了较大的提升。Android小组强烈建议开发者在发布新Apps之前使 用zipalign优化工具，而且对于已经发布但不受限于系统版本的Apps，建议用优化后的APK替换现有的版本。在下面的内容中将从三个方面介绍 zipalign：

zipalign如何优化
如何使用zipalign
使用zipalign的理由

根据官方文档的描述，Android系统中Application的数据都保存在它的APK文件中，同时可以被多个进程访问，安装的过程包括如下几个步骤：

Installer通过每个apk的manifest文件获取与当前应用程序相关联的permissions信息
Home application读取当前APK的Name和Icon等信息。
System server将读取一些与Application运行相关信息，例如：获取和处理Application的notifications请求等。
最后，APK所包含的内容不仅限于当前Application所使用，而且可以被其它的Application调用，提高系统资源的可复用性。

zipalign优化的最根本目的是帮助操作系统更高效率的根据请求索引资源，将resource-handling code统一将Data structure alignment（数 据结构对齐标准:DSA）限定为4-byte boundaries。如果第一次接触有关Data structure alignment的内容，强烈建议搜索更多与其相关的内容来充分理解这样做的最终目的，这也是理解zipalign工作原理的关键。如果不采取对齐的标 准，处理器无法准确和快速的在内存地址中定位相关资源。
目前的系统中使用fallback mechanism机制处理那些没有应用DSA标准的应用程序，这的确大大的方便了普通开发者无需关注繁琐的内存操作问题。但是相反，对于这样的应用程序 将给普通用户带来一定的麻烦，不但影响程序的运行的效率，而且使系统的整体执行效率下降和占用大量不必要的内存资源，甚至消耗一定的电池资源 (battery life)。
在Android 1.6 SDK中提供了三种应用Align操作的方法：

使用ADT: 

从 ADT 0.9.3版本开始，可以通过export wizard自动对发布的application packages执行align操作。设置方法：鼠标右键点击Project，然后选择&#8221;Android Tools&#8221; &#62; &#8220;Export Signed Application Package&#8230;&#8221;。或者可以直接在AndroidManifest.xml中设置。


使用 Ant: 

对于API Level 大于等于4的Application Packages可以直接通过Ant build script来Align优化。但对于API Level小于4的情况，只能采取手动Align优化。
默认下应用Ant build script运行Debug packages(API Level &#62;= 4)时，将自动执行Align优化。
针对Release packages。当使用Ant build script执行Align优化时，首先需要拥有足够的信息来Sign packages。当完成Signing之后， 才能执行Align优化。通过官方文档了解如何Sign Packages。


手动执行Align优化：

利用tools文件夹下的zipalign工具。首先调出cmd命令行，然后执行:zipalign -v [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Android 1.6 SDK中包含了一个用于优化<a target="_blank" id="x0rh" title="APK" href="http://developer.android.com/guide/publishing/app-signing.html" target="_blank">APK</a>的新工具<a target="_blank" id="gkt0" title="zipalign" href="http://developer.android.com/guide/developing/tools/zipalign.html" target="_blank">zipalign</a>。 它提高了优化后的Applications与Android系统的交互效率（俗话：“要致富先修路”，Android小组重新为Applications 与Android系统之间搭建了一条高速公路），从而可以使整个系统的运行速度有了较大的提升。Android小组强烈建议开发者在发布新Apps之前使 用zipalign优化工具，而且对于已经发布但不受限于系统版本的Apps，建议用优化后的APK替换现有的版本。在下面的内容中将从三个方面介绍 zipalign：</p>
<ul>
<li>zipalign如何优化</li>
<li>如何使用zipalign</li>
<li>使用zipalign的理由</li>
</ul>
<p>根据官方文档的描述，<a href="http://www.androidres.com/index.php/2009/10/18/use-zipalign-to-optimize-your-application-packages/" target="_blank">Android</a>系统中Application的数据都保存在它的APK文件中，同时可以被多个进程访问，安装的过程包括如下几个步骤：</p>
<ul>
<li>Installer通过每个apk的manifest文件获取与当前应用程序相关联的permissions信息</li>
<li>Home application读取当前APK的Name和Icon等信息。</li>
<li>System server将读取一些与Application运行相关信息，例如：获取和处理Application的notifications请求等。</li>
<li>最后，APK所包含的内容不仅限于当前Application所使用，而且可以被其它的Application调用，提高系统资源的可复用性。</li>
</ul>
<p style="text-align: left;">zipalign优化的最根本目的是帮助操作系统更高效率的根据请求索引资源，将resource-handling code统一将<a target="_blank" id="qj4m" title="Data structure alignment" href="http://en.wikipedia.org/wiki/Data_structure_alignment" target="_blank">Data structure alignment</a>（数 据结构对齐标准:DSA）限定为4-byte boundaries。如果第一次接触有关Data structure alignment的内容，强烈建议搜索更多与其相关的内容来充分理解这样做的最终目的，这也是理解zipalign工作原理的关键。如果不采取对齐的标 准，处理器无法准确和快速的在内存地址中定位相关资源。</p>
<p style="text-align: left;">目前的系统中使用fallback mechanism机制处理那些没有应用DSA标准的应用程序，这的确大大的方便了普通开发者无需关注繁琐的内存操作问题。但是相反，对于这样的应用程序 将给普通用户带来一定的麻烦，不但影响程序的运行的效率，而且使系统的整体执行效率下降和占用大量不必要的内存资源，甚至消耗一定的电池资源 (battery life)。</p>
<p><strong>在Android 1.6 SDK中提供了三种应用Align操作的方法：</strong></p>
<ul>
<li><strong>使用ADT: </strong>
<ul>
<li>从 ADT 0.9.3版本开始，可以通过export wizard自动对发布的application packages执行align操作。设置方法：鼠标右键点击Project，然后选择&#8221;Android Tools&#8221; &gt; &#8220;Export Signed Application Package&#8230;&#8221;。或者可以直接在AndroidManifest.xml中设置。</li>
</ul>
</li>
<li><strong>使用 Ant: </strong>
<ul>
<li>对于API Level 大于等于4的Application Packages可以直接通过Ant build script来Align优化。但对于API Level小于4的情况，只能采取手动Align优化。</li>
<li>默认下应用Ant build script运行Debug packages(API Level &gt;= 4)时，将自动执行Align优化。</li>
<li>针对Release packages。当使用Ant build script执行Align优化时，首先需要拥有足够的信息来Sign packages。当完成Signing之后， 才能执行Align优化。通过官方文档了解<a target="_blank" id="diud" title="如何Sign Packages" href="http://developer.android.com/guide/publishing/app-signing.html" target="_blank">如何Sign Packages</a>。</li>
</ul>
</li>
<li><strong>手动执行Align优化：</strong>
<ul>
<li>利用tools文件夹下的zipalign工具。首先调出cmd命令行，然后执行:zipalign -v 4 source.apk androidres.apk。这个方法不受API Level的限制，可以对任何版本的APK执行Align优化。</li>
<li>同时可以利用zipalign工具检查当前APK是否已经执行过Align优化。命令：zipalign -c -v 4 androidres.apk</li>
</ul>
</li>
</ul>
<p>再一次提醒开发者，立刻应用zipalign工具强制优化已经发布的application packages，并让你的用户使用最新的版本。</p>
<p>英文原版 <a target="_blank" href="http://android-developers.blogspot.com/2009/09/zipalign-easy-optimization.html" target="_blank">official Android blog</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.androidres.com/index.php/2009/10/18/use-zipalign-to-optimize-your-application-packages/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>介绍Android Gestures的使用方法</title>
		<link>http://www.androidres.com/index.php/2009/10/16/introduce-how-to-use-gestures-api-in-android/</link>
		<comments>http://www.androidres.com/index.php/2009/10/16/introduce-how-to-use-gestures-api-in-android/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 18:00:57 +0000</pubDate>
		<dc:creator>EGGer</dc:creator>
				<category><![CDATA[Resource]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[GestureOverlayView]]></category>
		<category><![CDATA[Gestures]]></category>

		<guid isPermaLink="false">http://www.androidres.com/?p=668</guid>
		<description><![CDATA[开始讨论Gestures技术之前，首先回顾与触摸屏技术相关的历史。在1971年，Elographics公司（已经更名为：Elo TouchSystems）的创始人Sam Hurst博士作为肯塔基州立大学导师期间发明了第一块触摸传感器，取名为“Elograph”。与当今的技术相比，其并不算是真正意义上的Touch Screen，但却是触摸屏技术发展史上最重要的里程碑。直到1974年，一款真正意义上的触摸屏问世，实现了透明和显示图像的特性。在1977年，又创造出了five-wire resistive，这就是今天广泛被应用于许多领域的触摸屏核心技术，具有更加精确和稳定的特点。
目前Touch Screens技术在不同的应用领域发挥着重要的作用。尤其各种智能移动设备向着更薄、更轻、更强大的方向发展，这对于人机交互提出了更高的要求。凭借触摸屏技术，使用者将从繁琐的按键操作逐渐过渡为利用各种手势快速和准确的实现人机交互，比如轻轻触摸、拖拽、甩或者滑动等一系列的简单手势快速的实现一些常规的命令操作。在Android 1.6之前的版本中，需要开发者编写大量的代码才能实现某些更为复杂的Gestures功能。为了让Gestures技术可以被方便的嵌入到第三方软件中，Android 1.6 SDk中嵌入标准的Gestures API库（Package: android.gesture），包括了所有与Gesture技术相关的操作：存储、加载、创建新Gestures和识别等。接下来将通过具体的例子全面的介绍如何将Gestures技术加入到Application中。开始前请先下载实例的源码。
创建一个Gestures Library
Gestures Builder 在Android 1.6 SDK 中作为系统工具经Emulator启动时被默认加载。开发者可以直接通过Gestures Builder工具创建一批Gestures库，并添加到自己的程序中为用户提供可直接使用的Gestures行为。如果希望用户可以在程序中自定义 Gestures信息，也可以将Gestures Builder作为一个单独的模块整合到程序中，使用的方式与单独操作Gestures Builder工具完全一致。Gestures Builder工具的源码存放在Samples中，建议大家亲自尝试。使用Gestures Builder生成的gestures集合将自动存放在SD Card中。如果使用Emulator调试程序，需要在使用Gestures Builder之前确保当前有可用的虚拟SD Card映射。下边的截图表示当前已经添加三个gestures。

上边的图示中可以看到每个条目包含两个基本元素，gesture 2D信息和标签，标签在Application中起到索引的作用。在同一个Application中允许包含一个以上带有相同标签的集合，这样可以提高某 些指令被准确识别的几率。利用Gestures Builder添加或者编辑gestures，生成的最终文件存放在SD card中的 gestures目录。可以直接将这个目录下的gestures拷贝到Application的/res/raw中作为默认的gestures资源。
加载Gestures Library
根据前一节的了解，完全可以掌握利用Gestures Builder创建gestures的方法，并将生成的文件捆绑在自己的应用程序中，作为默认的gestures库。接下来了解如何在 Applicationg程序中加载库中的gestures资源（利用GestureLibraries类可以非常容易处理这个请求）：

mLibrary = GestureLibraries.fromRawResource(this, R.raw.spells);
if (!mLibrary.load()) {
    finish();
}

上边的代码实现了调用gestures前的准备工作。另外除了从本地raw中获取资源以外，也可以直接从SD Card中加载资源，特别针对允许用户自行创建gestures的应用程序，需要在程序中实现基于SD Card的读取和存储方法。由raw中读取的gestures仅具有可读属性，用户无法编辑默认捆绑在Application中的gestures资源。
下边的图标展示了Gesture Library的层级结构。
 
Gestures的识别方法


在应用程序中识别gestures包括绘制和识别两个部分。为了让用户可以直接在Applications表面绘制gestures，需要将下边的标签加入到当前窗口的XML Layout中。



由于GestureOverlayView类并不属于android.widget资源范畴，因此调用时必须提供完整名称(Botton或者其它的 Views只需要提供Short Name就可以直接被系统识别)。Gesture overlay相当于一块简单的绘画板，允许用户绘制各种gestures。Gesture overlay的显示属性可以根据应用程序的整体样式而制定合适的色彩和笔触宽度。利用Listener跟踪Gestures的不同行为，从而相应用户的 细微操作。其中OnGesturePerformedListener是最常用的方法，当用户完成一次Gesture绘制后，系统将自动运行这个 Listener中的代码。至此，完成了Gestures识别功能中的第一个步骤。

GestureOverlayView gestures [...]]]></description>
			<content:encoded><![CDATA[<p>开始讨论Gestures技术之前，首先回顾与触摸屏技术相关的历史。在1971年，Elographics公司（已经更名为：Elo TouchSystems）的创始人Sam Hurst博士作为肯塔基州立大学导师期间发明了第一块触摸传感器，取名为“Elograph”。与当今的技术相比，其并不算是真正意义上的Touch Screen，但却是触摸屏技术发展史上最重要的里程碑。直到1974年，一款真正意义上的触摸屏问世，实现了透明和显示图像的特性。在1977年，又创造出了five-wire resistive，这就是今天广泛被应用于许多领域的触摸屏核心技术，<a target="_blank" href="http://code.google.com/p/apps-for-android/downloads/detail?name=GesturesDemos.zip&amp;can=2&amp;q=#makechanges" target="_blank">具有更加精确和稳定的特点</a>。</p>
<p>目前Touch Screens技术在不同的应用领域发挥着重要的作用。尤其各种智能移动设备向着更薄、更轻、更强大的方向发展，这对于人机交互提出了更高的要求。凭借触摸屏技术，使用者将从繁琐的按键操作逐渐过渡为利用各种手势快速和准确的实现人机交互，比如轻轻触摸、拖拽、甩或者滑动等一系列的简单手势快速的实现一些常规的命令操作。在Android 1.6之前的版本中，需要开发者编写大量的代码才能实现某些更为复杂的<a target="_blank" href="http://developer.android.com/reference/android/gesture/package-summary.html">Gestures</a>功能。为了让Gestures技术可以被方便的嵌入到第三方软件中，Android 1.6 SDk中嵌入标准的Gestures API库（Package: android.gesture），包括了所有与Gesture技术相关的操作：存储、加载、创建新Gestures和识别等。接下来将通过具体的例子全面的介绍如何将Gestures技术加入到Application中。开始前请先下载实例的源码。</p>
<p><strong>创建一个Gestures Library</strong></p>
<p>Gestures Builder 在Android 1.6 SDK 中作为系统工具经Emulator启动时被默认加载。开发者可以直接通过Gestures Builder工具创建一批Gestures库，并添加到自己的程序中为用户提供可直接使用的Gestures行为。如果希望用户可以在程序中自定义 Gestures信息，也可以将Gestures Builder作为一个单独的模块整合到程序中，使用的方式与单独操作Gestures Builder工具完全一致。Gestures Builder工具的源码存放在Samples中，建议大家亲自尝试。使用Gestures Builder生成的gestures集合将自动存放在SD Card中。如果使用Emulator调试程序，需要在使用Gestures Builder之前确保当前有可用的虚拟SD Card映射。下边的截图表示当前已经添加三个gestures。</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-669" title="android gestures 001" src="http://www.androidres.com/wp-content/uploads/2009/10/cf49fh6b_5d97vb6ft_b.png" alt="android gestures 001" width="320" height="480" /></p>
<p>上边的图示中可以看到每个条目包含两个基本元素，gesture 2D信息和标签，标签在Application中起到索引的作用。在同一个Application中允许包含一个以上带有相同标签的集合，这样可以提高某 些指令被准确识别的几率。利用Gestures Builder添加或者编辑gestures，生成的最终文件存放在SD card中的 gestures目录。可以直接将这个目录下的gestures拷贝到Application的/res/raw中作为默认的gestures资源。</p>
<p><strong>加载Gestures Library</strong></p>
<p>根据前一节的了解，完全可以掌握利用Gestures Builder创建gestures的方法，并将生成的文件捆绑在自己的应用程序中，作为默认的gestures库。接下来了解如何在 Applicationg程序中加载库中的gestures资源（利用GestureLibraries类可以非常容易处理这个请求）：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">
mLibrary = GestureLibraries.fromRawResource(this, R.raw.spells);
if (!mLibrary.load()) {
    finish();
}
</pre>
<p>上边的代码实现了调用<a href="http://www.androidres.com/index.php/2009/10/16/introduce-how-to-use-gestures-api-in-android/">gestures</a>前的准备工作。另外除了从本地raw中获取资源以外，也可以直接从SD Card中加载资源，特别针对允许用户自行创建gestures的应用程序，需要在程序中实现基于<a href="http://www.androidres.com/?p=128">SD Card</a>的读取和存储方法。由raw中读取的gestures仅具有可读属性，用户无法编辑默认捆绑在Application中的gestures资源。<br />
下边的图标展示了Gesture Library的层级结构。</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-670" title="Android Gestures 002" src="http://www.androidres.com/wp-content/uploads/2009/10/cf49fh6b_6dvdb38c9_b.png" alt="Android Gestures 002" width="419" height="351" /><strong> </strong></p>
<div style="text-align: left;"><strong>Gestures的识别方法</strong></div>
<div style="text-align: left;"><strong><br />
</strong></div>
<div style="text-align: left;">在应用程序中识别gestures包括绘制和识别两个部分。为了让用户可以直接在Applications表面绘制gestures，需要将下边的标签加入到当前窗口的XML Layout中。</div>
<pre lang="xml" line="n">
<android.gesture.GestureOverlayView
android:id="@+id/gestures"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1.0" />
</pre>
<p>由于GestureOverlayView类并不属于android.widget资源范畴，因此调用时必须提供完整名称(Botton或者其它的 Views只需要提供Short Name就可以直接被系统识别)。Gesture overlay相当于一块简单的绘画板，允许用户绘制各种gestures。Gesture overlay的显示属性可以根据应用程序的整体样式而制定合适的色彩和笔触宽度。利用Listener跟踪Gestures的不同行为，从而相应用户的 细微操作。其中OnGesturePerformedListener是最常用的方法，当用户完成一次Gesture绘制后，系统将自动运行这个 Listener中的代码。至此，完成了Gestures识别功能中的第一个步骤。</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">
GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);
gestures.addOnGesturePerformedListener(this);
</pre>
<p>接下来通过GestureLibrary对用户绘制的结果进行比对，每次的比对结果将可能包括多个相似的结果。根据数量级（系统中会针对一个 Gesture创建多个实例，目的是达到更加精确的识别目的）的原则，依据降序的排列方法选择最贴近用户意图的结果。下边的代码实现了完整的“筛选”过 程。</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">

public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture)
{
    ArrayList predictions = mLibrary.recognize(gesture);

    // We want at least one prediction [androidres.com]
    if (predictions.size() > 0) {
        Prediction prediction = predictions.get(0);
        // We want at least some confidence in the result
        if (prediction.score > 1.0) {
            // Show the spell
            Toast.makeText(this, prediction.name,Toast.LENGTH_SHORT).show();
        }
    }
}
</pre>
<p>根据代码的执行过程，recognize()的返回结果是一个prediction集合，包含了所有与gesture相匹配的结果。prediction 的score属性代表了与gesture得相似程度（通常情况下不考虑score小于1的结果）。以上是Gestures应用的两个基本功能的介绍，非常 简单的几行代码就就可以让你的程序支持当前最流行的人性化操作方式。</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-671" title="Android Gesture 003" src="http://www.androidres.com/wp-content/uploads/2009/10/cf49fh6b_7jv4jj7ck_b.png" alt="Android Gesture 003" width="320" height="480" /></p>
<p>Gestures Overlay</p>
<p>接下来介绍另外一个全新的用法。前面是将GestureOverlayView作为一般的View，被直接嵌入在LinearLayout的子集中。然 而，根据这个类名的直观理解是可以作为所有Views元素之上的一个Overlay来使用，更形象的解释是将GestureOverlayView看做一 个盒子，而其它的Views应用元素成为它的子集。这样的方式被普遍应用于游戏操作或者仅限制Application中的某一部分的UI支持 Gestures功能。接下来我们利用GestureListDemo例子来体验这种用法，实现的效果是在一个Contacts列表上创建一个 Gestures Overlay。首先仍然需要利用Gestures Builder初始化一些gestures数据：</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-672" title="Android Gestures 004" src="http://www.androidres.com/wp-content/uploads/2009/10/cf49fh6b_88zfgzrgv_b.png" alt="Android Gestures 004" width="320" height="480" /></p>
<p>XML layout代码（完全不同于第一个例子的配置方法）：</p>
<pre lang="xml" line="n">
<android.gesture.GestureOverlayView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gestures"
android:layout_width="fill_parent"
android:layout_height="fill_parent"

android:gestureStrokeType="multiple"
android:eventsInterceptionEnabled="true"
android:orientation="vertical">

<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

</android.gesture.GestureOverlayView>
</pre>
<p>当利用Gestures view的Overlay特性时，需要利用更多的属性来设置当前Gesture的状态，在第一个例子中则不需要考虑这些：</p>
<p>1）gestureStrokeType:设置Stroke的类型。大多数情况下，gestures都是通过一笔完成。然而有一些特别的需求就需要通过多个笔画来实现，例如通过“+”来实现“Add”的行为。</p>
<ul>
<li>Single:0</li>
</ul>
<ul>
<li>Multiple:1</li>
</ul>
<p>2）eventsInterceptionEnabled: 可以简单理解为当前应用程序在Gesture overlay模式下屏蔽其它Views Events的开关。当它设置为True时，所有基于当前应用程序屏幕的操作都被视作为绘制gestures的行为，从而避免用户与应用程序界面的交互造 成混乱。<br />
3）orientation:这个属性作为当前Gesture recognizing的参考标准（相当于filter的作用），例如：在这个例子中的Items垂直排列，所有基于Overlay的垂直 (vertical) gesture，都无法被识别为有效的gesture，其与当前的垂直滚动条操作造成混淆。对于水平 (horizontal) gesture可以立即识别为有效的gesture，或者任何以垂直为起始的操作需要至少包含一段水平的绘制轨迹才可以被正常识别。</p>
<ul>
<li>Horizontal : 0</li>
</ul>
<ul>
<li>Vertical : 1</li>
</ul>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">

public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture)
{
    ArrayList<Prediction> predictions = mLibrary.recognize(gesture);
    if (predictions.size() > 0 &#038;&#038; predictions.get(0).score > 1.0)
    {
        String action = predictions.get(0).name;
        if ("action_add".equals(action))
        {
            Toast.makeText(this, "Adding a contact",Toast.LENGTH_SHORT).show();
        }
        else if ("action_delete".equals(action))
        {
            Toast.makeText(this, "Removing a contact",Toast.LENGTH_SHORT).show();
        }
        else if ("action_refresh".equals(action))
        {
            Toast.makeText(this, "Reloading contacts",Toast.LENGTH_SHORT).show();
        }
    }
}
</pre>
<p>根据上边的设置，目前用户可以基于ListView之上做任何Gesture操作，而不会与当前的Scrolling Events混淆。</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-673" title="Android Gestures 005" src="http://www.androidres.com/wp-content/uploads/2009/10/cf49fh6b_9g5mpqzfg_b.png" alt="Android Gestures 005" width="320" height="480" /></p>
<p>从视觉上可以直接判断当前Gesture是否有效的被当前Application识别。对于无效的Stroke将会以半透明的方式显示。</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-674" title="Android Gestures" src="http://www.androidres.com/wp-content/uploads/2009/10/cf49fh6b_10ctk8g384_b.png" alt="Android Gestures" width="320" height="480" /></p>
<p>相信很快这项技术将作为最基本的应用部署在大部分的应用程序中。让我们开始尝试创建第一个带有Gestures功能的应用程序吧！</p>
<p>查看英文原文[<a target="_blank" href="http://android-developers.blogspot.com/2009/10/gestures-on-android-16.html">Android Blog</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.androidres.com/index.php/2009/10/16/introduce-how-to-use-gestures-api-in-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adsense为智能手机优化服务内容</title>
		<link>http://www.androidres.com/index.php/2009/10/10/adsense-for-mobile-goes-highend/</link>
		<comments>http://www.androidres.com/index.php/2009/10/10/adsense-for-mobile-goes-highend/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 06:39:33 +0000</pubDate>
		<dc:creator>EGGer</dc:creator>
				<category><![CDATA[Daily Cakes]]></category>
		<category><![CDATA[Adsense]]></category>
		<category><![CDATA[Money]]></category>

		<guid isPermaLink="false">http://www.androidres.com/?p=665</guid>
		<description><![CDATA[
对于开发者而言智能手机的普及极大的拓展了他们的想象空间，为此可以将基于电脑的某些应用移植到手机平台，丰富前所未有的手机用户体验。目前包括IPhone以及运行Android操作系统的手机已经提供 full (HTML) Internet browsers 的支持，这代表手机用户可以通过浏览器体验更多丰富内容，包括完整的网络购物流程等。
为此，Google对Adsense做出了一些改善。目的是帮助开发者提供内容丰富和面积更大的Adsense广告来吸引手机用户，提高手机平台投放广告的收入。发布的方式也不仅仅局限于网站，可以嵌入游戏或者其它应用软件中，极大的提升了用户对其所感兴趣广告的点击率。
更换广告格式和大小将变得更加方便，无需修改嵌入的Adsense代码就可以快速通过Google所提供的管理界面实现不同种广告格式间的切换。如果选择全平台模式，将根据对平台种类的检测结果自动应用相匹配的广告格式。

如果想获取更多有关于Adsense赚钱的方法可以访问 Adsense help center，对于想了解其它针对于手机应用的赚钱方式请访问 “借助免费的Android Apps来赚钱”
]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-666" title="adsense-for-mobile-goes-highend" src="http://www.androidres.com/wp-content/uploads/2009/10/adsense-for-mobile-goes-hig.jpg" alt="adsense-for-mobile-goes-highend" width="539" height="205" /></p>
<p style="text-align: left;">对于开发者而言智能手机的普及极大的拓展了他们的想象空间，为此可以将基于电脑的某些应用移植到手机平台，丰富前所未有的手机用户体验。目前包括IPhone以及运行Android操作系统的手机已经提供 <a target="_blank" href="http://adwords.google.com/support/aw/bin/answer.py?answer=107264">full (HTML) Internet browsers</a> 的支持，这代表手机用户可以通过浏览器体验更多丰富内容，包括完整的网络购物流程等。</p>
<p style="text-align: left;">为此，Google对Adsense做出了一些改善。<span id="more-665"></span>目的是帮助开发者提供内容丰富和面积更大的Adsense广告来吸引手机用户，提高手机平台投放广告的收入。发布的方式也不仅仅局限于网站，可以嵌入游戏或者其它应用软件中，极大的提升了用户对其所感兴趣广告的点击率。</p>
<p style="text-align: left;">更换广告格式和大小将变得更加方便，无需修改嵌入的Adsense代码就可以快速通过Google所提供的管理界面实现不同种广告格式间的切换。如果选择全平台模式，将根据对平台种类的检测结果自动应用相匹配的广告格式。</p>
<p style="text-align: center;"><a target="_blank" href="http://1.bp.blogspot.com/_YbURk67VlGk/SsnxNzQiKoI/AAAAAAAAA-8/ew55B3DYWuc/s400/AdSenseHighEnd.PNG" rel="lightbox[665]"><img class="aligncenter size-full wp-image-667" title="AdSenseHighEnd" src="http://www.androidres.com/wp-content/uploads/2009/10/AdSenseHighEnd.PNG" alt="AdSenseHighEnd" width="400" height="184" /></a></p>
<p style="text-align: left;">如果想获取更多有关于Adsense赚钱的方法可以访问 <a target="_blank" href="https://www.google.com/adsense/support/bin/topic.py?hl=en&amp;topic=11951&amp;sourceid=aso&amp;subid=ww-en-et-asblog_2009-10-05&amp;medium=link" target="_blank">Adsense help center</a>，对于想了解其它针对于手机应用的赚钱方式请访问 “<a href="http://www.androidres.com/index.php/2009/05/04/earn-money-via-android-apps/" target="_self">借助免费的Android Apps来赚钱</a>”</p>
]]></content:encoded>
			<wfw:commentRss>http://www.androidres.com/index.php/2009/10/10/adsense-for-mobile-goes-highend/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>介绍Text-To-Speech在Android中的用法</title>
		<link>http://www.androidres.com/index.php/2009/09/29/an-introduction-to-text-to-speech-in-android/</link>
		<comments>http://www.androidres.com/index.php/2009/09/29/an-introduction-to-text-to-speech-in-android/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 16:15:01 +0000</pubDate>
		<dc:creator>EGGer</dc:creator>
				<category><![CDATA[Resource]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Text-To-Speech]]></category>
		<category><![CDATA[TTS]]></category>

		<guid isPermaLink="false">http://www.androidres.com/?p=663</guid>
		<description><![CDATA[
TextToSpeech简称 TTS，是Android 1.6版本中比较重要的新功能。将所指定的文本转成不同语言音频输出。它可以方便的嵌入到游戏或者应用程序中，增强用户体验。
在讲解TTS API和将这项功能应用到你的实际项目中的方法之前，先对这套TTS引擎有个初步的了解。
对TTS资源的大体了解：
TTS engine依托于当前Android Platform所支持的几种主要的语言：English、French、German、Italian和Spanish五大语言（暂时没有我们伟大的中文，至少Google的科学家们还没有把中文玩到炉火纯青的地步，先易后难也是理所当然。）TTS可以将文本随意的转换成以上任意五种语言的语音输出。与此同时，对于个别的语言版本将取决于不同的时区，例如：对于English，在TTS中可以分别输出美式和英式两种不同的版本（由此看出Google的做事风格真够细致，而正因为如此估计Google不加入中文的另外一种理由是中文的方言太多了）。
能支持如此庞大的数据量，TTS 引擎对于资源的优化采取预加载的方法。根据一系列的参数信息（参数的用法将在后边有详细的介绍）从库中提取相应的资源，并加载到当前系统中。
尽管当前大部分加载有Android操作系统的设备都通过这套引擎来提供TTS功能，但由于一些设备的存储空间非常有限而影响到TTS无法最大限度的发挥功能，算是当前的一个瓶颈。为此，开发小组引入了检测模块，让利用这项技术的应用程序或者游戏针对于不同的设备可以有相应的优化调整，从而避免由于此项功能的限制，影响到整个应用程序的使用。比较稳妥的做法是让用户自行选择是否有足够的空间或者需求来加载此项资源，下边给出一个标准的检测方法：
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
如果当前系统允许创建一个 “android.speech.tts.TextToSpeech” 的Object, 说明已经提供TTS功能的支持，将检测返回结果中给出“ CHECK_VOICE_DATA_PASS ” 的标记。如果系统不支持这项功能，那么用户可以选择是否加载这项功能，从而让设备支持输出多国语言的语音功能“Multi-lingual Talking”。“ACTION_INSTALL_TTS_DATA” intent将用户引入Android market中的TTS下载界面。下载完成后将自动完成安装，下边是实现这一过程的完整代码 (androidres.com) ：
private TextToSpeech mTts;
protected void onActivityResult(
        int requestCode, int resultCode, Intent data) {
    if (requestCode == MY_DATA_CHECK_CODE) {
       [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-664" style="border: 3px solid #e6e6e6;" title="Text-To-Speech" src="http://www.androidres.com/wp-content/uploads/2009/09/TextToSpeech.jpg" alt="Text-To-Speech" width="303" height="400" /></p>
<p>TextToSpeech简称 TTS，是<a target="_blank" href="http://android-developers.blogspot.com/2009/09/android-16-sdk-is-here.html" target="_blank">Android 1.6版本</a>中比较重要的新功能。将所指定的文本转成不同语言音频输出。它可以方便的嵌入到游戏或者应用程序中，增强用户体验。</p>
<p>在讲解TTS API和将这项功能应用到你的实际项目中的方法之前，先对这套TTS引擎有个初步的了解。<span id="more-663"></span></p>
<p><strong>对TTS资源的大体了解：</strong></p>
<p style="text-align: left;">TTS engine依托于当前Android Platform所支持的几种主要的语言：English、French、German、Italian和Spanish五大语言（暂时没有我们伟大的中文，至少Google的科学家们还没有把中文玩到炉火纯青的地步，先易后难也是理所当然。）TTS可以将文本随意的转换成以上任意五种语言的语音输出。与此同时，对于个别的语言版本将取决于不同的时区，例如：对于English，在TTS中可以分别输出美式和英式两种不同的版本（由此看出Google的做事风格真够细致，而正因为如此估计Google不加入中文的另外一种理由是中文的方言太多了）。</p>
<p style="text-align: left;">能支持如此庞大的数据量，TTS 引擎对于资源的优化采取预加载的方法。根据一系列的参数信息（参数的用法将在后边有详细的介绍）从库中提取相应的资源，并加载到当前系统中。</p>
<p style="text-align: left;">尽管当前大部分加载有Android操作系统的设备都通过这套引擎来提供TTS功能，但由于一些设备的存储空间非常有限而影响到TTS无法最大限度的发挥功能，算是当前的一个瓶颈。为此，开发小组引入了检测模块，让利用这项技术的应用程序或者游戏针对于不同的设备可以有相应的优化调整，从而避免由于此项功能的限制，影响到整个应用程序的使用。比较稳妥的做法是让用户自行选择是否有足够的空间或者需求来加载此项资源，下边给出一个标准的检测方法：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);</pre>
<p style="text-align: left;">如果当前系统允许创建一个 “<span style="color: #008000;"><code>android.speech.tts.TextToSpeech</code></span>” 的Object, 说明已经提供TTS功能的支持，将检测返回结果中给出“ <span style="color: #008000;"><code>CHECK_VOICE_DATA_PASS</code></span> ” 的标记。如果系统不支持这项功能，那么用户可以选择是否加载这项功能，从而让设备支持输出多国语言的语音功能“Multi-lingual Talking”。“<span style="color: #008000;">ACTION_INSTALL_TTS_DATA</span>” intent将用户引入Android market中的TTS下载界面。下载完成后将自动完成安装，下边是实现这一过程的完整代码 (androidres.com) ：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">private TextToSpeech mTts;
protected void onActivityResult(
        int requestCode, int resultCode, Intent data) {
    if (requestCode == MY_DATA_CHECK_CODE) {
        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
            // success, create the TTS instance
            mTts = new TextToSpeech(this, this);
        } else {
            // missing data, install it
            Intent installIntent = new Intent();
            installIntent.setAction(
                TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installIntent);
        }
    }
}</pre>
<p style="text-align: left;">TextToSpeech实体和OnInitListener都需要引用当前Activity的Context作为构造参数。OnInitListener（）的用处是通知系统当前TTS Engine已经加载完成，并处于可用状态。</p>
<p style="text-align: left;"><strong>根据需求设置语言参数：</strong></p>
<p style="text-align: left;">早在Google I/O大会上，官方给出了一段关于应用这项功能的鲜活体验，将翻译结果直接通过五种不同国家语言的语音输出。加载语言的方法非常简单：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">mTts.setLanguage(Locale.US);</pre>
<p style="text-align: left;">上边代码表示当前TTS实体加载美式英语。其参数并没有指示某种语言的名称，而是利用国家代码来表示，这样做的好处是不但可以确定语言的选择，而且可以根据地区的不同而有所区别。例如：英语作为最广泛被应用的语种，在多个不同的地区都有一定的差别。判断当前系统是否支持某个地区的语言资源，可以通过调用isLanguageAvailable()方法的返回值，根据返回值的描述来选择正确的处理方式。让应用某些绚丽功能的应用程序更加健壮，这个是贯穿整个开发过程都要考虑的技术环节。下边是一些应用实例 (androidres.com) ：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">mTts.isLanguageAvailable(Locale.UK))
mTts.isLanguageAvailable(Locale.FRANCE))
mTts.isLanguageAvailable(new Locale("spa", "ESP")))</pre>
<p style="text-align: left;">如果返回值是 “<span style="color: #008000;"> TextToSpeech.LANG_COUNTRY_AVAILABLE</span> ” 说明所选择的地区被包含在当前TTS系统中。如果系统中已经创建了TTS实体，那么可以利用<code><span style="color: #008000;">isLanguageAvailable()</span>方法来替代 Start </code><code>“<span style="color: #008000;">ACTION_CHECK_TTS_DATA</span></code> ” intent 检测。当无法找到任何可用资源匹配所指定的参数时，将会返回 “<code><span style="color: #008000;"> TextToSpeech.LANG_MISSING_DATA</span> ”的结果。</code>下边给出另外两个返回其它不同状态信息的例子：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">mTts.isLanguageAvailable(Locale.CANADA_FRENCH))
mTts.isLanguageAvailable(new Locale("spa"))</pre>
<p style="text-align: left;">两个语句的返回值均为 “ <span style="color: #008000;"><code>TextToSpeech.LANG_AVAILABLE</code></span> ” 。第一个是检测当前系统是否支持加拿大法语，由于系统在资源库中无法找到这个地区的法语分支，其含义是仅支持这项语言（法语），而不支持当前地区的语言分支。</p>
<p style="text-align: left;">另外，相比于上面强制用户应用预定的语音设置，更加提倡利用Locale.getDefault()方法根据用户默认的地区设置来选择合适的语言库。</p>
<p style="text-align: left;"><strong>执行Speak的具体方法：</strong></p>
<p style="text-align: left;">根据上边的介绍，基本实现了TextToSpeech的初始化和参数配置。下面是一个有关闹钟的应用实例，利用Speak()方法可以直接在应用程序中发挥强大的语音功能。没错，用起来就是这么简单：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">String myText1 = "This Translation is from androidRes.com";
String myText2 = "I hope so, because it's time to wake up.";
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, null);
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, null);</pre>
<p style="text-align: left;"><strong>TTS Engine的工作原理：</strong></p>
<p style="text-align: left;">每个独立的应用程序都可以单独创建一个TTS实体，而他们需要执行的语音消息列队（Queue）都统一由TTS Engine管理和语音合成。</p>
<blockquote>
<p style="text-align: left;"><span style="color: #808000;"><strong>名词解释：</strong></span></p>
<p style="text-align: left;"><span style="color: #808080;"><strong>synthesize </strong></span><span style="color: #808000;">[ˈsɪnθəsaɪz] <span title="Phonetic">DJ</span> ['sɪnθəˈsaɪz] <span title="Phonetic">KK</span></span>：to produce sounds, music or speech using electronic equipment （音响）合成</p>
<p style="text-align: left;"><strong><span style="color: #808080;">utterances</span></strong> <span style="color: #808000;">[ˈʌtərəns] DJ [ˈʌtərəns] KK </span>：说话方式，语音/语调。</p>
</blockquote>
<p style="text-align: left;">每个独立的TTS实例管理语音消息列队请求的优先级和顺序等。当引用 “<span style="color: #008000;">TextToSpeech.QUEUE_FLUSH</span>” 调用Speak（）方法时，会中断当前实例正在运行的任务（也可以理解为清除当前语音任务，转而执行新的列队任务）。引用 “<span style="color: #008000;">TextToSpeech.QUEUE_ADD</span>”标签的发音任务将被添加到当前任务列队之后。</p>
<p style="text-align: left;"><strong>为语音任务关联Stream Type：</strong></p>
<p style="text-align: left;">在Ａｎｄｒｏｉｄ操作系统中所有的Ａｕｄｉｏ　Ｓｔｒｅａｍ任务都是通过ＡｕｄｉｏＭａｎａｇｅｒ类来实现，而它会针对不同的Ｓｔｒｅａｍ　Ｔｙｐｅ来改变语音的播放模式。<a target="_blank" href="http://developer.android.com/reference/android/media/AudioManager.html" target="_blank">StreamＴｙｐｅ</a>可以理解为语音的播放属性，这个属性是用户根据自己的需要在系统中配置的应用方案。如果将语音任务都清楚的分门别类，可以方便的统一管理相同类别任务的属性。基于上一个<a href="http://www.androidres.com/index.php/2009/09/29/an-introductio…ech-in-android/">Alarm Clock</a>例子的基础上，将Speak()方法的最后一个Null参数替换成具有实际含义的数值。这个参数的类型是HashMap，如果希望将当前的Stream Type设置为系统中Alarm类型，对上一个例子稍作改动：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">HashMap myHashAlarm = new HashMap();
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM,
        String.valueOf(AudioManager.STREAM_ALARM));
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);</pre>
<p style="text-align: left;"><strong>应用语音功能的Completion Callback：</strong></p>
<p style="text-align: left;">TTS中的Speak()的是异步调用，无论应用<span style="color: #008000;"><code>QUEUE_FLUSH</code> </span><code>或者<span style="color: #008000;">QUEUE_ADD</span>作为参数都可以通过定义Listener监听当前任务的完成状态。可以利用这个方法追加Speak()执行之后的一些额外操作。下接下来的例子中，当完成第二次Speak()方法调用之后，利用<span style="color: #008000;">O</span></code><code><span style="color: #008000;">nUtteranceCompletedListener</span>接口</code><code>来调用其它方法：</code></p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">mTts.setOnUtteranceCompletedListener(this);
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM,
        String.valueOf(AudioManager.STREAM_ALARM));
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,
        "end of wakeup message ID");
// myHashAlarm now contains two optional parameters
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);</pre>
<p style="text-align: left;">下边是定义Listener的代码，类似与监听按钮或者其它View Events的方法。在这里将会把Speak()中HashMap参数传进Listener中，作为条件的判断依据：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">public void onUtteranceCompleted(String uttId) {
    if (uttId == "end of wakeup message ID") {
        playAnnoyingMusic();
    }
}</pre>
<p style="text-align: left;"><strong>“烘焙”当前实时的语音数据：</strong></p>
<p style="text-align: left;">看到烘焙两个字，就会让人联想到香喷喷的面包。软件开发要关注于是否可以最大限度的实现资源的复用，特别是针对资源有限的手机应用平台。那么对于TTS这么奢侈的应用如何才能更高效的使用资源呢？这次一起来体验比烘焙面包更加让人激动的功能，将TTS Engine输出的<a target="_blank" href="http://developer.android.com/guide/topics/media/index.html" target="_blank"><span style="color: #008000;">Audio Stream</span></a>作为永久的音频文件保存在当前的存储空间中(<a target="_blank" href="../?p=128" target="_blank">SDCard</a>)。这样可以对需要重复播放的某些语音内容实现快速的回放功能，从而实现国际倡导的“减排”目的，能省就省吧！在下边的例子用通过TTS的synthesizeToFile方法，将合成的语音Stream保存在参数所指定的地址中。</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">HashMap myHashRender = new HashMap();
String wakeUpText = "Are you up yet?";
String destFileName = "/sdcard/myAppCache/wakeUp.wav";
myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, wakeUpText);
mTts.synthesizeToFile(wakuUpText, myHashRender, destFileName);</pre>
<p style="text-align: left;">当完成以上操作之后会收到系统的完成通知，同时可以像其它音频资源一样，通过<a target="_blank" title="MediaPlayer documentation on Android Developers" href="http://developer.android.com/reference/android/media/MediaPlayer.html">android.media.MediaPlayer</a>方法来播放。但这有悖于TextToSpeech的应用流程，可以将刚刚输出的语音资源通过addSpeech()的方法将其语音和文字描述一同存储于TTS库中。</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">mTts.addSpeech(wakeUpText, destFileName);</pre>
<p style="text-align: left;">在当前的TTS Instance中，任何利用Speak()方法执行相同内容的调用都将复用刚刚所生成的音频文件。如果资源丢失或者SDCard等存储设备移除，那么系统将再次通过TTS Engine合成所指定的语音内容。</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">mTts.speak(wakeUpText, TextToSpeech.QUEUE_ADD, myHashAlarm);</pre>
<p style="text-align: left;"><strong>回收TTS：</strong></p>
<p style="text-align: left;">当确定应用程序不再需要TTS的相关功能后，可以在<a target="_blank" href="http://www.androidres.com/index.php/2009/02/09/activity/" target="_blank"><span style="color: #008000;">Activity</span></a>的<span style="color: #008000;">OnDestroy()</span>方法中调用<a href="http://developer.android.com/reference/android/speech/tts/TextToSpeech.html#shutdown()" target="_blank"><span style="color: #008000;">shutDown()</span></a>释放当前TTS实体所占用的资源。</p>
<p style="text-align: left;"><strong>杂谈：</strong></p>
<p style="text-align: left;">想必在你的脑袋中已经冒出好多可以很好利用这个功能的Idea！那么现在就停止想象，开始付诸于行动吧！无论是给手机用户带来方便，或是提升游戏体验等。Let&#8217;s move!</p>
<p style="text-align: left;">查看原文：<a target="_blank" href="http://android-developers.blogspot.com/2009/09/introduction-to-text-to-speech-in.html" target="_blank">Android官方Blog</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.androidres.com/index.php/2009/09/29/an-introduction-to-text-to-speech-in-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>致经常关注AndroidRes成长的战友们！</title>
		<link>http://www.androidres.com/index.php/2009/09/25/thank-you-for-supporting-us/</link>
		<comments>http://www.androidres.com/index.php/2009/09/25/thank-you-for-supporting-us/#comments</comments>
		<pubDate>Thu, 24 Sep 2009 17:50:26 +0000</pubDate>
		<dc:creator>EGGer</dc:creator>
				<category><![CDATA[Essay]]></category>
		<category><![CDATA[NFSWO]]></category>

		<guid isPermaLink="false">http://www.androidres.com/?p=660</guid>
		<description><![CDATA[
首先，要感谢那些一如既往关注AR发展的朋友们！尽管很少留下足迹，但你们大家的存在就是AndroidRes成长所需的动力！它会一如既往的帮助大家搜集最新的技术专题讲解和有用的小技巧。
其次，最近内容的更新频率稍有下降，在阐述原因之前先对大家表示歉意！此前网站的维护和更新完全是利用自己比较宽裕的休闲时间一点一滴的积累，然而目前情况有了比较大的变化，大部分精力都要投入在 Need For Speed World Online (中文名：《极速快感 online》，又名《极品飞车 -Online》)的研发上，目的是为了追求最高品质的现代竞速网游。为此AndroidRes的成长会受到一定程度的影响，但是依然会用最大的努力拧出一些时间来继续维持网站的脉搏。这样的状态暂时无法确定将会持续多久，但可以肯定的是一定要到游戏最终的发布（各种宗教的神灵都来保佑吧！）。大家可以通过极品飞车Online》官方Blog了解游戏的最新进展。
最后，再次感谢大家的理解和宽容！祝愿你们能在Android的世界里自由的创新出丰富的应用！用你的智慧，改变我们的生活。
无法保障每天都会有新鲜内容的条件下，提倡大家通过Google Reader或者其它RSS订阅工具来关注AndroidRes的动态。
]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-661" title="Need For Speed World Online" src="http://www.androidres.com/wp-content/uploads/2009/09/needforspeedworldonline.jpg" alt="Need For Speed World Online" width="530" height="135" /></p>
<p style="text-align: left;">首先，要感谢那些一如既往关注AR发展的朋友们！尽管很少留下足迹，但你们大家的存在就是AndroidRes成长所需的动力！它会一如既往的帮助大家搜集最新的技术专题讲解和有用的小技巧。</p>
<p style="text-align: left;">其次，最近内容的更新频率稍有下降，在阐述原因之前先对大家表示歉意！<span id="more-660"></span>此前网站的维护和更新完全是利用自己比较宽裕的休闲时间一点一滴的积累，然而目前情况有了比较大的变化，大部分精力都要投入在 Need For Speed World Online (中文名：《<a target="_blank" href="http://www.nfswo.com.tw/teaser/" target="_blank">极速快感 online</a>》，又名《<a target="_blank" href="http://www.nfswo.com.tw/teaser/" target="_blank">极品飞车 -Online</a>》)的研发上，目的是为了追求最高品质的现代竞速网游。为此AndroidRes的成长会受到一定程度的影响，但是依然会用最大的努力拧出一些时间来继续维持网站的脉搏。这样的状态暂时无法确定将会持续多久，但可以肯定的是一定要到游戏最终的发布（各种宗教的神灵都来保佑吧！）。大家可以通过<a target="_blank" href="http://eatw.pixnet.net/blog" target="_blank">极品飞车Online》官方Blog</a>了解游戏的最新进展。</p>
<p style="text-align: left;">最后，再次感谢大家的理解和宽容！祝愿你们能在Android的世界里自由的创新出丰富的应用！用你的智慧，改变我们的生活。</p>
<p><strong>无法保障每天都会有新鲜内容的条件下，提倡大家通过Google Reader或者其它<a target="_blank" href="http://feeds2.feedburner.com/AndroidResource" target="_blank">RSS</a>订阅工具来关注AndroidRes的动态。</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.androidres.com/index.php/2009/09/25/thank-you-for-supporting-us/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
