<?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>liulang&#039;s blog &#187; 移动开发</title>
	<atom:link href="http://www.liulang.cq.cn/category/mobile/feed" rel="self" type="application/rss+xml" />
	<link>http://www.liulang.cq.cn</link>
	<description>既然选择了远方，便只顾风雨兼程……</description>
	<lastBuildDate>Mon, 05 Dec 2011 15:49:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>给Android应用开发者的十个建议</title>
		<link>http://www.liulang.cq.cn/20111205/10-android-app-performance-tips-for-developers.html</link>
		<comments>http://www.liulang.cq.cn/20111205/10-android-app-performance-tips-for-developers.html#comments</comments>
		<pubDate>Mon, 05 Dec 2011 15:49:44 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=315</guid>
		<description><![CDATA[尽管现在Android智能手机和平板电脑的运行速率越来越快，但开发者仍需牢记，应用的运行环境仍受到电池和处理器等诸多资源的限制。以下是如何为应用“瘦身”的十条建议，以便能在当前和以后的所有Android设备都能运行出最佳效果。 1）首先要有良好的编码习惯 一个优秀的开发者应该善于运用常识、完善的算法和标准设计模式。要有资源意识，打开了就要记得关闭，尽量做到晚获取，早释放。这些由来已久的编码准则同样适用Android应用开发，尤其是使用基础设备服务时。 2）让阻塞操作远离主UI线程 通过使用AsyncTask、线程、IntentService和自定义后台服务，保证应用的灵活性。使用加载工具简化游标等长时间加载数据的状态管理。当有其他程序运行时，不能让你的应用滞后或中止。 如果一个操作需要消耗较多时间和资源时，取消该操作，换成异步处理，这样应用就能保持响应，用户可以继续各种操作。该方法适用磁盘读写、访问内容提供方、数据库和互联网，以及解析和其他需要花费较长时间的任务。 3）使用最新的Android SDK版本和API 使用Android平台的最新产品，保证你的应用紧跟Android的更新步伐。随着Android平台的不断发展，部分功能可能被弃用或被更好的功能 取代，核心API接收了bug修复和性能改进，新API有助于开发者编写出更稳定的应用。要明白最佳的做法总是随着时间的推移而变，聪明的开发者应该总是 站在整个平台的最前沿。 4）考虑使用StrictMode 从Android 2.3开始提供了一个新的类StrictMode，该类可以用于捕捉发生在应用程序主线程中耗时的磁盘、网络访问或函数调用，可以帮助开发者改进程序，使主线程处理UI和动画在磁盘读写和网络操作时变得更平滑，避免主线程被阻塞。 5）发布前禁用或尽量减少调试 如果开发周期较长，你很可能在应用中内置了一些日志或调试代码，在发布前确保这些功能已经最小化或完全禁用。 6）确保UI布局简单优雅 简单的屏幕不仅方便阅读，还能加快加载速度。与其在一个单一屏幕上堆砌太多不必要的功能，不如花时间去开发优雅的用户界面。简单优雅的UI不仅能提高应用性能，还能提高用户使用该应用时的效率。 7）根据目标设备调整应用资源 为尽可能高效地被加载，需要根据具体设备的配置调整相应资源，尤其是图片资源。为使应用包文件合理适用不同设备，首先可只添加运行该应用需要的核心资源，然后再根据具体设备下载相关内容。 8）使用Hierachy Viewer可视化调试工具 Hierachy Viewer能很方便地在开发者设计，调试和调整界面时，快速定位问题，解决问题，提高开发效率。 9）使用layoutopt进行布局优化 Layoutopt是一款简单的命令行工具，可帮助找到不必要的控件嵌套以及缩减布局资源，从而使应用变得可能“苗条”。控件越少、布局层次越浅，性能就越好。 10）使用Traceview及其他Android工具进行分析 Android SDK随带了很多用于应用分析的工具，其中最受欢迎的是Traceview，这款图形工具可以帮助调试和找到应用中的性能瓶颈。 结语 提升Android应用性能的方法有很多，有些需要使用特定的算法，有些依赖切实可行的调试和性能监测技术。幸运的是，Android平台随带了众多免费的实用工具，可以帮助跟踪和解决应用程序中的性能问题。]]></description>
			<content:encoded><![CDATA[<p>尽管现在Android智能手机和平板电脑的运行速率越来越快，但开发者仍需牢记，应用的运行环境仍受到电池和处理器等诸多资源的限制。以下是如何为应用“瘦身”的十条建议，以便能在当前和以后的所有Android设备都能运行出最佳效果。</p>
<p><strong>1）首先要有良好的编码习惯</strong></p>
<p>一个优秀的开发者应该善于运用常识、完善的算法和标准设计模式。要有资源意识，打开了就要记得关闭，尽量做到晚获取，早释放。这些由来已久的编码准则同样适用Android应用开发，尤其是使用基础设备服务时。<br />
<span id="more-315"></span><br />
<strong>2）让阻塞操作远离主UI线程</strong></p>
<p>通过使用AsyncTask、线程、IntentService和自定义后台服务，保证应用的灵活性。使用加载工具简化游标等长时间加载数据的状态管理。当有其他程序运行时，不能让你的应用滞后或中止。</p>
<p>如果一个操作需要消耗较多时间和资源时，取消该操作，换成异步处理，这样应用就能保持响应，用户可以继续各种操作。该方法适用磁盘读写、访问内容提供方、数据库和互联网，以及解析和其他需要花费较长时间的任务。</p>
<p><strong>3）使用最新的Android SDK版本和API</strong></p>
<p>使用Android平台的最新产品，保证你的应用紧跟Android的更新步伐。随着Android平台的不断发展，部分功能可能被弃用或被更好的功能 取代，核心API接收了bug修复和性能改进，新API有助于开发者编写出更稳定的应用。要明白最佳的做法总是随着时间的推移而变，聪明的开发者应该总是 站在整个平台的最前沿。</p>
<p><strong>4）考虑使用StrictMode</strong></p>
<p>从Android 2.3开始提供了一个新的类StrictMode，该类可以用于捕捉发生在应用程序主线程中耗时的磁盘、网络访问或函数调用，可以帮助开发者改进程序，使主线程处理UI和动画在磁盘读写和网络操作时变得更平滑，避免主线程被阻塞。</p>
<p><strong>5）发布前禁用或尽量减少调试</strong></p>
<p>如果开发周期较长，你很可能在应用中内置了一些日志或调试代码，在发布前确保这些功能已经最小化或完全禁用。</p>
<p><strong>6）确保UI布局简单优雅</strong></p>
<p>简单的屏幕不仅方便阅读，还能加快加载速度。与其在一个单一屏幕上堆砌太多不必要的功能，不如花时间去开发优雅的用户界面。简单优雅的UI不仅能提高应用性能，还能提高用户使用该应用时的效率。</p>
<p><strong>7）根据目标设备调整应用资源</strong></p>
<p>为尽可能高效地被加载，需要根据具体设备的配置调整相应资源，尤其是图片资源。为使应用包文件合理适用不同设备，首先可只添加运行该应用需要的核心资源，然后再根据具体设备下载相关内容。</p>
<p><strong>8）使用Hierachy Viewer可视化调试工具</strong></p>
<p>Hierachy Viewer能很方便地在开发者设计，调试和调整界面时，快速定位问题，解决问题，提高开发效率。</p>
<p><strong>9）使用layoutopt进行布局优化</strong></p>
<p>Layoutopt是一款简单的命令行工具，可帮助找到不必要的控件嵌套以及缩减布局资源，从而使应用变得可能“苗条”。控件越少、布局层次越浅，性能就越好。</p>
<p><strong>10）使用Traceview及其他Android工具进行分析</strong></p>
<p>Android SDK随带了很多用于应用分析的工具，其中最受欢迎的是Traceview，这款图形工具可以帮助调试和找到应用中的性能瓶颈。</p>
<p><strong>结语</strong></p>
<p>提升Android应用性能的方法有很多，有些需要使用特定的算法，有些依赖切实可行的调试和性能监测技术。幸运的是，Android平台随带了众多免费的实用工具，可以帮助跟踪和解决应用程序中的性能问题。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20111205/10-android-app-performance-tips-for-developers.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>install Android Ice Cream Sandwich on a Samsung Nexus S</title>
		<link>http://www.liulang.cq.cn/20111122/install-android-ice-cream-sandwich-on-a-samsung-nexus-s.html</link>
		<comments>http://www.liulang.cq.cn/20111122/install-android-ice-cream-sandwich-on-a-samsung-nexus-s.html#comments</comments>
		<pubDate>Tue, 22 Nov 2011 08:13:10 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[操作系统]]></category>
		<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=310</guid>
		<description><![CDATA[1. Download the custom ROM Hit up XDA-Developers and download the Nexus S custom ROM (v2, “no need for wifi patch”). If you have a 4G Nexus S, you can download the appropriate custom ROM, but we haven’t tested it — &#8230; <a href="http://www.liulang.cq.cn/20111122/install-android-ice-cream-sandwich-on-a-samsung-nexus-s.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h3>1. Download the custom ROM</h3>
<p>Hit up XDA-Developers and <a href="http://forum.xda-developers.com/showthread.php?t=1354263">download the Nexus S custom ROM</a> (v2, “no need for wifi patch”). If you have a 4G Nexus S, you can download the appropriate custom ROM, but we haven’t tested it — so be careful.</p>
<p>Once the zip file is downloaded, transfer it to your phone’s SD card.</p>
<p>&nbsp;</p>
<h3>2. Root your phone and install ROM Manager</h3>
<p><a href="http://www.extremetech.com/wp-content/uploads/2011/11/rom-manager-menu.jpg"><img title="ROM Manager" src="http://www.extremetech.com/wp-content/uploads/2011/11/rom-manager-menu-300x295.jpg" alt="ROM Manager" width="300" height="295" /></a></p>
<p><a href="http://www.extremetech.com/wp-content/uploads/2011/11/rom-manager-menu.jpg"></a> If you’re already using <a href="http://www.cyanogenmod.com/">CyanogenMod</a> (which hopefully you are), your phone will already be rooted and have <a href="https://market.android.com/details?id=com.koushikdutta.rommanager&amp;hl=en">ROM Manager</a> installed. Otherwise, you’re going to have to root your phone. This isn’t particularly hard, but it is a multi-step process, and there’s a risk that you could brick your Nexus S. The best way to do this is to <a href="http://www.youtube.com/watch?v=FZMAkp89fao">follow a video guide</a>, but googling for “how to root nexus s” works as well.</p>
<p>With ROM Manager installed, open it up and make sure the latest version of the ClockworkMod recovery image is installed (“Flash Clockwork Mod Recovery” — see right).</p>
<h3>3. Make a backup!</h3>
<p>Scroll down in ROM Manager and select “Backup Current ROM.” This will back up all of the system and app data on your phone — but not any data on your SD card, such as photos or music. This backup is saved on your phone’s SD card, in the “clockworkmod” directory — and once it’s done, you should copy this to your computer via USB. You will need this backup if you want to restore your phone to its pre-ICS state.</p>
<p><strong>Installing ICS on your Nexus S should not affect the contents of your SD card</strong>, but it’s always wise to make a copy of your photos and videos, just in case. To do so, plug your phone into a computer and transfer the files via USB.</p>
<p><strong>Please bear in mind that installing this build of ICS will completely wipe out your installed apps.</strong>You can reinstall them, but you will lose all of your settings. You shouldn’t proceed unless you really want to try out Ice Cream Sandwich. Remember, though, that you should be able to restore your backup without issue — so you do have a way out.</p>
<h3>4. Install Android 4 on your Nexus S</h3>
<p><a href="http://www.extremetech.com/wp-content/uploads/2011/11/rom-manager-wipe.jpg"><img title="ROM Manager, wipe data and cache" src="http://www.extremetech.com/wp-content/uploads/2011/11/rom-manager-wipe-246x300.jpg" alt="ROM Manager, wipe data and cache" width="246" height="300" /></a></p>
<p><a href="http://www.extremetech.com/wp-content/uploads/2011/11/rom-manager-wipe.jpg"></a> Now, from ROM Manager, hit “Install ROM from SD Card,” and surf to the zip file on your SD card (“ics-crespo-aosp-4.0.1-v2-unsigned.zip” or similar). Select “Wipe Data and Cache” and “Wipe Dalvik Cache” from the menu and press OK (see right).</p>
<p>ICS will now install. Your phone will reboot, and in about 60 seconds you’ll be greeted by Ice Cream Sandwich’s phone setup screens, and then some basic tutorials.</p>
<p><strong>Welcome to Ice Cream Sandwich!</strong> This build is pre-rooted, so to revert to Gingerbread you will simply have to re-install ROM Manager and restore your backup..</p>
<p>&nbsp;</p>
<p>国内rom传送:</p>
<p><a href="http://115.com/file/cljnf2ks#">http://115.com/file/cljnf2ks#</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20111122/install-android-ice-cream-sandwich-on-a-samsung-nexus-s.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>(转)区分Activity的四种加载模式</title>
		<link>http://www.liulang.cq.cn/20110425/activity-four-launchmode.html</link>
		<comments>http://www.liulang.cq.cn/20110425/activity-four-launchmode.html#comments</comments>
		<pubDate>Mon, 25 Apr 2011 06:33:38 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=305</guid>
		<description><![CDATA[转自：http://marshal.easymorse.com/archives/2950 在多Activity开发中，有可能是自己应用之间的Activity跳转，或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例，而不是产生大量重复的Activity。 这需要为Activity配置特定的加载模式，而不是使用默认的加载模式。 加载模式分类及在哪里配置 Activity有四种加载模式： standard singleTop singleTask singleInstance 设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性： &#60;activity android:name=”ActB” android:launchMode=”singleTask”&#62;&#60;/activity&#62; 也可以在Eclipse ADT中图形界面中编辑： &#160; 区分Activity的加载模式，通过示例一目了然。这里编写了一个Activity A（ActA）和Activity B（ActB）循环跳转的例子。对加载模式修改和代码做稍微改动，就可以说明四种模式的区别。 standard 首先说standard模式，也就是默认模式，不需要配置launchMode。先只写一个名为ActA的Activity： package com.easymorse.activities; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; public class &#8230; <a href="http://www.liulang.cq.cn/20110425/activity-four-launchmode.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>转自：<a href="http://marshal.easymorse.com/archives/2950">http://marshal.easymorse.com/archives/2950</a></p>
<p>在多Activity开发中，有可能是自己应用之间的Activity跳转，或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例，而不是产生大量重复的Activity。</p>
<p>这需要为Activity配置特定的加载模式，而不是使用默认的加载模式。</p>
<p><span id="more-305"></span></p>
<h4>加载模式分类及在哪里配置</h4>
<p>Activity有四种加载模式：</p>
<ul>
<li>standard</li>
<li>singleTop</li>
<li>singleTask</li>
<li>singleInstance</li>
</ul>
<p>设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性：</p>
<blockquote><p>&lt;activity android:name=”ActB” <strong>android:launchMode</strong>=”singleTask”&gt;&lt;/activity&gt;</p></blockquote>
<p>也可以在Eclipse ADT中图形界面中编辑：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image54.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb54.png" border="0" alt="image" width="498" height="144" /></a></p>
<p>&nbsp;</p>
<p>区分Activity的加载模式，通过示例一目了然。这里编写了一个Activity A（ActA）和Activity B（ActB）循环跳转的例子。对加载模式修改和代码做稍微改动，就可以说明四种模式的区别。</p>
<h4>standard</h4>
<p>首先说standard模式，也就是默认模式，不需要配置launchMode。先只写一个名为ActA的Activity：</p>
<blockquote><p>package com.easymorse.activities;</p>
<p>import android.app.Activity;<br />
import android.content.Intent;<br />
import android.os.Bundle;<br />
import android.view.View;<br />
import android.view.View.OnClickListener;<br />
import android.widget.Button;<br />
import android.widget.LinearLayout;<br />
import android.widget.TextView;</p>
<p>public class ActA extends Activity {<br />
/** Called when the activity is first created. */<br />
@Override<br />
public void onCreate(Bundle savedInstanceState) {<br />
super.onCreate(savedInstanceState);<br />
TextView textView = new TextView(this);<br />
textView.setText(this + “”);<br />
Button button = new Button(this);<br />
button.setText(“go actA”);<br />
button.setOnClickListener(new OnClickListener() {<br />
@Override<br />
public void onClick(View v) {<br />
Intent intent = new Intent();<br />
intent.setClass(ActA.this, ActA.class);<br />
startActivity(intent);<br />
}<br />
});<br />
LinearLayout layout = new LinearLayout(this);<br />
layout.setOrientation(LinearLayout.VERTICAL);<br />
layout.addView(textView);<br />
layout.addView(button);<br />
this.setContentView(layout);<br />
}<br />
}</p></blockquote>
<p>例子中都没有用layout，免得看着罗嗦。可见是ActA –&gt; ActA的例子。在界面中打印出对象的toString值可以根据hash code识别是否创建新ActA实例。</p>
<p>第一个界面：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image55.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb55.png" border="0" alt="image" width="244" height="101" /></a></p>
<p>点击按钮后：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image56.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb56.png" border="0" alt="image" width="244" height="114" /></a></p>
<p>可以多点几次。发现每次都创建了该Activity的新实例。standard的加载模式就是这样的，intent将发送给新的实例。</p>
<p>现在点Android设备的回退键，可以看到是按照刚才创建Activity实例的倒序依次出现，类似退栈的操作，而刚才操作跳转按钮的过程是压栈的操作。如下图：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image57.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb57.png" border="0" alt="image" width="244" height="233" /></a></p>
<p>&nbsp;</p>
<h4>singleTop</h4>
<p>singleTop和standard模式，都会将intent发送新的实例（后两种模式不发送到新的实例，如果已经有了的话）。不过，singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例，则将intent发送给该实例，而不发送给新的实例。</p>
<p>还是用刚才的示例，只需将launchMode改为singleTop，就能看到区别。</p>
<p>运行的时候会发现，按多少遍按钮，都是相同的ActiA实例，因为该实例在栈顶，因此不会创建新的实例。如果回退，将退出应用。</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image58.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb58.png" border="0" alt="image" width="244" height="144" /></a></p>
<p>singleTop模式，可用来解决栈顶多个重复相同的Activity的问题。</p>
<p>如果是A Activity跳转到B Activity，再跳转到A Activity，行为就和standard一样了，会在B Activity跳转到A Activity的时候创建A Activity的新实例，因为当时的栈顶不是A Activity实例。</p>
<p>ActA类稍作改动：</p>
<blockquote><p>package com.easymorse.activities;</p>
<p>import android.app.Activity;<br />
import android.content.Intent;<br />
import android.os.Bundle;<br />
import android.view.View;<br />
import android.view.View.OnClickListener;<br />
import android.widget.Button;<br />
import android.widget.LinearLayout;<br />
import android.widget.TextView;</p>
<p>public class ActA extends Activity {<br />
/** Called when the activity is first created. */<br />
@Override<br />
public void onCreate(Bundle savedInstanceState) {<br />
super.onCreate(savedInstanceState);<br />
TextView textView = new TextView(this);<br />
textView.setText(this + “”);<br />
Button button = new Button(this);<br />
button.setText(“go actB”);<br />
button.setOnClickListener(new OnClickListener() {<br />
@Override<br />
public void onClick(View v) {<br />
Intent intent = new Intent();<br />
intent.setClass(ActA.this, ActB.class);<br />
startActivity(intent);<br />
}<br />
});<br />
LinearLayout layout = new LinearLayout(this);<br />
layout.setOrientation(LinearLayout.VERTICAL);<br />
layout.addView(textView);<br />
layout.addView(button);<br />
this.setContentView(layout);<br />
}<br />
}</p>
<p>&nbsp;</p></blockquote>
<p>ActB类：</p>
<blockquote><p>package com.easymorse.activities;</p>
<p>import android.app.Activity;<br />
import android.content.Intent;<br />
import android.os.Bundle;<br />
import android.view.View;<br />
import android.view.View.OnClickListener;<br />
import android.widget.Button;<br />
import android.widget.LinearLayout;</p>
<p>public class ActB extends Activity {<br />
@Override<br />
protected void onCreate(Bundle savedInstanceState) {<br />
super.onCreate(savedInstanceState);<br />
Button button=new Button(this);<br />
button.setText(“go actA”);<br />
button.setOnClickListener(new OnClickListener() {<br />
@Override<br />
public void onClick(View v) {<br />
Intent intent=new Intent();<br />
intent.setClass(ActB.this, ActA.class);<br />
startActivity(intent);<br />
}<br />
});<br />
LinearLayout layout=new LinearLayout(this);<br />
layout.addView(button);<br />
this.setContentView(layout);<br />
}<br />
}</p>
<p>&nbsp;</p></blockquote>
<p>ActB类使用默认（standard）加载，ActA使用singleTop加载。结果类似下图：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image59.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb59.png" border="0" alt="image" width="244" height="211" /></a></p>
<p>如果把ActA的加载模式改为standard，情况一样。</p>
<h4>singleTask</h4>
<p>singleTask模式和后面的singleInstance模式都是只创建一个实例的。</p>
<p>当intent到来，需要创建singleTask模式Activity的时候，系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。</p>
<p>把上面singleTop的实例中的ActA的launchMode改为singleTask，ActB的改为standard。那么会发现在ActA界面中按一次按钮：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image60.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb60.png" border="0" alt="image" width="244" height="217" /></a></p>
<p>然后在ActB1界面中按按钮，因为ActA是singleTask，会使用原来的ActA1实例。这时候栈内的情况:</p>
<p>&nbsp;</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image61.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb61.png" border="0" alt="image" width="244" height="134" /></a></p>
<p>如果多次按按钮跳转，会发现始终只有ActA1这一个ActA类的实例。</p>
<p>&nbsp;</p>
<h4>singleInstance</h4>
<p>解释singleInstance模式比较麻烦。</p>
<p>首先要说一下Task（任务）的概念。</p>
<p>如果是Swing或者Windows程序，可能有多个窗口可以切换，但是你无法在自己程序中复用人家的窗口。注意是直接复用人家的二进制代码，不是你拿到人家api后的源代码级调用。</p>
<p>Android可以做到，让别人的程序直接复用你的Activity（类似桌面程序的窗口）。</p>
<p>Android为提供这种机制，就引入了Task的概念。Task可以认为是一个栈，可放入多个Activity。比如启动一个应用，那么Android就创建了一个Task，然后启动这个应用的入口Activity，就是intent-filter中配置为main和launch的那个（见<a title="一个APK文件部署产生多个应用安装的效果" href="http://marshal.easymorse.com/archives/2929">一个APK文件部署产生多个应用安装的效果</a>）。这个Activity是根（Root）Activity，可能会在它的界面调用其他Activity，这些Activity如果按照上面那三个模式，也会在这个栈（Task）中，只是实例化的策略不同而已。</p>
<p>验证的办法是调用和打印Activity的taskId：</p>
<blockquote><p>TextView textView2 = new TextView(this);<br />
textView2.setText(“task id: “+this.getTaskId());</p></blockquote>
<p>会发现，无论切换Activity，taskId是相同的。</p>
<p>当然也可以在这个单一的Task栈中，放入别人的Activity，比如google地图，这样用户看过地图按回退键的时候，会退栈回到调用地图的Activity。对用户来说，并不觉得在操作多个应用。这就是Task的作用。</p>
<p>但是，有这样的需求，多个Task共享一个Activity（singleTask是在一个task中共享一个Activity）。</p>
<p>现成的例子是google地图。比如我有一个应用是导游方面的，其中调用的google地图Activity。那么现在我比如按home键，然后到应用列表中打开google地图，你会发现显示的就是刚才的地图，实际上是同一个Activity。</p>
<p>如果使用上面三种模式，是无法实现这个需求的。google地图应用中有多个上下文Activity，比如路线查询等的，导游应用也有一些上下文Activity。在各自应用中回退要回退到各自的上下文Activity中。</p>
<p>singleInstance模式解决了这个问题（绕了这么半天才说到正题）。让这个模式下的Activity单独在一个task栈中。这个栈只有一个Activity。导游应用和google地图应用发送的intent都由这个Activity接收和展示。</p>
<p>这里又有两个问题：</p>
<ul>
<li>如果是这种情况，多个task栈也可以看作一个应用。比如导游应用启动地图Activity，实际上是在导游应用task栈之上singleInstance模式创建的（如果还没有的话，如果有就是直接显示它）一个新栈，当这个栈里面的唯一Activity，地图Activity回退的时候，只是把这个栈移开了，这样就看到导游应用刚才的Activity了；</li>
<li>多个应用（Task）共享一个Activity要求这些应用都没有退出，比如刚才强调要用home键从导游应用切换到地图应用。因为，如果退出导游应用，而这时也地图应用并未运行的话，那个单独的地图Activity（task）也会退出了。</li>
</ul>
<p>如果还是拿刚才的ActA和ActB的示例，可以把ActB的模式改为singleInstance，ActA为standard，如果按一次按钮切换到ActB，看到现象用示意图类似这样：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image62.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb62.png" border="0" alt="image" width="244" height="222" /></a></p>
<p>如果是第一次按钮切换到ActB，在ActB在按按钮切换到ActA，然后再回退，示意图是：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image63.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb63.png" border="0" alt="image" width="342" height="166" /></a></p>
<p>另外，可以看到两个Activity的taskId是不同的。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20110425/activity-four-launchmode.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android开发者必须深入学习的10个应用开源项目</title>
		<link>http://www.liulang.cq.cn/20101218/androiddev-10-opensourceproject.html</link>
		<comments>http://www.liulang.cq.cn/20101218/androiddev-10-opensourceproject.html#comments</comments>
		<pubDate>Sat, 18 Dec 2010 13:37:29 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=297</guid>
		<description><![CDATA[Android开发又将带来新一轮热潮，很多开发者都投入到这个浪潮中去了，创造了许许多多相当优秀的应用。其中也有许许多多的开发者提供了应用开 源项 目，贡献出他们的智慧和创造力。学习开源代码是掌握技术的一个最佳方式。下面推荐几个应用开源项目，这些项目不仅提供了优秀的创意，也可以直接掌握 Android内核的接口使用： 1、Android团队提供的示例项目 如果不是从学习Android SDK中提供的那些样例代码开始，可能没有更好的方法来掌握在Android这个框架上开发。由Android的核心开发团队提供了15个优秀的示例项 目，包含了游戏、图像处理、时间显示、开始菜单快捷方式等。 地址：http://code.google.com/p/apps-for-android/ 2、 Remote Droid RemoteDroid是一个Android应用，能够让用户使用自己的无线网络使用无线键盘、触摸屏操作手机。这个项目为开发者提供了如网络连接、触 摸屏手指运动等很好的样例。 地址：http://code.google.com/p/remotedroid/ 3、 TorProxy和Shadow TorProxy应用实现了Android手机无线电电传通讯(TOR)，和Shadow应用一起使用，可以使用手机匿名上网。从该项目源代码中，可以 掌握socket连接、管理cookie等方法。 地址：http://www.cl.cam.ac.uk/research/dtg/code/svn/android-tor/ http://www.cl.cam.ac.uk/research/dtg/android/tor/ 4、 Android SMSPopup SMSPopup可以截获短信内容显示在一个泡泡形状的窗口中。从这个项目中可以掌握到如何使用内置的短信SMS接口。 地址：http://code.google.com/p/android-smspopup/ 5、 Standup Timer Standup Timer应用用于控制站立会议时间，类似秒表倒计时，可以提醒每个人的讲话时间已到，从而保证每个与会者使用时间一样。从该项目的代码中，可以学会如何 使用时间函数。另外，这个项目的代码是采用视图view、模型model严格分离的设计思路。 地址：http://github.com/jwood/standup-timer 6、 Foursquare 是Foursquare.com的一个客户端应用，该应用主要分为两个模块：API(com.joelapenna.foursquare)和界面前端 (com.joelapenna.foursquared)两部分。从该项目代码中，可以学会如何同步、多线程、HTTP连接等技术。 地址：http://code.google.com/p/foursquared/ 7、 Pedometer &#8230; <a href="http://www.liulang.cq.cn/20101218/androiddev-10-opensourceproject.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Android开发又将带来新一轮热潮，很多开发者都投入到这个浪潮中去了，创造了许许多多相当优秀的应用。其中也有许许多多的开发者提供了应用开 源项 目，贡献出他们的智慧和创造力。学习开源代码是掌握技术的一个最佳方式。下面推荐几个应用开源项目，这些项目不仅提供了优秀的创意，也可以直接掌握 Android内核的接口使用：</p>
<p><span id="more-297"></span></p>
<p><strong>1、Android团队提供的示例项目</strong><br />
如果不是从学习Android SDK中提供的那些样例代码开始，可能没有更好的方法来掌握在Android这个框架上开发。由Android的核心开发团队提供了15个优秀的示例项 目，包含了游戏、图像处理、时间显示、开始菜单快捷方式等。<br />
地址：<a href="http://i.ctoof.com/link.php?url=http://code.google.com%2Fp%2Fapps-for-android%2F" target="_blank">http://code.google.com/p/apps-for-android/</a></p>
<p><strong>2、 Remote Droid</strong><br />
RemoteDroid是一个Android应用，能够让用户使用自己的无线网络使用无线键盘、触摸屏操作手机。这个项目为开发者提供了如网络连接、触 摸屏手指运动等很好的样例。<br />
地址：<a href="http://i.ctoof.com/link.php?url=http://code.google.com%2Fp%2Fremotedroid%2F" target="_blank">http://code.google.com/p/remotedroid/<br />
</a><br />
<strong>3、 TorProxy和Shadow</strong><br />
TorProxy应用实现了Android手机无线电电传通讯(TOR)，和Shadow应用一起使用，可以使用手机匿名上网。从该项目源代码中，可以 掌握socket连接、管理cookie等方法。<br />
地址：<a href="http://www.cl.cam.ac.uk/research/dtg/code/svn/android-tor/" target="_blank">http://www.cl.cam.ac.uk/research/dtg/code/svn/android-tor/</a><br />
<a href="http://www.cl.cam.ac.uk/research/dtg/android/tor/" target="_blank">http://www.cl.cam.ac.uk/research/dtg/android/tor/</a></p>
<p><strong>4、 Android SMSPopup</strong><br />
SMSPopup可以截获短信内容显示在一个泡泡形状的窗口中。从这个项目中可以掌握到如何使用内置的短信SMS接口。<br />
地址：<a href="http://code.google.com/p/android-smspopup/" target="_blank">http://code.google.com/p/android-smspopup/</a></p>
<p><strong>5、 Standup Timer</strong><br />
Standup Timer应用用于控制站立会议时间，类似秒表倒计时，可以提醒每个人的讲话时间已到，从而保证每个与会者使用时间一样。从该项目的代码中，可以学会如何 使用时间函数。另外，这个项目的代码是采用视图view、模型model严格分离的设计思路。<br />
地址：<a href="http://github.com/jwood/standup-timer" target="_blank">http://github.com/jwood/standup-timer</a></p>
<p><strong>6、 Foursquare</strong><br />
是Foursquare.com的一个客户端应用，该应用主要分为两个模块：API(com.joelapenna.foursquare)和界面前端 (com.joelapenna.foursquared)两部分。从该项目代码中，可以学会如何同步、多线程、HTTP连接等技术。<br />
地址：<a href="http://code.google.com/p/foursquared/" target="_blank">http://code.google.com/p/foursquared/</a></p>
<p><strong>7、 Pedometer</strong><br />
Pedometer应用用于记录你每天走路步数的。尽管记录不一定精准，但是从这个项目中，可以学习几个不同的技术：加速器交互、语音更新、后台运行服 务等。<br />
地址：<a href="http://code.google.com/p/pedometer/" target="_blank">http://code.google.com/p/pedometer/</a></p>
<p><strong>8、 OpenSudoku-android</strong><br />
OpenSudoku是一个简单的九宫格数独游戏。从代码中可以学习到如何在视图中显示表格数据，以及如何和一个网站交互等技术。<br />
地址：<a href="http://code.google.com/p/opensudoku-android/" target="_blank">http://code.google.com/p/opensudoku-android/</a></p>
<p><strong>9、 ConnectBot</strong><br />
ConnectBot是Android平台的一个客户端安全壳应用。从该项目代码中，可以学习到很多Android安全方面的内容，这些是你在开发应用 时经常需要考虑的安全问题。<br />
地址：<a href="http://code.google.com/p/connectbot/" target="_blank">http://code.google.com/p/connectbot/<br />
</a><br />
<strong>10、 WordPress的Android应用</strong><br />
当然在最后不能不提Wordpress的Android应用了，这是Wordpress官方开发团队提供的一个项目。从代码中可以学习到XMLRPC调 用（当然还有更多的优秀内容）。<br />
地址：<a href="http://android.svn.wordpress.org/trunk/" target="_blank">http://android.svn.wordpress.org/trunk/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20101218/androiddev-10-opensourceproject.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>编译 android 2.1 (eclair) 源码 For HTC G1</title>
		<link>http://www.liulang.cq.cn/20101218/android-2-1-eclair-for-htc-g1.html</link>
		<comments>http://www.liulang.cq.cn/20101218/android-2-1-eclair-for-htc-g1.html#comments</comments>
		<pubDate>Sat, 18 Dec 2010 12:37:22 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=292</guid>
		<description><![CDATA[1. 说明 1) 下载编译最基本的android源码，无法在真机上使用（不能生成boot.img），只能在模拟器上使用。这是因为没有编译相关机型的内核和硬件 驱动。以下介绍的是用android源码编译出对应HTC G1的版本，和烧写的过程。编译生成的版本除相机不能用之外，其它绝大 部分功能都能正常使用，在G1上运行2.1版的速度也不错。 2) 本文主要参考日文文档G1/G2烧机指南，感谢原文作者，原文地址： http://code.google.com/p/android-development-environment/wiki/EclaironADP1andADP2 同时加入中文系统 的支持和JIT支持（提高速 度），以及相关文字解释。 3) 以下步骤都经过验证（只验证G1手机，G2部分请参见日文文档），实验系统ubuntu8.04，实验日期2010年5月8日 4) 关键字: android 2.1 eclair g1 源码编译 2. 建立android源码编译目录 $ export ANDROID=/exports/android/android_2.1_cn/ $ mkdir -p $ANDROID $ cd $ANDROID 3. 源码下载 $ repo init -u &#8230; <a href="http://www.liulang.cq.cn/20101218/android-2-1-eclair-for-htc-g1.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>1.           说明</p>
<p>1)           下载编译最基本的android源码，无法在真机上使用（不能生成boot.img），只能在模拟器上使用。这是因为没有编译相关机型的内核和硬件  驱动。以下介绍的是用android源码编译出对应HTC G1的版本，和烧写的过程。编译生成的版本除相机不能用之外，其它绝大  部分功能都能正常使用，在G1上运行2.1版的速度也不错。</p>
<p>2)          本文主要参考日文文档G1/G2烧机指南，感谢原文作者，原文地址：<br />
<a href="http://code.google.com/p/android-development-environment/wiki/EclaironADP1andADP2">http://code.google.com/p/android-development-environment/wiki/EclaironADP1andADP2</a><br />
同时加入中文系统 的支持和JIT支持（提高速 度），以及相关文字解释。</p>
<p><span id="more-292"></span></p>
<p>3)          以下步骤都经过验证（只验证G1手机，G2部分请参见日文文档），实验系统ubuntu8.04，实验日期2010年5月8日</p>
<p>4)          关键字: android 2.1 eclair g1 源码编译</p>
<p>2.            建立android源码编译目录<br />
<em>$ export ANDROID=/exports/android/android_2.1_cn/<br />
$  mkdir -p  $ANDROID<br />
$ cd $ANDROID</em></p>
<p>3.           源码下载<br />
<em>$ repo init -u   git://android.git.kernel.org/platform/manifest.git -b android-2.1_r2 </em><em> ＃设定下载</em><em> 2.1</em><em>版代码</em><em><br />
$ vi .repo/local_manifest.xml           # </em><em>新建下载配置文件</em><br />
编辑内容如下</p>
<p>&lt;?xml version=”1.0″ encoding=”UTF-8″?&gt;<br />
&lt;manifest&gt;<br />
&lt;project path=”kernel” name=”kernel/msm” revision=”refs/heads/android-msm-2.6.29-donut”/&gt;<br />
&lt;project path=”vendor/htc/common-open” name=”platform/vendor/htc/common-open” revision=”master”/&gt;<br />
&lt;project path=”vendor/htc/dream-open” name=”platform/vendor/htc/dream-open” revision=”master”/&gt;<br />
&lt;project path=”vendor/htc/prebuilt-open” name=”platform/vendor/htc/prebuilt-open” revision=”master”/&gt;<br />
&lt;project path=”vendor/htc/sapphire-open” name=”platform/vendor/htc/sapphire-open” revision=”master”/&gt;<br />
&lt;project path=”vendor/qcom/android-open” name=”platform/vendor/qcom/android-open” revision=”master”/&gt;<br />
&lt;project path=”vendor/qcom/proprietary-open” name=”platform/vendor/qcom/proprietary-open” revision=”master”/&gt;<br />
&lt;project path=”vendor/pv-open” name=”platform/vendor/pv-open” revision=”master”/&gt;<br />
&lt;project path=”vendor/aosp” name=”platform/vendor/aosp” revision=”master”/&gt;<br />
&lt;project path=”hardware/htc/dream” name=”platform/hardware/htc/dream” revision=”master”/&gt;<br />
&lt;/manifest&gt;</p>
<blockquote><p><em> </em></p>
<p><em> </em></p></blockquote>
<p><em> </em></p>
<p><em> </em>注意：其中msm是高通芯片组，path指明下载到源码目录中的位置，name指明git上的项目名<br />
<em>$ repo sync                    # </em><em>开始下载代码，此时需要等待较长时间</em></p>
<p>4.           打补丁以支持动态壁纸（此为步骤为可选）<br />
<em>$ wget <a href="http://android-development-environment.googlecode.com/files/patch_devphone_eclair.tar.gz">http://android-development-environment.googlecode.com/files/patch_devphone_eclair.tar.gz</a><br />
$ tar zxvf  patch_devphone_eclair.tar.gz<br />
$  ./patch/eclair-build-patch.sh</em></p>
<p>5.           编译内核及无线网络驱动<br />
<em>$ cd $ANDROID/kernel<br />
$ make  ARCH=arm    CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-    msm_defconfig                  # </em><em>设 定默认的</em><em>msm</em><em>配置</em><em><br />
$ vi  .config                    # </em><em>修改新生成的配置文件，以重新设置</em><em>CPU</em><em>最高频率，修改如下：</em><br />
<em>修改</em><em>CONFIG_MSM_CPU_FREQ_ONDEMAND_MAX</em><em>项为</em><em>CONFIG_MSM_CPU_FREQ_ONDEMAND_MAX=528000</em><br />
<em>$ make ARCH=arm   CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-   #</em><em>编译内核</em><em><br />
$ cd  $ANDROID/system/wlan/ti/sta_dk_4_0_4_32<br />
$ make  ARCH=arm    CROSS_COMPILE=$ANDROID/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-    KERNEL_DIR=$ANDROID/kerne         l </em><em>＃编译无线网络驱动</em><em><br />
$ cp $ANDROID/kernel/arch/arm/boot/zImage   $ANDROID/vendor/htc/dream-open/kernel<br />
$ cp   $ANDROID/system/wlan/ti/sta_dk_4_0_4_32/wlan.ko   $ANDROID/vendor/htc/dream-open/wlan.ko</em></p>
<p>6.           编译android源码<br />
在HTC网站<a href="http://developer.htc.com/adp.html">http://developer.htc.com/adp.html</a><br />
下载名为<em>signed-dream_devphone_userdebug-ota-14721.zip</em>的包，并把它放在$ANDROID目录下<br />
<em>$ cd $ANDROID<br />
$ source  build/envsetup.sh<br />
$  lunch aosp_dream_us-eng           # </em><em>指明机型</em><em><br />
$ cd vendor/htc/dream-open<br />
$   ./unzip-files.sh </em><em>＃　解压</em><em>htc</em><em>相关驱动</em><em><br />
$ cd  $ANDROID<br />
$ vi  buildspec.mk </em><em>＃　新建配置文件</em><em><br />
</em><em>加入如下内容</em><em><br />
CUSTOM_LOCALES:=zh_CN</em> <em># </em><em>设置编译为中文系统</em><br />
<em>WITH_JIT:=true</em> <em># </em><em>加入</em><em>JIT</em><em>支持，使得运算速度加快</em><em>1-2</em><em>倍</em><br />
<em>$ make -j2 </em><em>＃</em><em> </em><em>编译</em><em>android</em><em>源码，需要等待较长时间</em></p>
<p>7.           把编译好的软件烧写到手机<br />
用usb线连接手机到电脑，按home+power键将手机启动到工程模式，按back键准备烧写<br />
<em>$ <a>export  PATH=$PATH:$ANDROID/out/host/linux-x86/bin</a> # </em><em>把 烧写工具所在目录加上路径</em><em><br />
$ cd  out/target/product/dream-open/<br />
$ fastboot flash  system system.img<br />
$  fastboot flash boot boot.img<br />
$ fastboot reboot</em><br />
烧写系统后第一次启 动手机需要几分钟，请耐心等待</p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20101218/android-2-1-eclair-for-htc-g1.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android TTS  语音朗读 的开发</title>
		<link>http://www.liulang.cq.cn/20100518/android-tts.html</link>
		<comments>http://www.liulang.cq.cn/20100518/android-tts.html#comments</comments>
		<pubDate>Tue, 18 May 2010 08:38:18 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=266</guid>
		<description><![CDATA[1、首先要tts是否有所需语言的语音数据，如果没有需安装它 Intent checkIntent = new Intent(); checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); startActivityForResult(checkIntent, MY_DATA_CHECK_CODE); 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 &#8230; <a href="http://www.liulang.cq.cn/20100518/android-tts.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>1、首先要tts是否有所需语言的语音数据，如果没有需安装它<br />
<span id="more-266"></span></p>
<p><code><br />
Intent checkIntent = new Intent();<br />
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);<br />
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);   </p>
<p>private TextToSpeech mTts;<br />
protected void onActivityResult(int requestCode, int resultCode, Intent data) {<br />
    if (requestCode == MY_DATA_CHECK_CODE) {<br />
        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {<br />
            // success, create the TTS instance<br />
            mTts = new TextToSpeech(this, this);<br />
        } else {<br />
            // missing data, install it<br />
            Intent installIntent = new Intent();<br />
            installIntent.setAction(<br />
                TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);<br />
            startActivity(installIntent);<br />
        }<br />
    }<br />
} </code></p>
<p>2、设置地区（语言）<br />
<code><br />
mTts.setLanguage(Locale.US);<br />
 </code></p>
<p>3、判断是否支持某地区的语言<br />
mTts.isLanguageAvailable(Locale.FRANCE))<br />
或 </p>
<p>mTts.isLanguageAvailable(new Locale(“spa”, “ESP”)))  </p>
<p>或 </p>
<p>mTts.isLanguageAvailable(new Locale(“spa”))  </p>
<p>如果没有语言数据，会返回TextToSpeech.LANG_MISSING_DATA，否则返回ACTION_CHECK_TTS_DATA </p>
<p>4、处理发音<br />
<code><br />
String myText1 = "Did you sleep well?";<br />
String myText2 = "I hope so, because it's time to wake up.";<br />
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, null);<br />
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, null);<br />
</code></p>
<p>5、加参数 </p>
<p><code><br />
HashMap<String, String> myHashAlarm = new HashMap();<br />
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM));<br />
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);<br />
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);<br />
</code></p>
<p>6、加完成监听 </p>
<p><code></p>
<p>mTts.setOnUtteranceCompletedListener(this);<br />
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM));<br />
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);<br />
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "end of wakeup message ID");<br />
// myHashAlarm now contains two optional parameters<br />
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);   </p>
<p>public void onUtteranceCompleted(String uttId) {<br />
if (uttId == "end of wakeup message ID") {<br />
    playAnnoyingMusic();<br />
}<br />
}  </code></p>
<p>7、将发音录入文件<br />
<code></p>
<p>HashMap<String, String> myHashRender = new HashMap();<br />
String wakeUpText = "Are you up yet?";<br />
String destFileName = "/sdcard/myAppCache/wakeUp.wav";<br />
myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, wakeUpText);   </p>
<p>mTts.addSpeech(wakeUpText, destFileName);<br />
mTts.speak(wakeUpText, TextToSpeech.QUEUE_ADD, myHashAlarm);<br />
</code></p>
<p>8、关闭tts<br />
<code></p>
<p>mTts.shutdown();<br />
mTts.synthesizeToFile(wakuUpText, myHashRender, destFileName);<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20100518/android-tts.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ubuntu9.10下编译Android源代码</title>
		<link>http://www.liulang.cq.cn/20100427/androidsource.html</link>
		<comments>http://www.liulang.cq.cn/20100427/androidsource.html#comments</comments>
		<pubDate>Tue, 27 Apr 2010 07:34:04 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=245</guid>
		<description><![CDATA[本文将为大家介绍的是如何设置Android源码的编译环境，包括Linux下的配置。主要基于Android 1.5环境，希望对大家了解Android开发有所帮助。  本次编译过程主要参考官方文档（http://source.Android.com/download)和网上相关资料（如http://blog.csdn.net/liaoshengjiong/archive/2009/03/04/3957749.aspx)  编译环境：Ubuntu9.10  1、安装一些环境  sudo apt-get install build-essential    sudo apt-get install make    sudo apt-get install gcc    sudo apt-get install g++    sudo apt-get install libc6-dev        sudo apt-get install patch    sudo apt-get install texinfo    sudo apt-get install libncurses-dev        sudo apt-get install git-core gnupg    sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl    sudo apt-get install ncurses-dev     sudo apt-get install zlib1g-dev    sudo apt-get install valgrind    sudo apt-get install python2.5    安装java环境  sudo apt-get install sun-java6-jre sun-java6-plugin sun-java6-fonts sun-java6-jdk    &#8230; <a href="http://www.liulang.cq.cn/20100427/androidsource.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>本文将为大家介绍的是如何设置Android源码的编译环境，包括Linux下的配置。主要基于Android 1.5环境，希望对大家了解Android开发有所帮助。 </p>
<p>本次编译过程主要参考官方文档（http://source.Android.com/download)和网上相关资料（如http://blog.csdn.net/liaoshengjiong/archive/2009/03/04/3957749.aspx) </p>
<p>编译环境：Ubuntu9.10 </p>
<p><strong><strong>1、安装一些环境<span id="more-245"></span></strong> </p>
<pre>
<li>sudo apt-get install build-essential  </li>
<li> sudo apt-get install make  </li>
<li> sudo apt-get install gcc  </li>
<li> sudo apt-get install g++  </li>
<li> sudo apt-get install libc6-dev  </li>
<li>   </li>
<li> sudo apt-get install patch  </li>
<li> sudo apt-get install texinfo  </li>
<li> sudo apt-get install libncurses-dev  </li>
<li>   </li>
<li> sudo apt-get install git-core gnupg  </li>
<li> sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl  </li>
<li> sudo apt-get install ncurses-dev   </li>
<li> sudo apt-get install zlib1g-dev  </li>
<li> sudo apt-get install valgrind  </li>
<li> sudo apt-get install python2.5 </li>
</pre>
<p> </p>
<p>安装java环境 </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>sudo apt-get install sun-java6-jre sun-java6-plugin sun-java6-fonts sun-java6-jdk </span></span></li>
</ol>
</pre>
<p> </p>
<p>注：官方文档说如果用sun-java6-jdk可出问题，得要用sun-java5-jdk。经测试发现，如果仅仅make（make不包括make sdk)，用sun-java6-jdk是没有问题的。而make sdk，就会有问题，严格来说是在make doc出问题，它需要的javadoc版本为1.5。 </p>
<p>因此，我们安装完sun-java6-jdk后最好再安装sun-java5-jdk，或者只安装sun-java5-jdk。这里sun-java6-jdk和sun-java5-jdk都安装，并只修改javadoc.1.gz和javadoc。因为只有这两个是make sdk用到的。这样的话，除了javadoc工具是用1.5版本，其它均用1.6版本：  </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>sudo apt-get install sun-java5-jdk </span></span></li>
</ol>
</pre>
<p> </p>
<p>修改javadoc的link </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>cd /etc/alternatives  </span></span></li>
<li><span>sudo rm javadoc.1.gz  </span></li>
<li class="alt"><span>sudo ln -s /usr/lib/jvm/java-1.5.0-sun/man/man1/javadoc.1.gz javadoc.1.gz  </span></li>
<li><span>sudo rm javadoc  </span></li>
<li class="alt"><span>sudo ln -s /usr/lib/jvm/java-1.5.0-sun/bin/javadoc javadoc </span></li>
</ol>
</pre>
<p> </p>
<p>2、设置环境变量 </p>
<pre>
<ol class="dp-c">
<li class="alt"><span><span>vim ~/.bashrc </span></span></li>
</ol>
</pre>
<p> </p>
<p>在.bashrc中新增或整合PATH变量，如下 </p>
<pre>
<ol class="dp-c">
<li class="alt"><span><span class="preprocessor"><span style="color: #808080;">#java 程序开发/运行的一些环境变量 </span></span><span> </span></span></li>
<li><span>JAVA_HOME=/usr/lib/jvm/java-6-sun  </span></li>
<li class="alt"><span>JRE_HOME=${JAVA_HOME}/jre  </span></li>
<li><span>export Android_JAVA_HOME=$JAVA_HOME  </span></li>
<li class="alt"><span>export CLASSPATH=.:${JAVA_HOME}/lib:$JRE_HOME/lib:$CLASSPATH  </span></li>
<li><span>export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin  </span></li>
<li class="alt"><span>export JAVA_HOME;  </span></li>
<li><span>export JRE_HOME;  </span></li>
<li class="alt"><span>export CLASSPATH;  </span></li>
<li><span>HOME_BIN=~/bin/  </span></li>
<li class="alt"><span>export PATH=${PATH}:${JAVA_PATH}:${JRE_PATH}:${HOME_BIN}; </span><span class="preprocessor"> </span> </li>
<li><span><span class="preprocessor"><span style="color: #808080;">#echo $PATH;</span></span><span> </span></span></li>
</ol>
</pre>
<p> </p>
<p>最后，同步这些变化： </p>
<pre>
<li>source ~/.bashrc </li>
</pre>
<p><strong>3、安装repo（用来更新Android源码)</strong> </p>
<p>创建~/bin目录，用来存放repo程序，如下： </p>
<pre>
<li>$ cd ~  </li>
<li>$ mkdir bin </li>
</pre>
<p>并加到环境变量PATH中，在第2步中已经加入 </p>
<p>下载repo脚本并使其可执行： </p>
<pre>
<li>$ curl http://Android.git.kernel.org/repo <strong><span style="color: #006699;">&gt;</span></strong>~/bin/repo  </li>
<li>$ chmod a+x ~/bin/repo </li>
</pre>
<p><strong>4、下载 Android源码并更新之</strong> </p>
<p>建议不要用repo来下载（Android源码超过1G，非常慢)，直接在网上下载http://www.Androidin.com/bbs/pub/cupcake.tar.gz。而且解压出来的 cupcake下也有.repo文件夹，可以通过repo sync来更新cupcake代码： </p>
<pre>
<li>tar -xvf  cupcake.tar.gz  </li>
</pre>
<p>repo sync（更新很慢，用了3个小时) </p>
<p><strong>5、编译Android源码,并得到~/project/Android/cupcake/out 目录</strong> </p>
<p>进入Android源码目录： </p>
<p>make </p>
<p>这一过程很久（2个多小时) </p>
<p><strong>6、在模拟器上运行编译好Android</strong> </p>
<p>Android SDK的emulator程序在Android-sdk-linux_x86-1.0_r2/tools/下，emulator是需要加载一些image的，默认加载Android-sdk-linux_x86-1.0_r2/tools/lib/images下的kernel-qemu（内核) ramdisk.img  system.img  userdata.img </p>
<p>编译好Android之后，emulator在~/project/Android/cupcake/out/host/linux-x86/bin下， ramdisk.img  system.img  userdata.img则在~/project/Android/cupcake/out/target/product/generic下 </p>
<p>cd ~/project/Android/cupcake/out/host/linux-x86/bin </p>
<p>增加环境变量 </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>vim ~/.bashrc </span></span></li>
</ol>
</pre>
<p>在.bashrc中新增环境变量，如下 </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>#java 程序开发/运行的一些环境变量  </span></span></li>
<li><span>export </span><span class="attribute"><span style="color: #ff0000;">Android_PRODUCT_OUT</span></span><span>=~/project/Android/cupcake2/out/target/product/generic  </span></li>
<li class="alt"><span> </span><span class="attribute"><span style="color: #ff0000;">Android_PRODUCT_OUT_BIN</span></span><span>=~/project/Android/cupcake2/out/host/linux-x86/bin  </span></li>
<li><span>export </span><span class="attribute"><span style="color: #ff0000;">PATH</span></span><span>=${PATH}:${Android_PRODUCT_OUT_BIN}; </span></li>
</ol>
</pre>
<p>最后，同步这些变化： </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>source ~/.bashrc  </span></span></li>
<li><span>emulator -image system.img -data userdata.img -ramdisk ramdisk.img </span></li>
</ol>
</pre>
<p>最后进入Android桌面，就说明成功了。 </p>
<p>out/host/linux-x86/bin下生成许多有用工具（包括Android SDK/tools的所有工具)，因此，可以把eclipse中Android SDK的路径指定到out/host/linux-x86/bin进行开发 </p>
<p><strong>7、编译linux kernel</strong> </p>
<p>直接make Android源码时，并没有make linux kernel。因此是在运行模拟器，所以不用编译 linux kernel。如果要移值Android，或增删驱动，则需要编译 linux kernellinux kernel的编译将在以后的文章中介绍。 </p>
<p><strong>8、编译模块</strong>Android中的一个应用程序可以单独编译，编译后要重新生成system.img在源码目录下执行 </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>. build/envsetup.sh （.后面有空格) </span></span></li>
</ol>
</pre>
<p>就多出一些命令： </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>- croot:   Changes directory to the top of the tree.  </span></span></li>
<li><span>- m:       Makes from the top of the tree.  </span></li>
<li class="alt"><span>- mm:      Builds all of the modules in the current directory.  </span></li>
<li><span>- mmm:     Builds all of the modules in the supplied directories.  </span></li>
<li class="alt"><span>- cgrep:   Greps on all local C/C++ files.  </span></li>
<li><span>- jgrep:   Greps on all local Java files.  </span></li>
<li class="alt"><span>- resgrep: Greps on all local res/*.xml files.  </span></li>
<li><span>- godir:   Go to the directory containing a file. </span></li>
</ol>
</pre>
<p>可以加—help查看用法我们可以使用mmm来编译指定目录的模块，如编译联系人： </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>mmm packages/apps/Contacts/ </span></span></li>
</ol>
</pre>
<p>编完之后生成两个文件： </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>out/target/product/generic/data/app/ContactsTests.apk  </span></span></li>
<li><span>out/target/product/generic/system/app/ Contacts.apk </span></li>
</ol>
</pre>
<p>可以使用make snod重新生成system.img再运行模拟器 </p>
<p><strong>9、编译SDK</strong>直接执行make是不包括make sdk的。make sdk用来生成SDK，这样，我们就可以用与源码同步的SDK来开发 Android了。 </p>
<p>1)修改/frameworks/base/include/utils/Asset.h‘UNCOMPRESS_DATA_MAX = 1 * 1024 * 1024’ 改为 ‘UNCOMPRESS_DATA_MAX = 2 * 1024 * 1024’原因是Eclipse编译工程需要大于1.3M的buffer </p>
<p>2)编译ADT。注意，我们是先执行2)，再执行3)。因为在执行./build_server.sh时，会把生成的SDK清除了。用上了新的源码，adt这个调试工具也得自己来生成，步骤如下：进入cupcake源码的development/tools/eclipse/scripts目录，执行：export ECLIPSE_HOME=你的eclipse路径./build_server.sh 你想放ADT的路径 </p>
<p>3)执行make sdk。注意，这里需要的javadoc版本为1.5，所以你需要在步骤1中同时安装sun-java5-jdkmake sdk编译很慢。编译后生成的SDK存放在out/host/linux-x86/sdk/，此目录下有Android-sdk_eng.xxx_linux-x86.zip和Android-sdk_eng.xxx_linux-x86目录。Android-sdk_eng.xxx_linux-x86就是SDK目录实际上，当用mmm命令编译模块时，一样会把SDK的输出文件清除，因此，最好把Android-sdk_eng.xxx_linux-x86移出来 </p>
<p><strong>4)关于环境变量、Android工具的选择</strong>目前的Android工具有：A、我们从网上下载的SDK（ tools下有许多Android工具，lib/images下有img映像)B、我们用make sdk编译出来的SDK（ tools下也有许多Android工具，lib/images下有img映像)C、我们用make编译出来的out目录（ tools下也有许多Android工具，lib/images下有img映像)那么我们应该用那些工具和img呢？首先，我们不会用A选项的工具和img，因为一般来说它比较旧，也源码不同步。测试发现，如果使用B选项的工具和img，Android模拟器窗口变小（可能是skin加载不了)，而用C选项的工具和img则不会有此问题。有些Android工具依赖Android.jar（比如Android)，因此，我们在eclipse中使用B选项的工具（SDK)，使用C选项的img。其实，从emulator -help-build-images也可以看出，Android_PRODUCT_OUT是指向C选项的img目录的不过，除了用A选项的工具和img，用B或C的模拟器都不能加载sdcard，原因还不清楚。 </p>
<p><strong>5)安装、配置ADT</strong>安装、配置ADT请参考官方文档 </p>
<p>6)创建Android Virtual Device编译出来的SDK是没有AVD（Android Virtual Device)的，我们可以通过Android工具查看：Android list输出为： </p>
<pre>
<ol class="dp-xml">
<li class="alt"><span><span>Available Android targets:  </span></span></li>
<li><span>[1] Android 1.5  </span></li>
<li class="alt"><span>     API level: 3  </span></li>
<li><span>     Skins: HVGA-P, QVGA-L, HVGA-L, HVGA (default), QVGA-P  </span></li>
<li class="alt"><span>Available Android Virtual Devices: </span></li>
</ol>
</pre>
<p>表明没有AVD。如果没有AVD，eclipse编译工程时会出错（Failed to find a AVD compatible with target &#8216;Android 1.5&#8242;. Launch aborted.)创建AVD：Android create avd -t 1 -c ~/sdcard.img -n myavd可以Android –help来查看上面命令选项的用法。创建中有一些选项，默认就行了再执行Android list，可以看到AVD存放的位置以后每次运行emulator都要加-avd myavd或@myavd选项，这里eclipse才会在你打开的emulator中调试程序 </p>
<p><strong>注意：</strong>这样，SDK和ADT就生成了，就按照官方文档把他们整合到Eclipse，这里不再细说了。建个Android的新工程，试试你自己编译的sdk。 </p>
<p></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20100427/androidsource.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dalvik 十件事</title>
		<link>http://www.liulang.cq.cn/20100303/dalvik-ten.html</link>
		<comments>http://www.liulang.cq.cn/20100303/dalvik-ten.html#comments</comments>
		<pubDate>Wed, 03 Mar 2010 03:47:36 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=240</guid>
		<description><![CDATA[Android(OPhone)系统的模拟器为Dalvik，DEX文件格式为Android操作系统上的Dalvik虚拟机可执行文件即Dalvik VM executes 的缩写。 下文翻译自John R. Rose在Google I/O上的介绍，《The top ten things I learned about Android and the Dalvik VM》，略有删节。其英文博客原文地址为：http://blogs.sun.com/jrose/entry/with_android_and_dalvik_at  。 1.Android是Linux/JVM 的简化版，他们重写了libc，减小到200k，重做了速度-空间的优化，扔掉了c++的例外和c级别的wide char的支持。 2.该平台的一个特别的地方是他们在减少私有页面开销时花费了很大的功夫。 3.他们不用OpenJDK而是使用Harmony的主要原因是GPL。 4.Android 1.0 的虚拟机是很简单的：一个类似资源分配（malloc-like）的堆和一个解释器。 5.不使用JVM字节码的关键理由是解释器的复杂性和脏页面的印记。 6.虚拟机使用dex文件就像java cards使用自己的内部指令集一样。据说它可以在手机上得到局部优化运行。该工具链使用class文件，有一个叫dx的工具可以把jar转换成dex的汇编文件。 7.dx之类的工具可以强制植入手机，使java代码可以继续生成字节码，然后还要转换成虚拟机可以执行的格式。 8.dx将class文件转换成静态单一赋值形式(SSA:Static Single Assignment)， 然后转换成dex文件。该过程中没有优化（optimizations are missing）。 9.dex格式的常数pool通常是合并的带类型的，具有32位的索引。它很有可能会促进java的class文件标准的升级。 10.人们感激Sun之前做的java服务性工作，但是并不能看到Sun对人们未来的导引。]]></description>
			<content:encoded><![CDATA[<p style="padding: 0px; margin: 0px;"><span>Android(OPhone)系统的模拟器为Dalvik，DEX文件格式为Android操作系统上的Dalvik虚拟机可执行文件即Dalvik VM executes 的缩写。</span></p>
<p style="padding: 0px; margin: 0px;"><span>下文翻译自John R. Rose在Google I/O上的介绍，《The top ten things I learned about Android and the Dalvik VM》，略有删节。其英文博客原文地址为：http://blogs.sun.com/jrose/entry/with_android_and_dalvik_at  。</span></p>
<p>1.Android是Linux/JVM 的简化版，他们重写了libc，减小到200k，重做了速度-空间的优化，扔掉了c++的例外和c级别的wide char的支持。<br />
2.该平台的一个特别的地方是他们在减少私有页面开销时花费了很大的功夫。<br />
3.他们不用OpenJDK而是使用Harmony的主要原因是GPL。<br />
4.Android 1.0 的虚拟机是很简单的：一个类似资源分配（malloc-like）的堆和一个解释器。<br />
5.不使用JVM字节码的关键理由是解释器的复杂性和脏页面的印记。<br />
6.虚拟机使用dex文件就像java cards使用自己的内部指令集一样。据说它可以在手机上得到局部优化运行。该工具链使用class文件，有一个叫dx的工具可以把jar转换成dex的汇编文件。<br />
7.dx之类的工具可以强制植入手机，使java代码可以继续生成字节码，然后还要转换成虚拟机可以执行的格式。<br />
8.dx将class文件转换成静态单一赋值形式(SSA:Static Single Assignment)， 然后转换成dex文件。该过程中没有优化（optimizations are missing）。<br />
9.dex格式的常数pool通常是合并的带类型的，具有32位的索引。它很有可能会促进java的class文件标准的升级。<br />
10.人们感激Sun之前做的java服务性工作，但是并不能看到Sun对人们未来的导引。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20100303/dalvik-ten.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android permission 访问权限大全</title>
		<link>http://www.liulang.cq.cn/20091206/android-permission-all.html</link>
		<comments>http://www.liulang.cq.cn/20091206/android-permission-all.html#comments</comments>
		<pubDate>Sun, 06 Dec 2009 15:26:09 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=187</guid>
		<description><![CDATA[程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下: android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问”properties”表在checkin数据库中，改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get uploaded) android.permission.ACCESS_COARSE_LOCATION 允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi) location) android.permission.ACCESS_FINE_LOCATION 允许一个程序访问精良位置(如GPS) (Allows an application to access fine &#8230; <a href="http://www.liulang.cq.cn/20091206/android-permission-all.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下:</p>
<p>android.permission.ACCESS_CHECKIN_PROPERTIES<br />
允许读写访问”properties”表在checkin数据库中，改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get uploaded)<span id="more-187"></span></p>
<p>android.permission.ACCESS_COARSE_LOCATION<br />
允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi) location)</p>
<p>android.permission.ACCESS_FINE_LOCATION<br />
允许一个程序访问精良位置(如GPS) (Allows an application to access fine (e.g., GPS) location)</p>
<p>android.permission.ACCESS_LOCATION_EXTRA_COMMANDS<br />
允许应用程序访问额外的位置提供命令(Allows an application to access extra location provider commands)</p>
<p>android.permission.ACCESS_MOCK_LOCATION<br />
允许程序创建模拟位置提供用于测试(Allows an application to create mock location providers for testing)</p>
<p>android.permission.ACCESS_NETWORK_STATE<br />
允许程序访问有关GSM网络信息(Allows applications to access information about networks)</p>
<p>android.permission.ACCESS_SURFACE_FLINGER<br />
允许程序使用SurfaceFlinger底层特性(Allows an application to use SurfaceFlinger’s low level features)</p>
<p>android.permission.ACCESS_WIFI_STATE<br />
允许程序访问Wi-Fi网络状态信息(Allows applications to access information about Wi-Fi networks)</p>
<p>android.permission.ADD_SYSTEM_SERVICE<br />
允许程序发布系统级服务(Allows an application to publish system-level services).</p>
<p>android.permission.BATTERY_STATS<br />
允许程序更新手机电池统计信息(Allows an application to update the collected battery statistics)</p>
<p>android.permission.BLUETOOTH<br />
允许程序连接到已配对的蓝牙设备(Allows applications to connect to paired bluetooth devices)</p>
<p>android.permission.BLUETOOTH_ADMIN<br />
允许程序发现和配对蓝牙设备(Allows applications to discover and pair bluetooth devices)</p>
<p>android.permission.BRICK<br />
请求能够禁用设备(非常危险)(Required to be able to disable the device (very *erous!).)</p>
<p>android.permission.BROADCAST_PACKAGE_REMOVED<br />
允许程序广播一个提示消息在一个应用程序包已经移除后(Allows an application to broadcast a notification that an application package has been removed)</p>
<p>android.permission.BROADCAST_STICKY<br />
允许一个程序广播常用intents(Allows an application to broadcast sticky intents)</p>
<p>android.permission.CALL_PHONE<br />
允许一个程序初始化一个电话拨号不需通过拨号用户界面需要用户确认(Allows an application to initiate a phone call without going through the Dialer user interface for the user to confirm the call being placed.)</p>
<p>android.permission.CALL_PRIVILEGED<br />
允许一个程序拨打任何号码，包含紧急号码无需通过拨号用户界面需要用户确认(Allows an application to call any phone number, including emergency numbers, without going through the Dialer user interface for the user to confirm the call being placed)</p>
<p>android.permission.CAMERA<br />
请求访问使用照相设备(Required to be able to access the camera device. )</p>
<p>android.permission.CHANGE_COMPONENT_ENABLED_STATE<br />
允许一个程序是否改变一个组件或其他的启用或禁用(Allows an application to change whether an application component (other than its own) is enabled or not. )</p>
<p>android.permission.CHANGE_CONFIGURATION<br />
允许一个程序修改当前设置，如本地化(Allows an application to modify the current configuration, such as locale. )</p>
<p>android.permission.CHANGE_NETWORK_STATE<br />
允许程序改变网络连接状态(Allows applications to change network connectivity state)</p>
<p>android.permission.CHANGE_WIFI_STATE<br />
允许程序改变Wi-Fi连接状态(Allows applications to change Wi-Fi connectivity state)</p>
<p>android.permission.CLEAR_APP_CACHE<br />
允许一个程序清楚缓存从所有安装的程序在设备中(Allows an application to clear the caches of all installed applications on the device. )</p>
<p>android.permission.CLEAR_APP_USER_DATA<br />
允许一个程序清除用户设置(Allows an application to clear user data)</p>
<p>android.permission.CONTROL_LOCATION_UPDATES<br />
允许启用禁止位置更新提示从无线模块(Allows enabling/disabling location update notifications from the radio. )</p>
<p>android.permission.DELETE_CACHE_FILES<br />
允许程序删除缓存文件(Allows an application to delete cache files)</p>
<p>android.permission.DELETE_PACKAGES<br />
允许一个程序删除包(Allows an application to delete packages)</p>
<p>android.permission.DEVICE_POWER<br />
允许访问底层电源管理(Allows low-level access to power management)</p>
<p>android.permission.DIAGNOSTIC<br />
允许程序RW诊断资源(Allows applications to RW to diagnostic resources. )</p>
<p>android.permission.DISABLE_KEYGUARD<br />
允许程序禁用键盘锁(Allows applications to disable the keyguard )</p>
<p>android.permission.DUMP<br />
允许程序返回状态抓取信息从系统服务(Allows an application to retrieve state dump information from system services.)</p>
<p>android.permission.EXPAND_STATUS_BAR<br />
允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序(Allows an application to expand or collapse the status bar. )</p>
<p>android.permission.FACTORY_TEST<br />
作为一个工厂测试程序，运行在root用户(Run as a manufacturer test application, running as the root user. )</p>
<p>android.permission.FLASHLIGHT<br />
访问闪光灯,android开发网提示HTC Dream不包含闪光灯(Allows access to the flashlight )</p>
<p>android.permission.FORCE_BACK<br />
允许程序强行一个后退操作是否在顶层activities(Allows an application to force a BACK operation on whatever is the top activity. )</p>
<p>android.permission.FOTA_UPDATE<br />
暂时不了解这是做什么使用的，android开发网分析可能是一个预留权限.</p>
<p>android.permission.GET_ACCOUNTS<br />
访问一个帐户列表在Accounts Service中(Allows access to the list of accounts in the Accounts Service)</p>
<p>android.permission.GET_PACKAGE_SIZE<br />
允许一个程序获取任何package占用空间容量(Allows an application to find out the space used by any package. )</p>
<p>android.permission.GET_TASKS<br />
允许一个程序获取信息有关当前或最近运行的任务，一个缩略的任务状态，是否活动等等(Allows an application to get information about the currently or recently running tasks: a thumbnail representation of the tasks, what activities are running in it, etc.)</p>
<p>android.permission.HARDWARE_TEST<br />
允许访问硬件(Allows access to hardware peripherals. )</p>
<p>android.permission.INJECT_EVENTS<br />
允许一个程序截获用户事件如按键、触摸、轨迹球等等到一个时间流，android 开发网提醒算是hook技术吧(Allows an application to inject user events (keys, touch, trackball) into the event stream and deliver them to ANY window.)</p>
<p>android.permission.INSTALL_PACKAGES<br />
允许一个程序安装packages(Allows an application to install packages. )</p>
<p>android.permission.INTERNAL_SYSTEM_WINDOW<br />
允许打开窗口使用系统用户界面(Allows an application to open windows that are for use by parts of the system user interface. )</p>
<p>android.permission.INTERNET<br />
允许程序打开网络套接字(Allows applications to open network sockets)</p>
<p>android.permission.MANAGE_APP_TOKENS<br />
允许程序管理(创建、催后、 z- order默认向z轴推移)程序引用在窗口管理器中(Allows an application to manage (create, destroy, Z-order) application tokens in the window manager. )</p>
<p>android.permission.MASTER_CLEAR目前还没有明确的解释，android开发网分析可能是清除一切数据，类似硬格机</p>
<p>android.permission.MODIFY_AUDIO_SETTINGS<br />
允许程序修改全局音频设置(Allows an application to modify global audio settings)</p>
<p>android.permission.MODIFY_PHONE_STATE<br />
允许修改话机状态，如电源，人机接口等(Allows modification of the telephony state – power on, mmi, etc. )</p>
<p>android.permission.MOUNT_UNMOUNT_FILESYSTEMS<br />
允许挂载和反挂载文件系统可移动存储(Allows mounting and unmounting file systems for removable storage. )</p>
<p>android.permission.PERSISTENT_ACTIVITY<br />
允许一个程序设置他的activities显示(Allow an application to make its activities persistent. )</p>
<p>android.permission.PROCESS_OUTGOING_CALLS<br />
允许程序监视、修改有关播出电话(Allows an application to monitor, modify, or abort outgoing calls)</p>
<p>android.permission.READ_CALENDAR<br />
允许程序读取用户日历数据(Allows an application to read the user’s calendar data.)</p>
<p>android.permission.READ_CONTACTS<br />
允许程序读取用户联系人数据(Allows an application to read the user’s contacts data.)</p>
<p>android.permission.READ_FRAME_BUFFER<br />
允许程序屏幕波或和更多常规的访问帧缓冲数据(Allows an application to take screen shots and more generally get access to the frame buffer data)</p>
<p>android.permission.READ_INPUT_STATE<br />
允许程序返回当前按键状态(Allows an application to retrieve the current state of keys and switches. )</p>
<p>android.permission.READ_LOGS<br />
允许程序读取底层系统日志文件(Allows an application to read the low-level system log files. )</p>
<p>android.permission.READ_OWNER_DATA<br />
允许程序读取所有者数据(Allows an application to read the owner’s data)</p>
<p>android.permission.READ_SMS<br />
允许程序读取短信息(Allows an application to read SMS messages.)</p>
<p>android.permission.READ_SYNC_SETTINGS<br />
允许程序读取同步设置(Allows applications to read the sync settings)</p>
<p>android.permission.READ_SYNC_STATS<br />
允许程序读取同步状态(Allows applications to read the sync stats)</p>
<p>android.permission.REBOOT<br />
请求能够重新启动设备(Required to be able to reboot the device. )</p>
<p>android.permission.RECEIVE_BOOT_COMPLETED<br />
允许一个程序接收到 ACTION_BOOT_COMPLETED广播在系统完成启动(Allows an application to receive the ACTION_BOOT_COMPLETED that is broadcast after the system finishes booting. )</p>
<p>android.permission.RECEIVE_MMS<br />
允许一个程序监控将收到MMS彩信,记录或处理(Allows an application to monitor incoming MMS messages, to record or perform processing on them. )</p>
<p>android.permission.RECEIVE_SMS<br />
允许程序监控一个将收到短信息，记录或处理(Allows an application to monitor incoming SMS messages, to record or perform processing on them.)</p>
<p>android.permission.RECEIVE_WAP_PUSH<br />
允许程序监控将收到WAP PUSH信息(Allows an application to monitor incoming WAP push messages. )</p>
<p>android.permission.RECORD_AUDIO<br />
允许程序录制音频(Allows an application to record audio)</p>
<p>android.permission.REORDER_TASKS<br />
允许程序改变Z轴排列任务(Allows an application to change the Z-order of tasks)</p>
<p>android.permission.RESTART_PACKAGES<br />
允许程序重新启动其他程序(Allows an application to restart other applications)</p>
<p>android.permission.SEND_SMS<br />
允许程序发送SMS短信(Allows an application to send SMS messages)</p>
<p>android.permission.SET_ACTIVITY_WATCHER<br />
允许程序监控或控制activities已经启动全局系统中Allows an application to watch and control how activities are started globally in the system.</p>
<p>android.permission.SET_ALWAYS_FINISH<br />
允许程序控制是否活动间接完成在处于后台时Allows an application to control whether activities are immediately finished when put in the background.</p>
<p>android.permission.SET_ANIMATION_SCALE<br />
修改全局信息比例(Modify the global animation scaling factor.)</p>
<p>android.permission.SET_DEBUG_APP<br />
配置一个程序用于调试(Configure an application for debugging.)</p>
<p>android.permission.SET_ORIENTATION<br />
允许底层访问设置屏幕方向和实际旋转(Allows low-level access to setting the orientation (actually rotation) of the screen.)</p>
<p>android.permission.SET_PREFERRED_APPLICATIONS<br />
允许一个程序修改列表参数PackageManager.addPackageToPreferred() 和PackageManager.removePackageFromPreferred()方法(Allows an application to modify the list of preferred applications with the PackageManager.addPackageToPreferred() and PackageManager.removePackageFromPreferred() methods.)</p>
<p>android.permission.SET_PROCESS_FOREGROUND<br />
允许程序当前运行程序强行到前台(Allows an application to force any currently running process to be in the foreground.)</p>
<p>android.permission.SET_PROCESS_LIMIT<br />
允许设置最大的运行进程数量(Allows an application to set the maximum number of (not needed) application processes that can be running. )</p>
<p>android.permission.SET_TIME_ZONE<br />
允许程序设置时间区域(Allows applications to set the system time zone)</p>
<p>android.permission.SET_WALLPAPER<br />
允许程序设置壁纸(Allows applications to set the wallpaper )</p>
<p>android.permission.SET_WALLPAPER_HINTS<br />
允许程序设置壁纸hits(Allows applications to set the wallpaper hints)</p>
<p>android.permission.SIGNAL_PERSISTENT_PROCESSES<br />
允许程序请求发送信号到所有显示的进程中(Allow an application to request that a signal be sent to all persistent processes)</p>
<p>android.permission.STATUS_BAR<br />
允许程序打开、关闭或禁用状态栏及图标Allows an application to open, close, or disable the status bar and its icons.</p>
<p>android.permission.SUBSCRIBED_FEEDS_READ<br />
允许一个程序访问订阅RSS Feed内容提供(Allows an application to allow access the subscribed feeds ContentProvider. )</p>
<p>android.permission.SUBSCRIBED_FEEDS_WRITE<br />
系统暂时保留改设置,android开发网认为未来版本会加入该功能。</p>
<p>android.permission.SYSTEM_ALERT_WINDOW<br />
允许一个程序打开窗口使用 TYPE_SYSTEM_ALERT，显示在其他所有程序的顶层(Allows an application to open windows using the type TYPE_SYSTEM_ALERT, shown on top of all other applications. )</p>
<p>android.permission.VIBRATE<br />
允许访问振动设备(Allows access to the vibrator)</p>
<p>android.permission.WAKE_LOCK<br />
允许使用PowerManager的 WakeLocks保持进程在休眠时从屏幕消失( Allows using PowerManager WakeLocks to keep processor from sleeping or screen from dimming)</p>
<p>android.permission.WRITE_APN_SETTINGS<br />
允许程序写入API设置(Allows applications to write the apn settings)</p>
<p>android.permission.WRITE_CALENDAR<br />
允许一个程序写入但不读取用户日历数据(Allows an application to write (but not read) the user’s calendar data. )</p>
<p>android.permission.WRITE_CONTACTS<br />
允许程序写入但不读取用户联系人数据(Allows an application to write (but not read) the user’s contacts data. )</p>
<p>android.permission.WRITE_GSERVICES<br />
允许程序修改Google服务地图(Allows an application to modify the Google service map. )</p>
<p>android.permission.WRITE_OWNER_DATA<br />
允许一个程序写入但不读取所有者数据(Allows an application to write (but not read) the owner’s data.)</p>
<p>android.permission.WRITE_SETTINGS<br />
允许程序读取或写入系统设置(Allows an application to read or write the system settings. )</p>
<p>android.permission.WRITE_SMS<br />
允许程序写短信(Allows an application to write SMS messages)</p>
<p>android.permission.WRITE_SYNC_SETTINGS<br />
允许程序写入同步设置(Allows applications to write the sync settings)</p>
<p>android平台上的权限许可分得很细，如果软件无法正常执行时看看是不是缺少相关的permission声明，最终我们还需要使用 android sign tools签名生成的apk文件。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20091206/android-permission-all.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>嵌入式编程感想：会用C语言的是真男人!(转自csdn)</title>
		<link>http://www.liulang.cq.cn/20090916/c.html</link>
		<comments>http://www.liulang.cq.cn/20090916/c.html#comments</comments>
		<pubDate>Wed, 16 Sep 2009 04:05:15 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=145</guid>
		<description><![CDATA[几个月前笔者跟两个年轻企业家在巴尔的摩吃了顿愉快的午餐，这两个年轻人最近才从霍普金斯大学(Johns HopkinsUniversity)计算机科学系毕业，创办了一家业绩快速成长的顾问公司；他们的公司擅长以一种称为Ruby on Rails(又称Ruby)的语言，撰写以网页为中心的数据库(web-centric databases)软件。我们边吃饭边谈一些工作上的话题，其中一个年轻人下了个令我难忘的评论：“用C语言写程序是真正的男人！”这句话是他跟同学在将可用的编程语言进行分类时所发明的；而即使优秀如他，也当场承认他不符合以上“真正的男人”条件。看来，这句话不仅反映了C语言的高难度，也显示对较年轻的设计工程师来说，C语言真的不好掌握。 对现代的计算机科系学生来说，学习C语言就像选修一门用拉丁文来上的课那样；但C语言并不是已经过时的设计语言，且在方兴未艾的嵌入式软件开发领域维持着主导地位。下面的图一是美国版EETimes子网站Embedded Systems Design十三年来针对嵌入式软件所应用之设计语言的调查统计表。 图1 从图一可看出，C语言在1997~2009年之间都是嵌入式软件开发使用最多的语言；近五年来，C与C++语言更瓜分了大部分原属汇编语言(assembly)的版图，其中较高阶的C++发展速度虽不如预期，但仍在嵌入式软件设计领域维持27%左右的占有率。整体看来，C++语言使用率在90年代晚期加速上升，在2001年达到高峰，然后稍微下滑、之后维持稳定。 无论如何，嵌入式软件设计师不会在短时间内放弃使用C语言，原因有很多个：首先，C语言编译器支持大多数的8位、16位与32位CPU；其次，C语言在处理器与驱动程序层级，兼具高低级语言的特色。 当然，如果仅获得一小群人数逐渐减少的程序设计师支持，C语言难以继续作为重要的设计语言而存活；而既然C语言仍然如此重要，也意味着嵌入式软件设计师并不会减少。目前每年新上市的CPU有98%都是嵌入式的，这类新型CPU的长期发展性也非常乐观。图二显示美国那斯达克指数与新CPU出货量变化的消长关系。 图1 嵌入式软件设计教育断层 但在C语言在全世界各地的重要性日益增加的同时，学校里却越来越少学生愿意去学如何使用该种设计语言；这反映了嵌入式系统设计领域日益严重的「教育断层」问题。美国的高等教育机构在提供实用的、嵌入式软件设计必备的技能教育方面非常失败，相关开发技巧非得在工作岗位上才能学得到。 图3 从图三可以看出，在电子工程相关科系，只有一小部分课程是与嵌入式软件开发有关的；而计算机科学系所提供的嵌入式软件开发相关课程也只多一点点。现在有不少美国大学虽提供额外的计算机工程学分，但大多数还是来自现有电子工程、计算机科学系的课程与教授，并没有太多有关嵌入式软件开发的新内容。而在职训练也很少提供嵌入式软件开发课程。 如果以上我所举出的，有关C语言将在可见的未来继续保有重要性、特别是在嵌入式软件设计领域的种种证据属实，那麻烦就真的大了──因为现在的年轻程序设计师虽然都很聪明，他们恐怕不知道该如何使用C语言写程序，甚至不想学。 总有人得写那些需求量越来越大的嵌入式软件──新一代设计语言可能帮得上忙，却无法支持所有那些发展资历已数十年、未来数十年也会继续被应用的CPU架构；既然这样的趋势难以避免，我们这个圈子需要培育年轻一代的C语言程序设计师。但该怎么做呢？若状况持续发展下去，又会产生怎样的结果？ 【备注】我确信那位年轻人并没有性别歧视，「真正的女人」当然也会使用C语言！ (参考原文：Real men program in C，by Michael Barr，本文作者为嵌入式系统设计领域的专家，目前经营一家嵌入式系统顾问公司Netrino) ]]></description>
			<content:encoded><![CDATA[<p>几个月前笔者跟两个年轻<span onclick="tagshow(event)">企业</span>家在巴尔的摩吃了顿愉快的午餐，这两个年轻人最近才从霍普金斯大学(Johns HopkinsUniversity)计算机科学系毕业，创办了一家业绩快速成长的顾问公司；他们的公司擅长以一种称为Ruby on Rails(又称Ruby)的语言，撰写以网页为中心的数据库(web-centric databases)软件。我们边吃饭边谈一些工作上的话题，其中一个年轻人下了个令我难忘的评论：“用C语言写程序是真正的男人！”这句话是他跟同学在将可用的编程语言进行分类时所发明的；而即使优秀如他，也当场承认他不符合以上“真正的男人”条件。看来，这句话不仅反映了C语言的高难度，也显示对较年轻的<span onclick="tagshow(event)">设计</span><span onclick="tagshow(event)">工程师</span>来说，C语言真的不好掌握。<span id="more-145"></span><br />
对现代的计算机科系学生来说，学习C语言就像选修一门用拉丁文来上的课那样；但C语言并不是已经过时的设计语言，且在方兴未艾的嵌入式<a href="http://www.eetchina.com/SEARCH/ART/%C8%ED%BC%FE%BF%AA%B7%A2.HTM" target="_blank">软件开发</a>领域维持着主导地位。下面的图一是美国版EETimes子网站Embedded Systems Design十三年来针对嵌入式软件所应用之设计语言的调查统计表。</p>
<p align="center"><img id="img_0.18412698801691102" src="http://www.eetchina.com/STATIC/ARTICLE_IMAGES/200908/EECOL_2009AUG13_EMS_NT_01_1.jpg" alt="" width="500" height="248" /><br />
图1</p>
<p>从图一可看出，C语言在1997~2009年之间都是嵌入式软件开发使用最多的语言；近五年来，C与C++语言更瓜分了大部分原属汇编语言(assembly)的版图，其中较高阶的C++<span onclick="tagshow(event)">发展</span>速度虽不如预期，但仍在嵌入式软件设计领域维持27%左右的占有率。整体看来，C++语言使用率在90年代晚期加速上升，在2001年达到高峰，然后稍微下滑、之后维持稳定。</p>
<p>无论如何，嵌入式软件设计师不会在短时间内放弃使用C语言，原因有很多个：首先，C语言编译器支持大多数的8位、16位与32位CPU；其次，C语言在处理器与驱动程序层级，兼具高低级语言的特色。<br />
当然，如果仅获得一小群人数逐渐减少的程序设计师支持，C语言难以继续作为重要的设计语言而存活；而既然C语言仍然如此重要，也意味着嵌入式软件设计师并不会减少。目前每年新上市的CPU有98%都是嵌入式的，这类新型CPU的长期发展性也非常乐观。图二显示美国那斯达克指数与新CPU出货量变化的消长关系。</p>
<p align="center"><img id="img_0.5899680351830119" src="http://www.eetchina.com/STATIC/ARTICLE_IMAGES/200908/EECOL_2009AUG13_EMS_NT_01_2.jpg" alt="" width="500" height="322" /><br />
图1</p>
<p><strong>嵌入式软件设计教育断层</strong><br />
但在C语言在全世界各地的重要性日益增加的同时，学校里却越来越少学生愿意去学如何使用该种设计语言；这反映了嵌入式系统设计领域日益严重的「教育断层」问题。美国的高等教育机构在提供实用的、嵌入式软件设计必备的技能教育方面非常失败，相关开发技巧非得在工作岗位上才能学得到。</p>
<p align="center"><img id="img_0.7748926879695955" src="http://www.eetchina.com/STATIC/ARTICLE_IMAGES/200908/EECOL_2009AUG13_EMS_NT_01_3.jpg" alt="" width="500" height="345" /><br />
图3</p>
<p>从图三可以看出，在电子工程相关科系，只有一小部分课程是与嵌入式软件开发有关的；而计算机科学系所提供的嵌入式软件开发相关课程也只多一点点。现在有不少美国大学虽提供额外的计算机工程学分，但大多数还是来自现有电子工程、计算机科学系的课程与教授，并没有太多有关嵌入式软件开发的新内容。而在职训练也很少提供嵌入式软件开发课程。</p>
<p>如果以上我所举出的，有关C语言将在可见的未来继续保有重要性、特别是在嵌入式软件设计领域的种种证据属实，那麻烦就真的大了──因为现在的年轻程序设计师虽然都很聪明，他们恐怕不知道该如何使用C语言写程序，甚至不想学。<br />
总有人得写那些<span onclick="tagshow(event)">需求</span>量越来越大的嵌入式软件──新一代设计语言可能帮得上忙，却无法支持所有那些发展资历已数十年、未来数十年也会继续被应用的CPU架构；既然这样的趋势难以避免，我们这个圈子需要培育年轻一代的C语言程序设计师。但该怎么做呢？若状况持续发展下去，又会产生怎样的结果？<br />
【备注】我确信那位年轻人并没有性别歧视，「真正的女人」当然也会使用C语言！<br />
(参考原文：<a href="http://www.embedded.com/columns/barrcode/218600142?printable=true" target="_blank">Real men program in C</a>，by Michael Barr，本文作者为嵌入式系统设计领域的专家，目前经营一家嵌入式系统顾问公司Netrino)<span id="_marker"> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20090916/c.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

