<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_哈佛校训</title><subtitle type="text">此刻打盹，你将做梦；而此刻学习，你将圆梦。</subtitle><id>http://feed.cnblogs.com/blog/u/36378/rss</id><updated>2011-11-07T07:40:24Z</updated><author><name>银河使者</name><uri>http://www.cnblogs.com/nokiaguy/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nokiaguy/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/36378/rss"/><entry><id>http://www.cnblogs.com/nokiaguy/archive/2011/10/06/2199775.html</id><title type="text">Android开发技巧：像QQ一样输入表情图像</title><summary type="text">EditText和TextView一样，也可以进行图文混排。所不同的是，TextView只用于显示图文混排效果，而EditText不仅可显示， 也可混合输入文字和图像，让我们先回顾一下图5.2所示的QQ聊天输入框，在输入框中可以同时输入文字和表情图像。实际上，这种效果在Android SDK中只需要几行代码就可以实现。为了使读者更有学习的冲动，先来欣赏一下即将实现的效果，</summary><published>2011-10-06T02:15:00Z</published><updated>2011-10-06T02:15:00Z</updated><author><name>银河使者</name><uri>http://www.cnblogs.com/nokiaguy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nokiaguy/archive/2011/10/06/2199775.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nokiaguy/archive/2011/10/06/2199775.html"/><content type="html">&lt;div&gt;&lt;span style="color: Red;"&gt;本文截选自&lt;a href="http://book.360buy.com/10812022.html"&gt;《Android开发权威指南》&lt;/a&gt;，转载请注明作者和出处！&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;div&gt;&amp;nbsp;EditText和TextView一样，也可以进行图文混排。所不同的是，TextView只用于显示图文混排效果，而EditText不仅可显示， 也可混合输入文字和图像，让我们先回顾一下图5.2所示的QQ聊天输入框，在输入框中可以同时输入文字和表情图像。实际上，这种效果在Android  SDK中只需要几行代码就可以实现。为了使读者更有学习的冲动，先来欣赏一下即将实现的效果，如图5.16所示。&lt;/div&gt;&lt;br /&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/nokiaguy/074554ogb0gbzd9ztocfo9.png" /&gt; &lt;br /&gt;&lt;br /&gt;&lt;div&gt;图5.16&amp;nbsp;&amp;nbsp;在EditText控件中输入文字和图像&lt;br /&gt; &lt;br /&gt; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;为了实现这个程序，首先来准备一些要用到的素材，也就是要在EditText控件中输入的图像文件。本例准备了9个png图像文件（face1.png至face9.png），都放在了res\drawable目录中。&lt;br /&gt; 接下来在屏幕上放一个只能显示3行（可输入多行）的EditText和一个Button，布局文件的代码如下：&lt;br /&gt; &lt;br /&gt; &lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #FF00FF;"&gt;xml&amp;nbsp;version="1.0"&amp;nbsp;encoding="utf-8"&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;LinearLayout&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;xmlns:android&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="http://schemas.android.com/apk/res/android"&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:orientation&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="vertical"&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;&amp;nbsp;android:layout_width&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_height&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;EditText&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;android:id&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="@+id/edittext"&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;&amp;nbsp;android:layout_width&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_height&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="wrap_content"&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;&amp;nbsp;android:lines&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="3"&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;&amp;nbsp;android:gravity&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="left|top"&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;Button&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;android:layout_width&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="wrap_content"&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_height&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="wrap_content"&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;&amp;nbsp;android:text&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="随机插入表情"&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:onClick&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="onClick_RandomFace"&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;&amp;nbsp;android:layout_marginTop&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="10dp"&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;LinearLayout&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt; &amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp;上面代码的&amp;lt;EditText&amp;gt;标签中将android:gravity属性值设为left|top。以使输入的文本从左上角开始显 示，如果不设置该属性，则输入的文本会从左侧中心位置开始显示（由于设置了android:line=&amp;#8221;3&amp;#8221;，因此，EditText可同时显示三行的内 容，所以会存在这个问题，如果只显示一行，则不存在这个问题）。&lt;br /&gt; &lt;br /&gt; &amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Button&amp;gt;标签的android:onClick属性值指定了单击事件方法（onClick_RandomFace），在该方法 中随机获得了face1.png至face9.png中任意一个图像资源的ID。最常用的方法是将这9个图像资源ID放到数组中，然后随机产生一个数组索 引来获取相应的图像资源ID。但本例未采用这种方法，而是采用了直接通过反射技术从R.drawable类中获得图像资源ID的方法。这种方法的好处是一 但图像资源非常多时，可以不需要在数组中挨个定义就可以获得任意的图像资源ID。&lt;br /&gt; &lt;br /&gt; &amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp;在5.2.2节使用了&amp;lt;img&amp;gt;标签来插入图像，虽然在EditText控件中插入图像也可采用这种方法。但本例使用了另外一种更简单 的方法，就是使用android.text.style.ImageSpan类来直接插入图像。下面来看看具体的实现代码。&lt;br /&gt; &lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;onClick_RandomFace(View&amp;nbsp;view)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;随机产生1至9的整数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;randomId&amp;nbsp;=&amp;nbsp;1&amp;nbsp;+&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Random().nextInt(9);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;根据随机产生的1至9的整数从R.drawable类中获得相应资源ID（静态变量）的Field对象&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Field&amp;nbsp;field&amp;nbsp;=&amp;nbsp;R.drawable.&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;.getDeclaredField("face"&amp;nbsp;+&amp;nbsp;randomId);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;获得资源ID的值，也就是静态变量的值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;resourceId&amp;nbsp;=&amp;nbsp;Integer.parseInt(field.get(&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;).toString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;根据资源ID获得资源图像的Bitmap对象&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Bitmap&amp;nbsp;bitmap&amp;nbsp;=&amp;nbsp;BitmapFactory.decodeResource(getResources(),&amp;nbsp;resourceId);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;根据Bitmap对象创建ImageSpan对象&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ImageSpan&amp;nbsp;imageSpan&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;ImageSpan(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;,&amp;nbsp;bitmap);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;创建一个SpannableString对象，以便插入用ImageSpan对象封装的图像&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SpannableString&amp;nbsp;spannableString&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;SpannableString("face");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;用ImageSpan对象替换face&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;spannableString.setSpan(imageSpan,&amp;nbsp;0,&amp;nbsp;4,&amp;nbsp;Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;将随机获得的图像追加到EditText控件的最后&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;edittext.append(spannableString);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;br /&gt; 编写上面代码需要注意如下几点。&lt;br /&gt; 1.&amp;nbsp;&amp;nbsp;由于R.drawable中的资源ID都是public的静态变量，因此，可直接使用Field.get方法获得这些变量的值。如果是 private或protected的变量，需要field.setAccessible(true)设置变量值的访问权限才可以读写这些变量。&lt;br /&gt; 2.&amp;nbsp;&amp;nbsp;使用Field.get方法获得变量值时，如果是静态变量。Field.get方法的参数值设为null即可。如果不是静态变量，需要为Field.get方法指定一个变量所在类的对象作为参数值。&lt;br /&gt; 3.&amp;nbsp;&amp;nbsp;由于EditText类不能直接插入Span对象，因此，需要先使用SpannableString对象来封装Span对象（如本例中的ImageSpan对象），再将SpannableString对象插入到EditText控件中。&lt;/div&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nokiaguy/aggbug/2199775.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nokiaguy/archive/2011/10/06/2199775.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nokiaguy/archive/2011/09/06/2169157.html</id><title type="text">Android开发（1）：随机绘制彩色实心圆</title><summary type="text">本文介绍了如何利用Android的绘图技术随机绘制彩色实心圆。</summary><published>2011-09-06T12:42:00Z</published><updated>2011-09-06T12:42:00Z</updated><author><name>银河使者</name><uri>http://www.cnblogs.com/nokiaguy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nokiaguy/archive/2011/09/06/2169157.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nokiaguy/archive/2011/09/06/2169157.html"/><content type="html">&lt;div&gt;本文介绍了如何利用Android的绘图技术随机绘制彩色实心圆。效果如图1所示。&lt;br /&gt; &lt;br /&gt; &lt;img alt="" src="http://www.blogjava.net/images/blogjava_net/nokiaguy/android1_a.png" height="480" width="320" /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 图1&lt;br /&gt; &lt;br /&gt; &lt;div&gt; &lt;p style="text-indent:20.0pt"&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;这个程序的核心是画布，也就是&lt;/span&gt;Canvas&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;对象。要想在&lt;/span&gt;Canvas&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;上绘制图形，需要将&lt;/span&gt;Canvas&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;放在&lt;/span&gt;View&lt;span style="font-family: 宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;上。因此，首先需要建立一个画布类，这个画布类是&lt;/span&gt;View&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;的子类。当画布刷新时，会调用&lt;/span&gt;onDraw&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;方法来重绘制画布，我们可以从&lt;/span&gt;onDraw&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;方法的参数来获得要绘制图形的&lt;/span&gt;Canvas&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;对象。&lt;/span&gt;&lt;/p&gt; &lt;p style="text-indent: 20pt;"&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;由于画布重绘时会清空所有的内容，因此，要想绘制多个实心圆，需要使用一个&lt;/span&gt;List&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;变量将曾经绘制的实心圆的相关信息（圆心坐标、半径、画笔颜色）保存起来，以便绘制下一个实心圆时重绘前面绘制的所有的实心圆。如果不用&lt;/span&gt;List&lt;span style="font-family: 宋体;"&gt;对象保留绘制历史，则只能绘制最后一个实心圆。下面来看看这个画布类的代码。&lt;/span&gt;&lt;/p&gt; &lt;p style="text-indent: 20pt;"&gt;&lt;br /&gt; &lt;/p&gt; &lt;div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"&gt;&lt;span style="color: #0000FF; "&gt;package&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;mobile.android.ch02.first;&lt;br /&gt; &lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;import&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;java.util.ArrayList;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;import&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;java.util.List;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;import&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;android.content.Context;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;import&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;android.graphics.Canvas;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;import&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;android.graphics.Paint;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;import&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;android.view.View;&lt;br /&gt; &lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;CircleCanvas&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;extends&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;View&lt;br /&gt; {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;保存绘制历史&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;List&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;CircleInfo&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;mCircleInfos&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;ArrayList&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;CircleCanvas.CircleInfo&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;();&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;保存实心圆相关信息的类&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;CircleInfo&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;float&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;x;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;圆心横坐标&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;float&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;y;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;圆心纵坐标&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;float&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;radius;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;半径&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;color;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;画笔的颜色&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;float&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;getX()&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;x;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;setX(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;float&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;x)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.x&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;x;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;float&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;getY()&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;y;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;setY(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;float&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;y)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.y&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;y;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;float&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;getRadius()&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;radius;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;setRadius(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;float&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;radius)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.radius&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;radius;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;getColor()&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;color;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;setColor(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;color)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;.color&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;color;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;CircleCanvas(Context&amp;nbsp;context)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;super&lt;/span&gt;&lt;span style="color: #000000; "&gt;(context);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;当画布重绘时调用该方法，Canvas表示画布对象，可以在该对象上绘制基本的图形&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;onDraw(Canvas&amp;nbsp;canvas)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;super&lt;/span&gt;&lt;span style="color: #000000; "&gt;.onDraw(canvas);&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;根据保存的绘制历史重绘所有的实心圆&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;for&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;(CircleInfo&amp;nbsp;circleInfo&amp;nbsp;:&amp;nbsp;mCircleInfos)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Paint&amp;nbsp;paint&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;Paint();&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;设置画笔颜色&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;paint.setColor(circleInfo.getColor());&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;绘制实心圆&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;canvas.drawCircle(circleInfo.getX(),&amp;nbsp;circleInfo.getY(),&amp;nbsp;circleInfo.getRadius(),&amp;nbsp;paint);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; }&lt;br /&gt; &lt;/span&gt;&lt;/div&gt; &lt;br /&gt; &lt;p style="text-indent:20.0pt"&gt;&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;下面我们来编写主程序。在创建工程时会要求输入一个&amp;#8220;&lt;/span&gt;Create Activity&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;&amp;#8221;，由于我们输入的是&amp;#8220;&lt;/span&gt;Main&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;&amp;#8221;，因此，生成的主类就是&lt;/span&gt;Main.java&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;。打开&lt;/span&gt;Main.java&lt;span style="font-family:宋体;Times New Roman&amp;quot;;Times New Roman&amp;quot;"&gt;文件，输入如下的代码。&lt;/span&gt;&lt;/p&gt; &lt;br /&gt; &lt;div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"&gt;&lt;span style="color: #0000FF; "&gt;package&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;mobile.android.ch02.first;&lt;br /&gt; &lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;import&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;java.util.Random;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;import&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;mobile.android.first.CircleCanvas.CircleInfo;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;import&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;android.app.Activity;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;import&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;android.graphics.Color;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;import&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;android.os.Bundle;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;import&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;android.view.View;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;import&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;android.view.ViewGroup;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;import&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;android.view.ViewGroup.LayoutParams;&lt;br /&gt; &lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;Main&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;extends&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;Activity&lt;br /&gt; {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;private&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;CircleCanvas&amp;nbsp;mCircleCanvas;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;定义一个画布类&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;onCreate(Bundle&amp;nbsp;savedInstanceState)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;super&lt;/span&gt;&lt;span style="color: #000000; "&gt;.onCreate(savedInstanceState);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;装载布局文件（在2.2.3节配置的main.xml文件）&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ViewGroup&amp;nbsp;viewGroup&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;(ViewGroup)getLayoutInflater().inflate(R.layout.main,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;null&lt;/span&gt;&lt;span style="color: #000000; "&gt;);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mCircleCanvas&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;CircleCanvas(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;this&lt;/span&gt;&lt;span style="color: #000000; "&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;创建CircleCanvas（画布类）对象&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;将CircleCanvas对象添加到当前界面的视图中（两个按钮的下方）&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewGroup.addView(mCircleCanvas,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;LayoutParams(LayoutParams.FILL_PARENT,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;350&lt;/span&gt;&lt;span style="color: #000000; "&gt;));&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setContentView(viewGroup);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;开始随机绘制圆形（第一个按钮的单击事件）&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;onClick_DrawRandomCircle(View&amp;nbsp;view)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Random&amp;nbsp;random&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;Random();&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;float&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;randomX&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt;(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;float&lt;/span&gt;&lt;span style="color: #000000; "&gt;)(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;100&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000; "&gt;+&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;random.nextInt(&lt;/span&gt;&lt;span style="color: #000000; "&gt;100&lt;/span&gt;&lt;span style="color: #000000; "&gt;));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;随机生成圆心横坐标（100至200）&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;float&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;randomY&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt;(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;float&lt;/span&gt;&lt;span style="color: #000000; "&gt;)(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;100&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000; "&gt;+&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;random.nextInt(&lt;/span&gt;&lt;span style="color: #000000; "&gt;100&lt;/span&gt;&lt;span style="color: #000000; "&gt;));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;随机生成圆心纵坐标（100至200）&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;float&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;randomRadius&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt;(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;float&lt;/span&gt;&lt;span style="color: #000000; "&gt;)(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;20&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000; "&gt;+&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;random.nextInt(&lt;/span&gt;&lt;span style="color: #000000; "&gt;40&lt;/span&gt;&lt;span style="color: #000000; "&gt;));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;随机生成圆的半径（20至60）&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;randomColor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;产生0至100的随机数，若产生的随机数大于50，则画笔颜色为蓝色&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt;(random.nextInt(&lt;/span&gt;&lt;span style="color: #000000; "&gt;100&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000; "&gt;50&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;randomColor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;Color.BLUE;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;else&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;产生0至100的随机数，若产生的随机数大于50，则画笔颜色为红色&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt;(random.nextInt(&lt;/span&gt;&lt;span style="color: #000000; "&gt;100&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000; "&gt;50&lt;/span&gt;&lt;span style="color: #000000; "&gt;)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;randomColor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;Color.RED;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;否则，画笔颜色为绿色&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;else&lt;/span&gt;&lt;span style="color: #000000; "&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;randomColor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;Color.GREEN;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CircleInfo&amp;nbsp;circleInfo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;CircleInfo();&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;circleInfo.setX(randomX);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;circleInfo.setY(randomY);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;circleInfo.setRadius(randomRadius);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;circleInfo.setColor(randomColor);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mCircleCanvas.mCircleInfos.add(circleInfo);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;将当前绘制的实心圆信息加到List对象中&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mCircleCanvas.invalidate();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;使画布重绘&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;清空画布（第二个按钮的单击事件）&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;onClick_Clear(View&amp;nbsp;view)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mCircleCanvas.mCircleInfos.clear();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;清除绘制历史&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mCircleCanvas.invalidate();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;&amp;nbsp;&amp;nbsp;使画布重绘&lt;/span&gt;&lt;span style="color: #008000; "&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; }&lt;br /&gt; &lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;br /&gt;&lt;span style="color: red;"&gt;本文截选自&lt;a href="http://product.china-pub.com/198502"&gt;《Android开发权威指南》&lt;/a&gt;，如需转载，请注明出处。&lt;/span&gt;&lt;br /&gt; &lt;/div&gt;&lt;img src="http://www.cnblogs.com/nokiaguy/aggbug/2169157.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nokiaguy/archive/2011/09/06/2169157.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nokiaguy/archive/2011/04/29/2033159.html</id><title type="text">赶紧升级到Android 2.3.4，体验最新的Android技术</title><summary type="text">使用Google的二儿子（Nexus S）的童鞋赶紧了，Android 2.3.4已经出来了（虽然官方文档暂时还没更新，可能出来还不到24小时），如果已经是android 2.3.1，必须升级到Android 2.3.3后才能升级到2.3.4。</summary><published>2011-04-29T14:26:00Z</published><updated>2011-04-29T14:26:00Z</updated><author><name>银河使者</name><uri>http://www.cnblogs.com/nokiaguy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nokiaguy/archive/2011/04/29/2033159.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nokiaguy/archive/2011/04/29/2033159.html"/><content type="html">&lt;div&gt;使用Google的二儿子（Nexus S）的童鞋赶紧了，Android 2.3.4已经出来了（虽然官方文档暂时还没更新，可能出来还不到24小时），如果已经是android 2.3.1，必须升级到Android 2.3.3后才能升级到2.3.4。顺便说一下，这是增量升级，升级不会删除原来的系统和数据（包括联系人、短信等内容），大家尽可放心升级。&lt;br /&gt; &lt;img src="http://www.eoeandroid.com/data/attachment/forum/201104/29/221842rs3kd9mlsyyvam95.png" id="aimg_34072" alt="android2.3.4.png" title="android2.3.4.png" width="480" /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; 升级方法，&lt;br /&gt; &lt;br /&gt; &amp;nbsp; &amp;nbsp; 1.&amp;nbsp; 将该文件放到你的手机的内部存储空间的根目录中&lt;br /&gt; &amp;nbsp; &amp;nbsp; 2.&amp;nbsp; 关机，然后重新启动并通过持续按下 volume up（音量增大）和 power（电源）按钮的方法进入 bootloader&lt;br /&gt; &amp;nbsp; &amp;nbsp; 3.&amp;nbsp; 使用 volume（音量）按钮选中&amp;#8220;recovery&amp;#8221;，并按下 power（电源）按钮确认&lt;br /&gt; &amp;nbsp; &amp;nbsp; 4.&amp;nbsp; 当你在屏幕上看到三角形后，保持按下 power（电源）按钮然后再按 volume up（音量增大）按钮，这时你可以看到一个选项列表，选择更新文件即可&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; 就是这么简单，升级过程大概1至2分钟。赶快来试试吧&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; android 2.3.3升级包&lt;br /&gt; &lt;a href="http://v15.lscache1.c.android.clients.google.com/packages/data/ota/google_crespo/e0b546c442bf.signed-soju-GRI40-from-GRH78.e0b546c4.zip" target="_blank"&gt;http://v15.lscache1.c.android.clients.google.com/packages/data/ota/google_crespo/e0b546c442bf.signed-soju-GRI40-from-GRH78.e0b546c4.zip&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; android 2.3.4升级包&lt;br /&gt; &lt;a href="http://v3.lscache3.c.android.clients.google.com/packages/data/ota/google_crespo/a14a2dd09749.signed-soju-GRJ22-from-GRI40.a14a2dd0.zip" target="_blank"&gt;http://v3.lscache3.c.android.clients.google.com/packages/data/ota/google_crespo/a14a2dd09749.signed-soju-GRJ22-from-GRI40.a14a2dd0.zip&lt;/a&gt; &lt;/div&gt;&lt;img src="http://www.cnblogs.com/nokiaguy/aggbug/2033159.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nokiaguy/archive/2011/04/29/2033159.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nokiaguy/archive/2010/11/17/1879993.html</id><title type="text">乐博Android客户端（新浪微博）1.01发布，欢迎各位童鞋试用</title><summary type="text">    乐博Android客户端是 一款基于Android的新浪微博客户端。支持同时维护多个新浪微博帐号。可获得新浪微博支持的所有信息。其中包括首页微博、随便看看、我的微博、@提到 我的、评论、私信、我的收藏等。发布微博支持拍照、相册、表情、话题等功能。同时可以通过内置的图像特效编辑器编辑拍摄或相册中的图片。特效目前包括马赛 克、灰度、裁剪图像、任意角度旋转。除此之外，本系统还 提供了两个快捷方式：乐博写写和乐博拍拍。可以将他们放在Android的桌面，分别用于快速写微博和即拍即发。当然，乐博Android客户端还有很多 奇妙的功能。这就有待各位童鞋去挖掘了。未来的乐博Android客户端将会加入更具有创造性的功能，让我们共同期待她的完美表现吧！</summary><published>2010-11-17T09:03:00Z</published><updated>2010-11-17T09:03:00Z</updated><author><name>银河使者</name><uri>http://www.cnblogs.com/nokiaguy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nokiaguy/archive/2010/11/17/1879993.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nokiaguy/archive/2010/11/17/1879993.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong style="color: red;"&gt;本文为原创，如需转载，请注明作者和出处，谢谢！&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; 官方网站&lt;br /&gt; &lt;br /&gt; &lt;a href="http://51happyblog.com/"&gt;http://51happyblog.com/&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 乐博&lt;span href="http://dev.10086.cn/cmdn/bbs/tag.php?name=Android"&gt;Android&lt;/span&gt;&lt;span href="http://dev.10086.cn/cmdn/bbs/tag.php?name=%E5%AE%A2%E6%88%B7%E7%AB%AF"&gt;客户端&lt;/span&gt;是 一款基于Android的新浪微博客户端。支持同时维护多个新浪微博帐号。可获得新浪微博支持的所有信息。其中包括首页微博、随便看看、我的微博、@提到 我的、评论、私信、我的收藏等。发布微博支持拍照、相册、表情、话题等功能。同时可以通过内置的图像特效编辑器编辑拍摄或相册中的图片。特效目前包括马赛 克、灰度、裁剪图像、任意角度旋转。除此之外，本&lt;span href="http://dev.10086.cn/cmdn/bbs/tag.php?name=%E7%B3%BB%E7%BB%9F"&gt;系统&lt;/span&gt;还 提供了两个快捷方式：乐博写写和乐博拍拍。可以将他们放在Android的桌面，分别用于快速写微博和即拍即发。当然，乐博Android客户端还有很多 奇妙的功能。这就有待各位童鞋去挖掘了。未来的乐博Android客户端将会加入更具有创造性的功能，让我们共同期待她的完美表现吧！&lt;br /&gt; &lt;br /&gt; 精彩截图&lt;br /&gt; &lt;br /&gt; &lt;img alt="" src="http://www.blogjava.net/images/blogjava_net/nokiaguy/android1.png" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;img alt="" src="http://www.blogjava.net/images/blogjava_net/nokiaguy/android2.png" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;img alt="" src="http://www.blogjava.net/images/blogjava_net/nokiaguy/android3.png" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;img alt="" src="http://www.blogjava.net/images/blogjava_net/nokiaguy/android4.png" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;img alt="" src="http://www.blogjava.net/images/blogjava_net/nokiaguy/android5.png" /&gt;&lt;img src="http://www.cnblogs.com/nokiaguy/aggbug/1879993.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nokiaguy/archive/2010/11/17/1879993.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nokiaguy/archive/2010/11/10/1873253.html</id><title type="text">推荐：总能找到一个你觉得最好的免费电子书下载网站</title><summary type="text">看书是获取知识的最佳途径之一，而读电子书更是我们IT人士的主要方式，在哪里可以获得自己需要的电子书呢？今天给大家推荐一些别人推荐的免费电子书下载网站，我相信其中总有一个是你所需要的，快去看看吧。当然，你要是不缺钱，还是支持正版吧！</summary><published>2010-11-10T00:44:00Z</published><updated>2010-11-10T00:44:00Z</updated><author><name>银河使者</name><uri>http://www.cnblogs.com/nokiaguy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nokiaguy/archive/2010/11/10/1873253.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nokiaguy/archive/2010/11/10/1873253.html"/><content type="html">看书是获取知识的最佳途径之一，而读电子书更是我们IT人士的主要方式，在哪里可以获得自己需要的电子书呢？今天给大家推荐一些别人推荐的免费电子书下载网站，我相信其中总有一个是你所需要的，快去看看吧。当然，你要是不缺钱，还是支持正版吧！&lt;ol&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.freebookspot.com/"&gt;FreeBookSpot&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.freebookspot.com/"&gt;FreeBookSpot&lt;/a&gt; is an online source of free ebooks &lt;span id="IL_AD8"&gt;download&lt;/span&gt; with &lt;strong&gt;4485 FREE E-BOOKS in 96 categories&lt;/strong&gt; which up to 71,97 GB. &lt;/p&gt; &lt;p&gt;You can search and download free books in categories like scientific,  engineering, programming, fiction and many other books. No &lt;span id="IL_AD10"&gt;registration&lt;/span&gt; is required to download free e-books.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.freebookspot.com/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3316/3315886764_b445f3b84d.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" width="500" height="372" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://4ebooks.org/"&gt;4eBooks&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://4ebooks.org/"&gt;4eBooks&lt;/a&gt; has a &lt;strong&gt;huge collection of &lt;span id="IL_AD7"&gt;computer&lt;/span&gt; programming ebooks&lt;/strong&gt;.  Each downloadable ebook has a short review with a description. You can  find over thousand of free ebooks in every computer programming field  like .Net, Actionscript, Ajax, Apache and etc.&lt;/p&gt; &lt;p&gt;&lt;a href="http://4ebooks.org/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3646/3315886688_76361beacc.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" width="500" height="304" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.free-ebooks.net/"&gt;Free-eBooks&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.free-ebooks.net/"&gt;Free-eBooks&lt;/a&gt; is an online source for &lt;strong&gt;free ebook &lt;span id="IL_AD6"&gt;downloads&lt;/span&gt;, ebook resources and ebook authors&lt;/strong&gt;. Besides free ebooks, you also download free magazines or submit your own ebook.&lt;/p&gt; &lt;p&gt;You need to become a Free-EBooks.Net member to access their library. Registration is free.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.free-ebooks.net/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3579/3315059967_e2c840faf7.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" width="500" height="275" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://manybooks.net/"&gt;ManyBooks&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://manybooks.net/"&gt;ManyBooks&lt;/a&gt; provides &lt;strong&gt;free ebooks for your PDA, iPod or &lt;span id="IL_AD2"&gt;eBook Reader&lt;/span&gt;&lt;/strong&gt;.  You can randomly browse for a ebook through the most popular titles,  recommendations or recent reviews for visitors. There are 21,282 eBooks  available here and they&amp;#8217;re all free!&lt;/p&gt; &lt;p&gt;&lt;a href="http://manybooks.net/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3412/3315060457_7d11ae516e.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" width="500" height="340" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.getfreeebooks.com/"&gt;GetFreeEBooks&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.getfreeebooks.com/"&gt;GetFreeEBooks&lt;/a&gt; is a free  ebooks site where you can download free books totally free. All the  ebooks within the site are legal downloadable free ebooks.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.getfreeebooks.com/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3390/3315060259_cd598f1e1b.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" width="500" height="364" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://freecomputerbooks.com/"&gt;FreeComputerBooks&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://freecomputerbooks.com/"&gt;FreeComputerBooks&lt;/a&gt;  consists of a huge collection of free online Computer, Programming,  Mathematics, Technical Books, Lecture Notes and Tutorials. It is very  well categorized by topics, with 12 top level categories, and over 150  sub-categories.&lt;/p&gt; &lt;p&gt;&lt;a href="http://freecomputerbooks.com/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3361/3315060117_b654581b42.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" width="500" height="224" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.freetechbooks.com/"&gt;FreeTechBooks&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.freetechbooks.com/"&gt;FreeTechBooks&lt;/a&gt; lists free online computer science, engineering and programming &lt;strong&gt;books&lt;/strong&gt;, &lt;strong&gt;textbooks&lt;/strong&gt; and &lt;strong&gt;lecture notes&lt;/strong&gt;, all of which are &lt;strong&gt;legally and freely available&lt;/strong&gt; over the Internet. Throughout &lt;a href="http://www.freetechbooks.com/"&gt;FreeTechBooks&lt;/a&gt;, other terms are used to refer to a book, such as &lt;strong&gt;ebook&lt;/strong&gt;, &lt;strong&gt;text&lt;/strong&gt;, &lt;strong&gt;document&lt;/strong&gt;, &lt;strong&gt;monogram&lt;/strong&gt; or &lt;strong&gt;notes&lt;/strong&gt;. &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.freetechbooks.com/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3629/3315887666_f07932c6dc.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" width="500" height="267" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.scribd.com/"&gt;Scribd&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.scribd.com/"&gt;Scribd&lt;/a&gt;, the online document  sharing site which supports Word, Excel, PowerPoint, PDF and other  popular formats. You can download a document or embed it in your blog or  web page.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.scribd.com/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3621/3315060879_3dc6dc21d6.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" width="500" height="334" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.globusz.com/"&gt;Globusz&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.globusz.com/"&gt;Globusz&lt;/a&gt; is a unique ePublishing  house, specializing in free eBook downloads. They also provide an  excellent Star Rating Showcase for new and evolving authors.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.globusz.com/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3346/3315887862_164b091b38.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" width="500" height="349" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://knowfree.net/"&gt;KnowFree&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://knowfree.net/"&gt;KnowFree&lt;/a&gt; is a web portal where  users are able to exchange freely e-books, video training and other  materials for educational purposes and self-practice.&lt;/p&gt; &lt;p&gt;&lt;a href="http://knowfree.net/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3428/3315060429_49d6d98889.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" width="500" height="283" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.onlinefreeebooks.net/"&gt;OnlineFreeEBooks&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.onlinefreeebooks.net/"&gt;OnlineFreeEBooks&lt;/a&gt;  provides links to various ebooks (mostly in pdf) spanning in 9 big  categories which are: Automotive Ebooks, Business Ebooks, Engineering  Ebooks, Gadget Ebooks, Hardware Ebooks, Health &amp;amp; Medical Ebooks,  Hobbies Ebooks, Programming &amp;amp; Technology Ebooks, Sport &amp;amp; Martial  Art Ebooks.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.onlinefreeebooks.net/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3593/3315060703_8fa323a39f.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" width="500" height="322" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.memoware.com/"&gt;MemoWare&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.memoware.com/"&gt;MemoWare&lt;/a&gt; has a unique  collection of thousands of documents (databases, literature, maps,  technical references, lists, etc.) specially formatted to be easily  added to your &lt;em&gt;PalmOS device&lt;/em&gt;, &lt;em&gt;Pocket PC, Windows CE, EPOC, Symbian&lt;/em&gt; or other handheld device.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.memoware.com/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3571/3315887996_d060613f56.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" width="500" height="248" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.zillr.org/"&gt;BluePortal&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.zillr.org/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3656/3315886980_6d6a25358c.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" width="500" height="362" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.onlinecomputerbooks.com/"&gt;OnlineComputerBooks&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.onlinecomputerbooks.com/"&gt;OnlineComputerBooks&lt;/a&gt; contains details about free computer books, free ebooks, free &lt;span id="IL_AD5"&gt;online books&lt;/span&gt;  and sample chapters related to Information Technology, Computer  Science, Internet, Business, Marketing, Maths, Physics and Science which  are provided by publishers or authors.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.onlinecomputerbooks.com/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3653/3315060599_0d417dc12b.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" border="0" width="500" height="293" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.snipfiles.com/"&gt;SnipFiles&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.snipfiles.com/"&gt;SnipFiles&lt;/a&gt; offers you free  ebooks and software legally by brought or attained PLR, resale or  master rights to all the products on their page. &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.snipfiles.com/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3661/3315060951_61b898cf5e.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" width="500" height="312" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.bookyards.com/"&gt;BookYards&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.bookyards.com/"&gt;BookYards&lt;/a&gt; is a web portal  in which books, education materials, information, and content will be  freely to anyone who has an internet connection. &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.bookyards.com/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3368/3315059581_23d0543d94.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://digital.library.upenn.edu/books/"&gt;The Online Books Page&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://digital.library.upenn.edu/books/"&gt;The Online Books Page&lt;/a&gt; is a Listing over 30,000 free books on the Web. &lt;/p&gt; &lt;p&gt;&lt;a href="http://digital.library.upenn.edu/books/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3480/3315061015_1e6684368e.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.asksam.com/ebooks/"&gt;AskSam Ebooks&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.asksam.com/ebooks/"&gt;AskSam Ebooks&lt;/a&gt; has a collection of free e-books like Shakespeare, and assorted legal &amp;amp; governmental texts. &lt;/p&gt; &lt;p&gt;&lt;a href="http://digital.library.upenn.edu/books/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3631/3315886838_099ec74998.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.baen.com/library/"&gt;Baen Free Library&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.baen.com/library/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3460/3315886936_5582cca7a0.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.baen.com/library/"&gt;Baen Free Library&lt;/a&gt; is an online library of downloadable science fiction novels. &lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.ebooklobby.com/"&gt;eBookLobby&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Free ebooks in &lt;a href="http://www.ebooklobby.com/"&gt;eBookLobby&lt;/a&gt;  are divided into different categories. Categorys range from business,  art, computing and education. Select the category appropriate to the  e-book you&amp;#8217;re looking for.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.ebooklobby.com/"&gt;&lt;img title="20 Best Websites To Download Free EBooks" src="http://farm4.static.flickr.com/3568/3315059857_cec37720b6.jpg?v=0" alt=" 20 Best Websites To Download Free EBooks" border="0" width="500" height="379" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;More Free eBook resources&lt;/strong&gt;&lt;/p&gt; &lt;ol&gt;&lt;li&gt;&lt;a href="http://www.planetpdf.com/free_pdf_ebooks.asp?CurrentPage=1"&gt;&lt;strong&gt;PlanetPDF&lt;/strong&gt;&lt;/a&gt; &amp;#8211; A small collection of classic novels all in &lt;span id="IL_AD4"&gt;PDF format&lt;/span&gt;. &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.dailylit.com/"&gt;&lt;strong&gt;DailyLit&lt;/strong&gt;&lt;/a&gt; &amp;#8211; Read &lt;span id="IL_AD11"&gt;books online&lt;/span&gt; by daily email and RSS feed. &lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikibooks.org/wiki/Main_Page"&gt;&lt;strong&gt;Wikibooks&lt;/strong&gt;&lt;/a&gt; &amp;#8211; Wikibooks is a Wikimedia community for creating a free library of educational textbooks that anyone can edit. &lt;/li&gt;&lt;li&gt;&lt;a href="http://dwalin.ru/books/"&gt;&lt;strong&gt;Dwalin&lt;/strong&gt;&lt;/a&gt; &amp;#8211; Free novels in text format. &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gutenberg.org/browse/scores/top"&gt;&lt;strong&gt;Project Gutenberg&lt;/strong&gt;&lt;/a&gt; &amp;#8211; Free ebooks from producers. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.adobe.com/epaper/ebooks/freebooks.html"&gt;Adobe Free eBooks&lt;/a&gt;&lt;/strong&gt;  &amp;#8211; In Adobe&amp;#8217;s Free eBooks area, you can download, unlock, and read  electronic books on your personal computer or reading device. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.c3f.com/alivfree.html"&gt;Alive &amp;amp; Free&lt;/a&gt;&lt;/strong&gt; &amp;#8211; A page of links to some recent books       from living authors available free online. &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.franklin.com/freelibrary/"&gt;&lt;strong&gt;Franklin&lt;/strong&gt;&lt;/a&gt; &amp;#8211; Thousands of free titles       in text and HTML file formats. &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.readeasily.com/"&gt;&lt;strong&gt;Read Easily&lt;/strong&gt;&lt;/a&gt; &amp;#8211; An ebook online library which has been designed to provide you an adaptive reading experience! &lt;/li&gt;&lt;li&gt;&lt;a href="http://pdfbooks.co.za/"&gt;&lt;strong&gt;PDFbooks&lt;/strong&gt;&lt;/a&gt; &amp;#8211; This new site offers around 4,700 downloadable public domain       e-books. &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.witguides.com/"&gt;&lt;strong&gt;Witguides&lt;/strong&gt;&lt;/a&gt; &amp;#8211; An online source for a wide range of useful e-books that are completely free with no need to sign-up or buy anything. &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.diesel-ebooks.com/cgi-bin/category/free_download"&gt;&lt;strong&gt;Diesel eBooks&lt;/strong&gt;&lt;/a&gt; -Offer  free ebooks formatted for both Microsoft Reader and Mobipocket. &lt;/li&gt;&lt;li&gt;&lt;a href="http://freeebookminers.com/"&gt;&lt;strong&gt;Free eBook Miners&lt;/strong&gt;&lt;/a&gt; &amp;#8211;Free eBooks for your education, research or amusement. &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.planetebook.com/"&gt;&lt;strong&gt;Planet eBook&lt;/strong&gt;&lt;/a&gt; &amp;#8211;Free classic literature to download and share. &lt;/li&gt;&lt;li&gt;&lt;a href="http://e-library.net/free-ebook.htm"&gt;&lt;strong&gt;e-Library&lt;/strong&gt;&lt;/a&gt; &amp;#8211; Plenty of free ebooks available for download. &lt;/li&gt;&lt;li&gt;&lt;a href="http://bookboon.com/"&gt;&lt;strong&gt;BookBoon&lt;/strong&gt;&lt;/a&gt; &amp;#8211; Provides free ebooks for students and travelers in PDF format. No registration is required.  &lt;/li&gt;&lt;/ol&gt;来自于：&lt;a href="http://www.hongkiat.com/blog/20-best-websites-to-download-free-e-books/"&gt;http://www.hongkiat.com/blog/20-best-websites-to-download-free-e-books/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;div&gt; &lt;div style="overflow: hidden; color: #000000; background-color: transparent; text-align: left; text-decoration: none; border: medium none;"&gt;&lt;ol&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://free-ebook-download-links.blogspot.com/"&gt;Free Ebook Download Links&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt; &lt;/li&gt;&lt;p&gt;Free &lt;span id="IL_AD1"&gt;Ebook Download&lt;/span&gt; Links  intends to provide links for downloading books available free in  different format.The books are published online by their authors for  free viewing and printing for non-commercial proposes only.&lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/free_ebooks_download_links.png" alt="free ebooks download links 20 Best Websites To Download Free E Books, Part II" width="400" height="183" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Credit: Raj&lt;/em&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.ebook3000.com/"&gt;eBoook3000&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt; &lt;/li&gt;&lt;p&gt;A library of free ebook downloads with over 17 categories available.&lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/ebook3000.jpg" alt="ebook3000 20 Best Websites To Download Free E Books, Part II" width="400" height="247" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Credit: &lt;a href="http://www.myokyawhtun.com/"&gt;Myo Kyaw Htun&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.slideshare.net/"&gt;SlideShare&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt; &lt;/li&gt;&lt;p&gt;SlideShare is the best way to share your presentations with the  world.  Let your ideas reach a broad audience. Share publicly or  privately.  Add audio to create a webinar.&lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/slideshare.jpg" alt="slideshare 20 Best Websites To Download Free E Books, Part II" width="400" height="182" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Credit: &lt;a href="http://www.storevalentine.com/"&gt;La Ode Adam&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.pdf-search-engine.com/"&gt;PDF Search Engine&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt; &lt;/li&gt;&lt;p&gt;PDF Search Engine is a &lt;span id="IL_AD11"&gt;book search&lt;/span&gt; engine search on sites, forums, message boards for &lt;span id="IL_AD10"&gt;pdf files&lt;/span&gt;. You can find and download a tons of e-books by searching it or browsing through the full directory. &lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/pdf_search_engine.jpg" alt="pdf search engine 20 Best Websites To Download Free E Books, Part II" width="400" height="207" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Credit: iphoner&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt; &lt;li&gt; &lt;a href="http://www.esnips.com/"&gt;eSnips&lt;/a&gt;&lt;/li&gt; &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;eSnips is the one place where you can share anything you want, about  any topic: your thoughts, your &lt;a rel="nofollow" href="http://www.hongkiat.com/blog/out/photolia" target="_blank"&gt;photos&lt;/a&gt;, your music, your &lt;span id="IL_AD4"&gt;videos&lt;/span&gt;,  your  flash files, stuff you find on the web, and many other media  types. You can search and download for free documents in eSnips as well.  &lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/eSnips.jpg" alt="eSnips 20 Best Websites To Download Free E Books, Part II" width="400" height="190" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Credit: &lt;a href="http://www.interestingwebsites.co.nr/"&gt;sandeep&lt;/a&gt;&lt;/em&gt;, &lt;a href="http://syokkahwin.com/blog"&gt;syokkahwin&lt;/a&gt;, &lt;em&gt;Suresh&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt; &lt;li&gt; &lt;a href="http://www.bookgoldmine.com/"&gt;Book Gold Mine &lt;/a&gt;&lt;/li&gt; &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Book Gold Mine serves  a large collection of quality e-books,  lectures, notes, and other kinds of documents at no cost to the user. &lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/book_gold_mine.jpg" alt="book gold mine 20 Best Websites To Download Free E Books, Part II" width="400" height="199" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Credit: &lt;a href="http://www.bookgoldmine.com/"&gt;Gio&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt; &lt;li&gt; &lt;a href="http://www.ebooks-space.com/"&gt;eBooks-Space&lt;/a&gt;&lt;/li&gt; &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Free downloadable ebooks for &lt;span id="IL_AD7"&gt;computer&lt;/span&gt; IT, programming lauguages, software development, tutorial, database design in PDF-CHM file format. &lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/eBooks_Space.jpg" alt="eBooks Space 20 Best Websites To Download Free E Books, Part II" width="400" height="247" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Credit: &lt;a href="http://www.ebooks-space.com/"&gt;mongther&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://drebooks.blogspot.com/"&gt;drebooks&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt; &lt;/li&gt;&lt;p&gt;The vision of the founder was to provide an online space where  Medical  Students and Doctors could gather to share and collaborate  their  information and ideas about medical books.&lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/drebooks.jpg" alt="drebooks 20 Best Websites To Download Free E Books, Part II" width="400" height="222" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Credit: &lt;a href="http://drebooks.blogspot.com/"&gt;peter&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.e-booksdirectory.com/"&gt;E-Books Directory&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt; &lt;/li&gt;&lt;p&gt;E-Books Directory is a daily growing list of freely downloadable  ebooks, documents and lecture notes found all over the internet. You can  submit and promote your own ebooks, add comments on already posted  books or just browse through the directory below and download anything  you need. &lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/e-books_directory.jpg" alt="e books directory 20 Best Websites To Download Free E Books, Part II" width="400" height="211" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Credit: &lt;a href="http://www.e-booksdirectory.com/"&gt;Stam&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.ufindbook.com/"&gt;UFindBook&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt; &lt;/li&gt;&lt;p&gt;UFindBook offers free ebooks download more than 200,000 titles categorized in format of pdf, chm, html.&lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/UFindBook.jpg" alt="UFindBook 20 Best Websites To Download Free E Books, Part II" width="400" height="206" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Credit: &lt;a href="http://www.sobookee.com/"&gt;sobookee&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://books-pdf.blogspot.com/"&gt;Books-PDF&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt; &lt;/li&gt;&lt;p&gt;Books-PDF provides free ebooks for .Net, 3D animation, accounting,  AJAX, algorithms, ASP.NET, AutoCAD, C#, C++, Database and etc. &lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/Books-PDF.jpg" alt="Books PDF 20 Best Websites To Download Free E Books, Part II" width="400" height="229" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Credit: &lt;a href="http://books-pdf.blogspot.com/"&gt;ganesh&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.pdfoo.com/"&gt;PDFoo&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt; &lt;/li&gt;&lt;p&gt;PDFoo.com was developed for free &lt;span id="IL_AD8"&gt;services&lt;/span&gt;  to provide resources of PDF  files. All files based on popular section  and it short by number of the  most download by people. Browse through  the category section will lead you find the PDF files  that you are  looking for. Every time people download, or system will  counting how  many times it has download by people.&lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/pdfoo.jpg" alt="pdfoo 20 Best Websites To Download Free E Books, Part II" width="400" height="197" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Credit: Delaserna&lt;/em&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://ebook.networkgood.com/"&gt;Free Ebook Down&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt; &lt;/li&gt;&lt;p&gt;Free Ebook Down offers over 10,000 free ebooks in 22 categories. &lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/free_ebook_down.jpg" alt="free ebook down 20 Best Websites To Download Free E Books, Part II" width="400" height="264" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Credit: &lt;a href="http://ebook.networkgood.com/"&gt;ebook&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.free-ebooks-canada.com/"&gt;Free-Ebooks-Canada&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt; &lt;/li&gt;&lt;p&gt;Free-Ebooks-Canada  searches for? free ebooks that either have PLR  (Private Label Rights),  MRR (Master Resell Rights), giveaway rights or  personal use only. PLR( Private Label Rights)and MRR (Master Resell  Rights)can be sold and modified to the extent of ebooks resell license.  No Matter whether PLR, MRR or give-away any book can be used for  personal information.&lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/free_ebooks_canada.jpg" alt="free ebooks canada 20 Best Websites To Download Free E Books, Part II" width="400" height="237" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Credit: &lt;a href="http://www.free-ebooks-canada.com/" target="_blank"&gt;mesha&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.ebooksdownloadfree.com/"&gt;eBooks Download Free&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt; &lt;/li&gt;&lt;p&gt;&lt;strong&gt;ebooks download free&lt;/strong&gt; is One of the biggest books sharing websites that contains large collection of pdf and chm &lt;strong&gt;books  free download&lt;/strong&gt; you can download free books in many categories: &lt;strong&gt;Computer books&lt;/strong&gt; like free &lt;strong&gt;php&lt;/strong&gt; ebooks to download,&lt;strong&gt; ADO.NET, AJAX&lt;/strong&gt;, java, ajax, photoshop, javascript &lt;strong&gt;Exchange Server, Sharepoint&lt;/strong&gt; , &lt;strong&gt;ASP.NET&lt;/strong&gt; XML free books downloads, &lt;strong&gt;c#&lt;/strong&gt; and &lt;strong&gt;c+ &lt;/strong&gt;books.&lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/ebooks_download_free.jpg" alt="ebooks download free 20 Best Websites To Download Free E Books, Part II" width="400" height="273" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Credit: &lt;a href="http://www.ebooksdownloadfree.com/"&gt;bookm&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt; &lt;li&gt; &lt;a href="http://www.pdfgeni.com/"&gt;PDFGeni&lt;/a&gt;&lt;/li&gt; &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;PDFGeni is a dedicated pdf search engine for &lt;span id="IL_AD2"&gt;PDF ebooks&lt;/span&gt;, sheets, forms and documents.&lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/pdfgeni.jpg" alt="pdfgeni 20 Best Websites To Download Free E Books, Part II" width="400" height="247" /&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.chmpdf.com/archives/ebooks/"&gt;CHM PDF&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt; &lt;/li&gt;&lt;p&gt;A collection of general interest and technical ebooks.&lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/chmpdf.jpg" alt="chmpdf 20 Best Websites To Download Free E Books, Part II" width="400" height="239" /&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.ebook-x.com/"&gt;eBook-X&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt; &lt;/li&gt;&lt;p&gt;eBook-x lets you to download popular free ebooks, classical free ebooks, new releases and more.&lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/ebook-x.jpg" alt="ebook x 20 Best Websites To Download Free E Books, Part II" width="400" height="261" /&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.spotbit.com/"&gt;Spotbit&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt; &lt;/li&gt;&lt;p&gt;Spotbit.com provides paperless solution to publishing industry which   end result is an E-Book make available in a unique and standalone   digital format that is different from most formats available in the   current market.&lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/spotbit.jpg" alt="spotbit 20 Best Websites To Download Free E Books, Part II" width="400" height="266" /&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://ebookshare.net/"&gt;Ebook Share&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt; &lt;/li&gt;&lt;p&gt;eBook Share provides free ebooks download in torrent format.You can  search for an ebook in categories like magazine, programming, graphic  design, networking, business and investing and the others. &lt;/p&gt;&lt;p&gt;&lt;img title="20 Best Websites To Download Free E Books, Part II" src="http://media02.hongkiat.com/free-ebooks/ebookshare.jpg" alt="ebookshare 20 Best Websites To Download Free E Books, Part II" width="400" height="249" /&gt;&lt;/p&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;More Free eBook resources&lt;/strong&gt;&lt;/p&gt; &lt;ol&gt;&lt;li&gt;&lt;a href="http://www.filebook.net/"&gt;&lt;strong&gt;Filebook&lt;/strong&gt;&lt;/a&gt; &amp;#8211; Free eBooks download in zipped format.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ebooksboard.com/"&gt;&lt;strong&gt;ebooksboard&lt;/strong&gt;&lt;/a&gt; &amp;#8211;  Free eBooks download portal.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.computer-books.us/"&gt;&lt;strong&gt;Computer-Books.us&lt;/strong&gt;&lt;/a&gt; &amp;#8211; Highest quality computer books all of which are available for &lt;span id="IL_AD6"&gt;free download&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://vebook.org/0-01a8edbf9d27cebe.htm"&gt;&lt;strong&gt;76eBook&lt;/strong&gt;&lt;/a&gt; &amp;#8211; Free ebooks download for IT, business and multimedia.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.linuxhaxor.net/2007/09/05/68-linux-related-free-e-books/"&gt;&lt;strong&gt;Linux Related Free Ebooks&lt;/strong&gt;&lt;/a&gt; &amp;#8211;  68 Linux Related Free E-books.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.techbooksforfree.com/"&gt;&lt;strong&gt;TechBooksForFree&lt;/strong&gt;&lt;/a&gt; &amp;#8211; Free books on technology subjects.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.wowio.com/"&gt;&lt;strong&gt;Wowio&lt;/strong&gt;&lt;/a&gt; &amp;#8211; WOWIO is passion for FREE BOOKS + FREE MINDS.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.freeebooks.info/"&gt;&lt;strong&gt;Freeebooks&lt;/strong&gt;&lt;/a&gt; &amp;#8211; Free ebooks are divided into different categories from business, art, computing and education.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.witguides.com/"&gt;&lt;strong&gt;Witguides&lt;/strong&gt;&lt;/a&gt; &amp;#8211;  The premier online source for a wide range of useful e-books that are  completely free with no need to sign-up or buy anything.&lt;/li&gt;&lt;li&gt;&lt;a href="http://issuu.com/"&gt;&lt;strong&gt;Issuu&lt;/strong&gt;&lt;/a&gt; &amp;#8211; Issue lets you find and share the web&amp;#8217;s most interesting publications. &lt;/li&gt;&lt;/ol&gt;&lt;span&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;来自于：&lt;a href="http://www.hongkiat.com/blog/20-best-websites-to-download-free-e-books-part-ii/"&gt;http://www.hongkiat.com/blog/20-best-websites-to-download-free-e-books-part-ii/&lt;/a&gt;&lt;/p&gt; &lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;br /&gt;补充中文的：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://ishare.iask.sina.com.cn/"&gt;http://ishare.iask.sina.com.cn/&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.docin.com/"&gt;http://www.docin.com/&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt; &lt;p&gt;&lt;span style="font-size: 18pt;"&gt;&lt;strong&gt;推荐：&lt;a id="ctl03_TitleUrl" href="http://../archive/2010/10/archive/2010/02/28/1675183.html"&gt;你可能需要的在线电子书&lt;img src="http://images.cnblogs.com/cnblogs_com/zhoujg/040810_0145_blog11.gif" alt="" /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;欢迎转载，转载请注明：转载自&lt;/strong&gt;&lt;strong&gt;&lt;a href="http://zhoujg.cnblogs.com/"&gt;周金根&lt;/a&gt; [ &lt;a href="http://zhoujg.cnblogs.com/"&gt;http://zhoujg.cnblogs.com/&lt;/a&gt; ]&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nokiaguy/aggbug/1873253.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nokiaguy/archive/2010/11/10/1873253.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nokiaguy/archive/2010/11/10/1873251.html</id><title type="text">关于Android中传递数据的一些讨论</title><summary type="text">虽然Intent和静态变量都可以传递数据，但intent功能有限，static过于wrong，那么有没有一种更好的方式呢，答案是yes，这就是Application Context，一个全局的Context，详情请读者参见本文的内容。 </summary><published>2010-11-10T00:39:00Z</published><updated>2010-11-10T00:39:00Z</updated><author><name>银河使者</name><uri>http://www.cnblogs.com/nokiaguy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nokiaguy/archive/2010/11/10/1873251.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nokiaguy/archive/2010/11/10/1873251.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong style="color: red;"&gt;本文为原创，如需转载，请注明作者和出处，谢谢！&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Android中编写过程序的开发人员都知道。在Activity、Service等组件之间传递数据（尤其是复杂类型的数据）很不方便。一般可以使用Intent来传递可序列化或简单类型的数据。看下面的代码。&lt;br /&gt; &lt;br /&gt; &lt;div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Intent&amp;nbsp;intent&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Intent(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;Test.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intent.putExtra(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;param1&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;data1&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intent.putExtra(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;intParam1&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;20&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;startActivity(intent);&lt;br /&gt; &lt;/span&gt;&lt;/div&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这样就ok了。在当前Activity将两个值传到了Test中。但如果遇到不可序列化的数据，如Bitmap、InputStream等，intent就无能为力了。因此，我们很自然地会想到另外一种方法，静态变量。如下面的代码所示：&lt;br /&gt; &lt;br /&gt; &lt;div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Product&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;extends&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Activity&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Bitmap&amp;nbsp;mBitmap;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;img src="http://www.blogjava.net/nokiaguy/archive/2010/Images/dot.gif" alt="" /&gt;&lt;img src="http://www.blogjava.net/nokiaguy/archive/2010/Images/dot.gif" alt="" /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;/span&gt;&lt;/div&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 对于上面的代码来说，其他任何类可以直接使用Product中的mBitmap变量。这么做很easy、也很cool，但却very very  wrong。我们千万不要以为Davlik虚拟机的垃圾回收器会帮助我们回收不需要的内存垃圾。事实上，回收器并不可靠，尤其是手机上，是更加的不可靠。 因此，除非我们要使自己的程序变得越来越糟糕，否则尽量远离static。&lt;br /&gt; &lt;br /&gt; 注：如果经常使用static的Bitmap、Drawable等变量。可能就会抛出一个在Android系统中非常著名的异常（以前budget这个单词一直记不住什么意思，自从经常抛出这个异常后，这个单词终于烂熟于心了，&lt;img src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/images/emwink.gif" alt="" align="absmiddle" border="0" /&gt;）&lt;br /&gt; &lt;br /&gt; &lt;strong style="color: red;"&gt;ERROR/AndroidRuntime(4958): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget&lt;br /&gt; &lt;/strong&gt; &lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 如果不使用static，总得有方法来代替它（尽管我很喜欢public  static，我相信很多人也喜欢它，但为了我们的程序，建议还是忍痛割爱吧），那么这个新的解决方案就是本文的主题，这就是Application  Context，相当于Web程序的Application，它的生命周期和应用程序一样长（这个我喜欢）。&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 那么现在来看看如何使用这个Application  Context。我们可以通过Context.getApplicationContext或Context.getApplication方法获得 Application  Context。但要注意，我们获得的只是Context对象，而更理想的方法是获得一个类的对象。ok，说干就干，下面来定义一个类。&lt;br /&gt; &lt;br /&gt; &lt;div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"&gt;&lt;span style="color: #0000ff;"&gt;package&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;net.blogjava.mobile1;&lt;br /&gt; &lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;android.app.Application;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;android.graphics.Bitmap;&lt;br /&gt; &lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyApp&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;extends&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Application&lt;br /&gt; {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Bitmap&amp;nbsp;mBitmap;&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Bitmap&amp;nbsp;getBitmap()&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;mBitmap;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;setBitmap(Bitmap&amp;nbsp;bitmap)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.mBitmap&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;bitmap;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt; }&lt;br /&gt; &lt;/span&gt;&lt;/div&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 上面这个类和普通的类没什么本质的不同。但该类是Application的子类。对了，这就是使用Application  Context的第一步，定义一个继承自Application的类。然后呢，就在这个类中定义任何我们想使其全局存在的变量了，如本例中的 Bitmap。下面还需要一个重要的步骤，就是在&amp;lt;application&amp;gt;标签中使用android:name属性来指定这个类，代码如 下：&lt;br /&gt; &lt;br /&gt; &lt;div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;application&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;=".MyApp"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp;android:icon&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@drawable/icon"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp;android:label&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@string/app_name"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt; &lt;img src="http://www.blogjava.net/nokiaguy/archive/2010/Images/dot.gif" alt="" /&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;application?&lt;br /&gt; &lt;/span&gt;&lt;/div&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 接下来的最后一步就是向MyApp对象中存入Bitmap对象，或从MyApp对象中取出Bitmap对象了，存入Bitmap对象的代码如下：&lt;br /&gt; &lt;br /&gt; &lt;div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyApp&amp;nbsp;myApp&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(MyApp)getApplication();&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; Bitmap&amp;nbsp;bitmap&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;BitmapFactory.decodeResource(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.getResources(),&amp;nbsp;R.drawable.icon);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; myApp.setBitmap(bitmap);&lt;/span&gt;&lt;/div&gt; &lt;br /&gt; &amp;nbsp; &amp;nbsp; 获得Bitmap对象的代码：&lt;br /&gt; &lt;div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ImageView&amp;nbsp;imageview&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(ImageView)findViewById(R.id.ivImageView);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; MyApp&amp;nbsp;myApp&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(MyApp)getApplication();&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; imageview.setImageBitmap(myApp.getBitmap());&lt;/span&gt;&lt;/div&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 上面两段代码可以在任何的Service、Activity中使用。全局的，哈哈。&lt;img src="http://www.cnblogs.com/nokiaguy/aggbug/1873251.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nokiaguy/archive/2010/11/10/1873251.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nokiaguy/archive/2010/10/28/1863934.html</id><title type="text">《Android/OPhone 开发完全讲义》连载（10）：Sqlite数据库</title><summary type="text">现在终于到讲解数据库的时间了。数据库也是Android存储方案的核心。在Android系统中使用了Sqlite数据库。Sqlite是非常轻量的数据库。从Sqlite的标志是一根羽毛就可以看出Sqlite的目标就是无论是过去、现在，还是将来，Sqlite都将以轻量级数据库的姿态出现。Sqlite虽然轻量，但在执行某些简单的SQL语句时甚至比MySQL和Postgresql还快。由于很多读者是第一次接触Sqlite数据库，因此，在介绍如何在Android中使用Sqlite之前，先在本节简单介绍一下如何在PC上建立Sqlite数据库，以及Sqlite数据库的一些特殊方面（由于本书的目的不是介绍Sqlite数据库，因此，与其他数据库类似的部分（如insert、update等）本书将不再介绍。没有掌握这些知识的读者可以参阅其他关于数据库方面的书籍。</summary><published>2010-10-28T14:18:00Z</published><updated>2010-10-28T14:18:00Z</updated><author><name>银河使者</name><uri>http://www.cnblogs.com/nokiaguy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nokiaguy/archive/2010/10/28/1863934.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nokiaguy/archive/2010/10/28/1863934.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong style="color: red;"&gt;本文为原创，如需转载，请注明作者和出处，谢谢！&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 现在终于到讲解数据库的时间了。数据库也是Android存储方案的核心。在Android系统中使用了Sqlite数据库。Sqlite是非常轻量的数据库。从Sqlite的标志是一根羽毛就可以看出Sqlite的目标就是无论是过去、现在，还是将来，Sqlite都将以轻量级数据库的姿态出现。Sqlite虽然轻量，但在执行某些简单的SQL语句时甚至比MySQL和Postgresql还快。由于很多读者是第一次接触Sqlite数据库，因此，在介绍如何在Android中使用Sqlite之前，先在本节简单介绍一下如何在PC上建立Sqlite数据库，以及Sqlite数据库的一些特殊方面（由于本书的目的不是介绍Sqlite数据库，因此，与其他数据库类似的部分（如insert、update等）本书将不再介绍。没有掌握这些知识的读者可以参阅其他关于数据库方面的书籍。&lt;br /&gt; &lt;strong&gt;6.4.1 Sqlite数据库管理工具&lt;/strong&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &lt;/strong&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 在学习一种新技术之前，首先要做的是在自己的计算机上安装可以操作这种技术的工具。当然，这也非常符合一句成语：功欲善其事，必先利其器。虽然使用好的工具并不能使自己更好地掌握这种技术，但却能使我们的工作效率大大提升。&lt;br /&gt; 言归正传，现在先看看官方为我们提供了什么工具来操作Sqlite数据库。进入官方的下载页面，网址如下：&lt;br /&gt; &lt;a href="http://www.sqlite.org/download.html" target="_blank"&gt;http://www.sqlite.org/download.html&lt;/a&gt;&lt;br /&gt; &amp;nbsp; &amp;nbsp; 在下载页面中找到Windows版的二进制下载包。在作者写作本书时，Sqlite的最新版本是Sqlite3.6.2。因此，要下载的文件是Sqlite-3_6_20.zip。将这个zip文件解压，发现在解压目录中只有1个文件：sqlite3.exe。对，这个文件就是操作Sqlite数据库的工具（是不是很轻量？连工具都只有一个）。它是一个命令行程序，运行这个程序，进入操作界面，如图6.15所示。&lt;br /&gt; &lt;img src="http://file///C:/Users/ADMINI%7E1/AppData/Local/Temp/moz-screenshot.png" alt="" /&gt;&lt;img src="http://dev.10086.cn/cmdn/bbs/attachments/editorimg/10-10-28/22-07-53_scrc6w7he3" alt="" width="582" height="248" /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt; &lt;br /&gt; &amp;nbsp; &amp;nbsp; 在控制台中可以输入SQL语句或控制台命令。所有的SQL语句后面必须以分号（;）结尾。控制台命令必须以实心点（.）开头，例如，.help（显示帮助信息）；.quit（退出控制台）；.tables（显示当前数据库中所有表名）。&lt;br /&gt; 虽然可以在Sqlite的控制台中输入SQL语句来操作数据库，但输入大量的命令会使工作量大大增加。因此，我们必须要使用所谓的&amp;#8220;利器&amp;#8221;来取代这个控制台程序。&lt;br /&gt; 由于Sqlite提供了各种类型的程序接口，因此，可以管理Sqlite数据库的工具非常多，下面是几个比较常用的Sqlite管理工具。&lt;br /&gt; &lt;strong&gt;SQLite Database Browser&lt;/strong&gt;&lt;br /&gt; &lt;a href="http://sourceforge.net/projects/sqlitebrowser" target="_blank"&gt;http://sourceforge.net/projects/sqlitebrowser&lt;/a&gt;&lt;br /&gt; &lt;strong&gt;SQLite Expert Professional&lt;/strong&gt;&lt;br /&gt; &lt;a href="http://www.sqliteexpert.com/" target="_blank"&gt;http://www.sqliteexpert.com&lt;/a&gt;&lt;br /&gt; &lt;strong&gt;Sqlite Developer&lt;/strong&gt;&lt;br /&gt; &lt;a href="http://www.sqlitedeveloper.com/" target="_blank"&gt;http://www.sqlitedeveloper.com&lt;/a&gt;&lt;br /&gt; &lt;strong&gt;sqliteSpy&lt;/strong&gt;&lt;br /&gt; &lt;a href="http://www.softpedia.com/progDownload/SQLiteSpy-Download-107386.html" target="_blank"&gt;http://www.softpedia.com/progDownload/SQLiteSpy-Download-107386.html&lt;/a&gt;&lt;br /&gt; 作者在写作本书时使用了SQLiteExpert Professional，这也是作者推荐使用的Sqlite管理工具。该工具拥有大量的可视化功能，例如，建立数据库、建立表、SQL Builder等工具。图6.16是SQLite ExpertProfessional的主界面。&lt;br /&gt; &lt;br /&gt; &lt;img style="cursor: pointer;" src="http://dev.10086.cn/cmdn/bbs/attachments/editorimg/10-10-28/22-09-00_qpwocetpwp" alt="" width="600" height="414" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;strong&gt;6.4.2&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;创建数据库和表&lt;/strong&gt;&lt;br /&gt; &lt;br /&gt; &amp;nbsp; &amp;nbsp; 使用SQLite控制台工具（sqlite3.exe）建立数据库非常简单，只需要输入如下的命令就可以建立或打开数据库。&lt;br /&gt; sqlite3.exe test.db&lt;br /&gt; &amp;nbsp; &amp;nbsp; 如果数据库（test.db）存在，则打开该数据库，如果数据库不存在，则预建立test.db文件（这时并不生成test.db文件，直到在Sqlite控制台中执行与数据库组件（表、视图、触发器等）相关的命令或SQL语句才创建test.db文件。&lt;br /&gt; 如果想使用sqlite.exe命令同时建立数据库和表，可以先建立一个sql.script文件（也可以是其他文件名），并在其中输入如下的SQL语句：&lt;br /&gt; create table table1 (&lt;br /&gt; &lt;br /&gt; id integerprimary key,&lt;br /&gt; &lt;br /&gt; age int,&lt;br /&gt; &lt;br /&gt; name text &lt;br /&gt; );&lt;br /&gt; create table table2(&lt;br /&gt; &lt;br /&gt; idinteger primary key,&lt;br /&gt; &lt;br /&gt; type_idinteger,&lt;br /&gt; &lt;br /&gt; name text&lt;br /&gt; );&lt;br /&gt; &amp;nbsp; &amp;nbsp; 然后执行如下的命令，就会在建立test.db文件的同时，在该test.db文件中建立table1和table2两个表。&lt;br /&gt; sqlite3.exe test.db &amp;lt; sql.script&lt;br /&gt; 在使用createtable语句创建表时还可以为每一个字段指定默认值，如下面的SQL语句所示：&lt;br /&gt; create table table1 (&lt;br /&gt; &lt;br /&gt; id integerprimary key,&lt;br /&gt; &lt;strong&gt;&lt;br /&gt; age int default 20,&lt;/strong&gt;&lt;br /&gt; &lt;br /&gt; name text &lt;br /&gt; );&lt;br /&gt; create table table2(&lt;br /&gt; &lt;br /&gt; id integerprimary key,&lt;br /&gt; &lt;br /&gt; type_idinteger,&lt;br /&gt; &lt;strong&gt;&lt;br /&gt; name text default 'name1' &lt;/strong&gt;&lt;br /&gt; );&lt;br /&gt; &lt;strong&gt;6.4.3&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;模糊查询&lt;/strong&gt;&lt;br /&gt; &lt;br /&gt; &amp;nbsp; &amp;nbsp; Sqlite的模糊查询与其他数据库类似，都使用了like关键字和%通配符。不过Sqlite在处理中文时会遇到一些麻烦。例如，使用下面的SQL语句向table2插入了一条记录。&lt;br /&gt; insert into table2(id, type_id, name) values(1, 20,'手机操作系统');&lt;br /&gt; 在Sqlite控制台中使用如下的SQL查询是没有问题的。&lt;br /&gt; select * from table2 where name =&lt;br /&gt; '手机操作系统';&lt;br /&gt; 但如果使用下面的模糊查询语句，则无法查询到记录。&lt;br /&gt; select * from table2 where name like&lt;br /&gt; '手机%';&lt;br /&gt; 发生这种事情的原因是因为Sqlite控制台在保存中文时使用的编码格式是GB2312，而执行like操作时使用的是UTF-8。读者可以使用如下的命令来查看Sqlite控制台当前的编码格式。&lt;br /&gt; PRAGMA encoding;&lt;br /&gt; 为了可以使用like模糊查询中文，作者建议使用6.4.1节介绍的SQLite Expert Professional来执行insert、update等SQL语句来编辑数据。在这个工具中会直接使用UTF-8来保存中文。&lt;br /&gt; &lt;strong&gt;6.4.4&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;分页显示记录&lt;/strong&gt;&lt;br /&gt; &lt;br /&gt; &amp;nbsp; &amp;nbsp;分页是在Web应用中经常被提到的概念。基本原理是从数据库中获得查询结果的部分数据，然后显示在页面中。虽然本书并没有介绍Web程序的开发，但获得查询结果的部分数据仍然非常重要。&lt;br /&gt; Sqlite和MySQL相同，都使用了limit关键字来限制select语句返回的记录数。limit需要两个参数，第1个参数表示返回的子记录集在父记录集的开始位置（从0开始），第2个参数表示返回子记录集的记录数。第2个参数为可选值，如果不指定这个参数，会获得从起始位置开始往后的所有记录。例如，下面的select语句返回了table2表中从第11条记录开始的100条记录。&lt;br /&gt; select * from table2 limit 10,100&lt;br /&gt; &lt;strong&gt;6.4.5&lt;/strong&gt;&lt;strong&gt; 事务&lt;/strong&gt;&lt;br /&gt; &lt;br /&gt; &amp;nbsp; &amp;nbsp; 如果一次执行多条修改记录（insert、update等）的SQL语句，那么当某一条SQL语句执行失败时，就需要取消其他SQL语句对记录的修改。否则就会造成数据不一致的情况。而事务是解决这个问题的最佳方法。&lt;br /&gt; 在Sqlite中可以使用BEGIN来开始一个事件，例如，下面的代码执行了两条SQL语句，如果第2条语句执行失败，那么第1条SQL语句执行的结果就会回滚，相当于没执行这条SQL语句。&lt;br /&gt; &lt;strong&gt;BEGIN;&lt;/strong&gt;&lt;br /&gt; insert into table1(id, name) values(50,'Android');&lt;br /&gt; insert into table2(id, name) values(1, '测试');&lt;br /&gt; 如果想显式地回滚记录的修改结果，可以使用ROLLBACK语句，代码如下：&lt;br /&gt; &lt;strong&gt;BEGIN;&lt;/strong&gt;&lt;br /&gt; delete from table2;&lt;br /&gt; &lt;strong&gt;ROLLBACK;&lt;/strong&gt;&lt;br /&gt; 如果想显式地提交记录的修改结果，可以使用COMMIT语句，代码如下：&lt;br /&gt; &lt;strong&gt;BEGIN;&lt;/strong&gt;&lt;br /&gt; delete from table2;&lt;br /&gt; &lt;strong&gt;COMMIT;&lt;/strong&gt;&lt;img src="http://www.cnblogs.com/nokiaguy/aggbug/1863934.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nokiaguy/archive/2010/10/28/1863934.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nokiaguy/archive/2010/09/14/1825902.html</id><title type="text">《Android/OPhone开发完全讲义》连载（8)：收到短信了，我该做点什么？</title><summary type="text">短信是手机中经常使用到的一种服务。然而，当手机接收到短信时，也会向系统发送广播。如果我们的应用程序要在手机接收到短信后做点什么，那就需要接收这个系统广播。接收系统广播的步骤我们已经熟悉了，下面就按步就班地来完成这两个步骤。</summary><published>2010-09-14T06:18:00Z</published><updated>2010-09-14T06:18:00Z</updated><author><name>银河使者</name><uri>http://www.cnblogs.com/nokiaguy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nokiaguy/archive/2010/09/14/1825902.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nokiaguy/archive/2010/09/14/1825902.html"/><content type="html">&lt;span style="color: red;"&gt;本&lt;/span&gt;&lt;span style="color: red;"&gt;文为《And&lt;/span&gt;&lt;span style="color: red;"&gt;roid/OPhone开发完全讲义》一书的内容连载。转载请注明出处&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 短信是手机中经常使用到的一种服务。然而，当手机接收到短信时，也会向系统发送广播。如果我们的应用程序要在手机接收到短信后做点什么，那就需要接收这个系统广播。&lt;br /&gt; 接收系统广播的步骤我们已经熟悉了，下面就按步就班地来完成这两个步骤。&lt;br /&gt; 1.编写一个SMSReceiver类来接收系统广播。&lt;br /&gt; &lt;br /&gt;  &lt;div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"&gt;&lt;span style="color: #0000ff;"&gt;package&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;net.blogjava.mobile.sms;&lt;br /&gt; &lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;android.content.BroadcastReceiver;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;android.content.Context;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;android.content.Intent;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;android.os.Bundle;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;android.telephony.gsm.SmsMessage;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;android.widget.Toast;&lt;br /&gt; &lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;SMSReceiver&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;extends&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;BroadcastReceiver&lt;br /&gt; {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;onReceive(Context&amp;nbsp;context,&amp;nbsp;Intent&amp;nbsp;intent)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;判断接收到的广播是否为收到短信的Broadcast&amp;nbsp;Action&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;android.provider.Telephony.SMS_RECEIVED&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;.equals(intent.getAction()))&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder&amp;nbsp;sb&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;StringBuilder();&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;接收由SMS传过来的数据&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Bundle&amp;nbsp;bundle&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;intent.getExtras();&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;判断是否有数据&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(bundle&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;通过pdus可以获得接收到的所有短信消息&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Object[]&amp;nbsp;objArray&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(Object[])&amp;nbsp;bundle.get(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;pdus&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;构建短信对象array,并依据收到的对象长度来创建array的大小&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SmsMessage[]&amp;nbsp;messages&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;SmsMessage[objArray.length];&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;objArray.length;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;messages&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;SmsMessage.createFromPdu((&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[])&amp;nbsp;objArray);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;将送来的短信合并自定义信息于StringBuilder当中&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(SmsMessage&amp;nbsp;currentMessage&amp;nbsp;:&amp;nbsp;messages)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.append(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;短信来源:&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;获得接收短信的电话号码&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.append(currentMessage.getDisplayOriginatingAddress());&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.append(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;\n------短信内容------\n&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;获得短信的内容&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.append(currentMessage.getDisplayMessageBody());&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Intent&amp;nbsp;mainIntent&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Intent(context,&amp;nbsp;Main.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.startActivity(mainIntent);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;使用Toast信息提示框显示接收到的短信内容&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Toast.makeText(context,&amp;nbsp;sb.toString(),&amp;nbsp;Toast.LENGTH_LONG).show();&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; }&lt;/span&gt;&lt;/div&gt; &lt;br /&gt; 在编写SMSReceiver类时需要注意如下4点：&lt;br /&gt; &lt;ul&gt;&lt;li&gt;接收短信的Broadcast Action是android.provider.Telephony.SMS_RECEIVED，因此，要在onReceiver方法的开始部分判断接收到的是否是接收短信的Broadcast Action。&lt;/li&gt;&lt;li&gt;需要通过Bundle.get("pdus")来获得接收到的短信消息。这个方法返回了一个表示短信内容的数组。每一个数组元素表示一条短信。这就意味着通过Bundle.get("pdus")可以返回多条系统接收到的短信内容。&lt;/li&gt;&lt;li&gt;通过Bundle.get("pdus")返回的数组一般不能直接使用，需要使用SmsMessage.createFromPdu方法将这些数组元素转换成SmsMessage对象才可以使用。每一个SmsMessage对象表示一条短信。&lt;/li&gt;&lt;li&gt;通过SmsMessage类的getDisplayOriginatingAddress方法可以获得发送短信的电话号码。通过getDisplayMessageBody方法可以获得短信的内容。&lt;/li&gt;&lt;/ul&gt; 2.&amp;nbsp; 在AndroidManifest.xml文件中配置SMSReceiver类，代码如下：&lt;br /&gt; &lt;br /&gt; &lt;div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;receiver&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="SMSReceiver"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;intent-filter&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;指定SMSReceiver可以接收的Broadcast&amp;nbsp;Action&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;action&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="android.provider.Telephony.SMS_RECEIVED"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;intent-filter&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;receiver&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 为了使应用程序可以成功地接收SMS_RECEIVED广播，还需要使用&amp;lt;uses-permission&amp;gt;标签为应用程序打开接收短信的权限，代码如下：&lt;br /&gt; &lt;br /&gt; &lt;div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;uses-permission&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="android.permission.RECEIVE_SMS"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;uses-permission&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 现在启动应用程序，界面上会显示&amp;#8220;等待接收短信...&amp;#8221;的信息。那么这里还有一个问题。如果我们在模拟器上测试这个程序呢？&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 解决这个问题并不难，Android模拟器不仅可以模拟程序的运行，还可以模拟手机的很多动作，例如，发短信就是其中之一。要模拟手机的动作，仍然要求助于DDMS透视图。在DDMS透视图中有一个【Emulator Control】视图（如果DDMS中没有这个视图，请读者通过Eclipse的【Window】&amp;gt;【Show View】菜单项来显示这个视图）。在【Telephone Actions】分组框，选中SMS选项框，并在【Incomingnumber】文本框中输入一个电话号，然后在【Message】文本框中输入要发送的短信内容，最后单击【Send】按钮来模拟发送短信。输入相应信息后的【Emulator Control】视图如图1所示。当单击【Send】按钮后，手机模拟器就会接收到短信，不管接收短信的应用程序是否启动，都会显示如图2所示的显示短信内容的Toast信息提示框。&lt;br /&gt; &lt;br /&gt; &lt;em&gt;&lt;em&gt;&lt;img src="http://dev.10086.cn/cmdn/bbs/attachments/editorimg/10-09-08/09-17-35_ag8uh2jdmu" alt="" border="0" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;/em&gt;&lt;/em&gt;&lt;em&gt;&lt;em&gt;&lt;img src="http://dev.10086.cn/cmdn/bbs/attachments/editorimg/10-09-08/09-18-00_cnygto3mi8" alt="" border="0" /&gt;&lt;/em&gt;&lt;/em&gt;&lt;img src="http://www.cnblogs.com/nokiaguy/aggbug/1825902.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nokiaguy/archive/2010/09/14/1825902.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nokiaguy/archive/2010/09/08/1821173.html</id><title type="text">《Android/OPhone开发完全讲义》连载（7)：使用SharedPreferences存取复杂数据</title><summary type="text">    我们知道SharedPreferences只能保存简单类型的数据，例如，String、int等。如果想用SharedPreferences存取更 复杂的数据类型（类、图像等），就需要对这些数据进行编码。我们通常会将复杂类型的数据转换成Base64编码，然后将转换后的数据以字符串的形式保存在 XML文件中。</summary><published>2010-09-08T01:54:00Z</published><updated>2010-09-08T01:54:00Z</updated><author><name>银河使者</name><uri>http://www.cnblogs.com/nokiaguy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nokiaguy/archive/2010/09/08/1821173.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nokiaguy/archive/2010/09/08/1821173.html"/><content type="html">&lt;span style="color: red;"&gt;本文为《Android/OPhone开发完全讲义》一书的内容连载。转载请注明出处&lt;/span&gt;&lt;br style="color: red;" /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 我们知道SharedPreferences只能保存简单类型的数据，例如，String、int等。如果想用SharedPreferences存取更 复杂的数据类型（类、图像等），就需要对这些数据进行编码。我们通常会将复杂类型的数据转换成Base64编码，然后将转换后的数据以字符串的形式保存在 XML文件中。&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
Android SDK中并未提供Base64编码和解码库。因此，需要使用第三方的jar包。在本例中使用了Apache Commons组件集中的Codec组件进行Base64编码和解码。读者可以从如下的地址下载Codec组件的安装包。&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;a href="http://commons.apache.org/codec/download_codec.cgi" target="_blank"&gt;http://commons.apache.org/codec/download_codec.cgi&lt;/a&gt;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Android工程目录的lib子目录中已经包含了Codec组件的jar包（commons-codec-1.4.jar），因此，读者可以在该工程中直接使用Codec组件。&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 在本例中将一个Product类的对象实例和一个图像保存在XML文件中，并在程序重新运行后从XML文件装载Product对象和图像。下面是Product类的代码： &lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"&gt;&lt;span style="color: #0000ff;"&gt;package&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;net.blogjava.mobile;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;java.io.Serializable;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;需要序列化的类必须实现Serializable接口&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Product&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;implements&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Serializable&lt;br /&gt;&#xD;
{&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;String&amp;nbsp;id;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;String&amp;nbsp;name;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;price;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;此处省略了属性的getter和setter方法&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;img src="http://www.blogjava.net/Images/dot.gif" alt="" /&gt;&amp;nbsp;&lt;img src="http://www.blogjava.net/Images/dot.gif" alt="" /&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
在存取数据之前，需要使用下面的代码创建一个SharedPreferences对象。&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
mySharedPreferences = getSharedPreferences("base64",Activity.MODE_PRIVATE);&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
其中mySharedPreferences是在类中定义的SharedPreferences类型变量。&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
在保存Product对象之前，需要创建Product对象，并将相应组件中的值赋给Product类的相应属性。将Product对象保存在XML文件中的代码如下：&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"&gt;&lt;span style="color: #000000;"&gt;Product&amp;nbsp;product&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Product();&lt;br /&gt;&#xD;
product.setId(etProductID.getText().toString());&lt;br /&gt;&#xD;
product.setName(etProductName.getText().toString());&lt;br /&gt;&#xD;
product.setPrice(Float.parseFloat(etProductPrice.getText().toString()));&lt;br /&gt;&#xD;
ByteArrayOutputStream&amp;nbsp;baos&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ByteArrayOutputStream();&lt;br /&gt;&#xD;
ObjectOutputStream&amp;nbsp;oos&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ObjectOutputStream(baos);&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;将Product对象放到OutputStream中&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;oos.writeObject(product);&lt;br /&gt;&#xD;
mySharedPreferences&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;getSharedPreferences(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;base64&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;Activity.MODE_PRIVATE);&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;将Product对象转换成byte数组，并将其进行base64编码&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;String&amp;nbsp;productBase64&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;String(Base64.encodeBase64(baos.toByteArray()));&lt;br /&gt;&#xD;
SharedPreferences.Editor&amp;nbsp;editor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;mySharedPreferences.edit();&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;将编码后的字符串写到base64.xml文件中&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;editor.putString(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;product&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;productBase64);&lt;br /&gt;&#xD;
editor.commit();&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
保存图像的方法与保存Product对象的方法类似。由于在保存之前，需要选择一个图像，并将该图像显示在ImageView组件中，因此，从ImageView组件中可以直接获得要保存的图像。将图象保存在XML文件中的代码如下：&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"&gt;&lt;span style="color: #000000;"&gt;ByteArrayOutputStream&amp;nbsp;baos&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ByteArrayOutputStream();&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;将ImageView组件中的图像压缩成JPEG格式，并将压缩结果保存在ByteArrayOutputStream对象中&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;((BitmapDrawable)&amp;nbsp;imageView.getDrawable()).getBitmap().compress(CompressFormat.JPEG,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;50&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;baos);&lt;br /&gt;&#xD;
String&amp;nbsp;imageBase64&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;String(Base64.encodeBase64(baos.toByteArray()));&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;保存由图像字节流转换成的Base64格式字符串&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;editor.putString(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;productImage&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;imageBase64);&lt;br /&gt;&#xD;
editor.commit();&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 其中compress方法的第2个参数表示压缩质量，取值范围是0至100，0表示最高压缩比，但图像效果最差，100则恰恰相反。在本例中取了一个中间值50。&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 从XML文件中装载Product对象和图像是保存的逆过程。也就是从XML文件中读取Base64格式的字符串，然后将其解码成字节数组，最后将字节数组转换成Product和Drawable对象。装载Product对象的代码如下：&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"&gt;&lt;span style="color: #000000;"&gt;String&amp;nbsp;productBase64&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;mySharedPreferences.getString(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;product&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;对Base64格式的字符串进行解码&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[]&amp;nbsp;base64Bytes&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Base64.decodeBase64(productBase64.getBytes());&lt;br /&gt;&#xD;
ByteArrayInputStream&amp;nbsp;bais&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ByteArrayInputStream(base64Bytes);&lt;br /&gt;&#xD;
ObjectInputStream&amp;nbsp;ois&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ObjectInputStream(bais);&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;从ObjectInputStream中读取Product对象&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;Product&amp;nbsp;product&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(Product)&amp;nbsp;ois.readObject();&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
装载图像的代码如下：&lt;br /&gt;&#xD;
&lt;div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"&gt;&lt;span style="color: #000000;"&gt;String&amp;nbsp;imageBase64&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;mySharedPreferences.getString(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;productImage&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&#xD;
base64Bytes&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Base64.decodeBase64(imageBase64.getBytes());&lt;br /&gt;&#xD;
bais&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ByteArrayInputStream(base64Bytes);&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;在ImageView组件上显示图像&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;imageView.setImageDrawable(Drawable.createFromStream(bais,&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;product_image&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
在上面的代码中使用了Drawable类的createFromStream方法直接从流创建了Drawable对象，并使用setImageDrawable方法将图像显示在ImageView组件上。&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
在 这里需要提一下的是图像选择。在本例中使用了res\drawable目录中的除了icon.png外的其他图像。为了能列出这些图像，本例使用了 Java的反射技术来枚举这些图像的资源ID。基本原理是枚举R.drawable类中所有的Field，并获得这些Field的值。如果采用这个方法， 再向drawable目录中添加新的图像，或删除以前的图像，并不需要修改代码，程序就可以显示最新的图像列表。枚举图像资源ID的代码如下：&lt;br /&gt;&#xD;
&lt;div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;获得R.drawable类中所有的Field&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;Field[]&amp;nbsp;fields&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;R.drawable.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;.getDeclaredFields();&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(Field&amp;nbsp;field&amp;nbsp;:&amp;nbsp;fields)&lt;br /&gt;&#xD;
{&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;icon&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;.equals(field.getName()))&lt;br /&gt;&#xD;
imageResIdList.add(field.getInt(R.drawable.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br /&gt;&#xD;
}&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 运行本例后，单击【选择产品图像】按钮，会显示一个图像选择对话框，如图1所示。选中一个图像后，关闭图像选择对话框，并单击【保存】按钮。如果保存成功，将显示如图2所示的提示对话框。当再次运行程序后，会显示上次成功保存的数据。&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;img src="http://dev.10086.cn/cmdn/bbs/attachments/editorimg/10-09-08/09-05-31_i8g8vihyoj" alt="" border="0" /&gt; &lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;img src="http://dev.10086.cn/cmdn/bbs/attachments/editorimg/10-09-08/09-05-47_gmhw8dh0g0" alt="" border="0" /&gt; &lt;br /&gt;&#xD;
查看base64.xml文件，会看到如下的内容：&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;xml&amp;nbsp;version='1.0'&amp;nbsp;encoding='utf-8'&amp;nbsp;standalone='yes'&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;map&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;string&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="productImage"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABDsyj7yK3&lt;img src="http://www.blogjava.net/Images/dot.gif" alt="" /&gt;&lt;img src="http://www.blogjava.net/Images/dot.gif" alt="" /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;string&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;string&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="product"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;rO0ABXNyABtuZXQuYmxvZ2phdmEubW9iaWxlLlByb2&lt;img src="http://www.blogjava.net/Images/dot.gif" alt="" /&gt;&lt;img src="http://www.blogjava.net/Images/dot.gif" alt="" /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;string&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;map&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; 注意：虽然可以采用编码的方式通过SharedPreferences保存任何类型的数据，但作者并不建议使用SharedPreferences保存尺寸很大的数据。如果读者要存取更&lt;img src="http://www.cnblogs.com/nokiaguy/aggbug/1821173.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nokiaguy/archive/2010/09/08/1821173.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nokiaguy/archive/2010/08/25/1807746.html</id><title type="text">中国移动开发者社区专访：学习Android的两大法宝</title><summary type="text">最近Android比较火，无论是摩托罗拉搭载 Android 2.2准备咸鱼翻身，还是Android Market年底将在台湾开市……这些消息足以让人们为之振奋。但当人们看到Android的外表光鲜之时，更要注意到其潜在内涵，尤其对于广大开发者， 一味盲目地崇拜并扎入其中并不实为理智之举。本期，我们为您邀请到一位与代码打了15年交道的李宁，以其亲身经历和开发经验来为广大开发者提出鉴言和忠告。</summary><published>2010-08-24T21:47:00Z</published><updated>2010-08-24T21:47:00Z</updated><author><name>银河使者</name><uri>http://www.cnblogs.com/nokiaguy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nokiaguy/archive/2010/08/25/1807746.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nokiaguy/archive/2010/08/25/1807746.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong style="color: red;"&gt;本文为原创，如需转载，请注明作者和出处，谢谢！&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 近日，接受了中国移动开发者社区的专访，谈了关于Android的一系列问题&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;a href="http://dev.10086.cn/upload/developers_mag/vol8/index.htm?from=home"&gt;&lt;img alt="" src="http://www.blogjava.net/images/blogjava_net/nokiaguy/zf.jpg" width="307" height="155" /&gt;&lt;/a&gt;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;a href="http://dev.10086.cn/upload/developers_mag/vol8/index.htm?from=home"&gt;http://dev.10086.cn/upload/developers_mag/vol8/index.htm?from=home&lt;/a&gt;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;div id="infotext"&gt;&#xD;
&lt;p align="center"&gt;&lt;img alt="" src="http://dev.10086.cn/cmdn/supesite/attachments/information_attachments/20100816090804_29584.jpg" border="0" width="399" /&gt; &lt;/p&gt;&#xD;
&lt;p align="center"&gt;李宁近照&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: kaiti_gb2312;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [背景资料]最近Android比较火，无论是摩托罗拉搭载 Android 2.2准备咸鱼翻身，还是Android Market年底将在台湾开市&amp;#8230;&amp;#8230;这些消息足以让人们为之振奋。但当人们看到Android的外表光鲜之时，更要注意到其潜在内涵，尤其对于广大开发者， 一味盲目地崇拜并扎入其中并不实为理智之举。本期，我们为您邀请到一位与代码打了15年交道的李宁，以其亲身经历和开发经验来为广大开发者提出鉴言和忠告。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;15年演绎代码与操作系统之恋&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;李宁1999年毕业于东北大学计算机专业，毕业后曾任东软股份项目经理，2003年考入东北大学计算机专业读研，2006年3月硕士毕业。从 1995年至今15年时间里，李宁几乎一直与各种计算机语言和操作系统打交道。从最早接触的DOS 3.3到后来的Windows 3.2、Windows 95、98、NT、2000乃至现在的Windows 7和Windows 2008，他对于计算机的学习历程也正是经历了微软PC的鼎盛发展期和互联网的20年。&lt;/p&gt;&#xD;
&lt;p&gt;李宁认为这一切都得益于其母亲单位里有台计算机，在上世纪90年代，在那个计算机并不普及的年代，使得他从小就有机会接触到计算机并对其情有独钟，在1995年报考大学填报志愿时选择了&amp;#8220;计算机专业&amp;#8221;，而在1996年他也拥有了自己的第一台计算机。&lt;/p&gt;&#xD;
&lt;p&gt;对于开发语言，相信很多人已不再使用DOS了，而现在的孩子们也不能理解，在当时一张5寸容量仅为1.2M的软盘曾经让多少人为之痴迷。然而李宁是 从DOS下的Pascal开始学习编程语言，而后是C语言。最开始接触的数据库开发工具是DOS下的FoxPro 2.5，后来是Windows下的FoxPro3.0、FoxPro5.0.VB（Visual Basic）作为微软第一款具有图形界面的开发工具一经推出就曾引起不小的轰动，也为广大开发者所使用。在快毕业时，李宁开始使用SQL Server 7.0，到后来的SQL Server 2008，作为上手比较容易的一种数据库，也是李宁使用时间最长的，差不多已有10年时间。&lt;/p&gt;&#xD;
&lt;p&gt;接触Linux则纯属偶然。大概是在三、四年前，李宁的Windows操作系统的电脑突然崩溃，很多软件突然无法打开（有可能是中招了），而要重新 修复系统至少需要花费一个星期时间（因为系统里安装的软件实在是太多了，有的已很难找到安装程序），不得已他安装了Fedora Linux操作系统，并在Linux下继续他的开发工作。而通过深入了解他发现，Linux在娱乐方面并不比Windows差，而单纯对于技术人员来 讲，Linux也比Windows更便于编程。一台电脑安装Windows 2008需占有2~3G的空间，而完全安装Linux将占用8~9G空间，而且Linux所带的工具大多都直接或间接地与开发有关，在完全安装后基本就不 需要再安装开发工具，所以更加适合开发人员使用。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;热恋还在Android：写心得、出书投入十二分精神&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;提到移动应用开发，早在2003年李宁就尝试过使用Symbian系统开发软件，但当他开发完成准备安装在手机上才发现，塞班系统安装程序是需要购 买签名，一年需要几百至上千美元费用，这对于仅作娱乐考虑的李宁来说，不太现实，移动开发也就此搁置。到了2007年Google发布Android，这 在当时也没能引起他太多注意，直到2008年底，世界上第一部支持Android的手机G1推出，这才让李宁感觉到Android的猛烈攻势，于是，他开 始尝试Android软件开发，虽然程序也需要签名，但比较自由，在配置文件上配置即可，不需要购买。&lt;/p&gt;&#xD;
&lt;p&gt;关于智能手机操作系统，李宁认为目前是第二代智能操作系统时代，以塞班为首的第一代智能手机操作系统，面临着屏幕小影响软件表现、系统本身过于臃肿 （Symbian的源代码超过2000万行，相当于Windows XP的源代码量）、用户体验不足等诸多弊端，现在新出的手机屏幕分辨率多在320*480之上，Android、iPhone和Windows Phone 7都支持大分辨率，还支持传感器，如重力、光学传感等。同时传统的塞班代码积累太多，2000多万的代码量在修改和加入新功能上比较困难，不太适合开发者 操作，而且在操作方式上并没有带来更好的用户体验。如果塞班不行，要有一个操作系统来取代的话，目前Android具有绝对优势。虽然Android存在 版本太多的问题，但Google承诺，Android 3.0之后的版本将一年升级一次，虽然这样做放缓了Android的升级速度，但却给手机硬件厂商以及开发者留有足够的时间来适应新的系统，从而也在很大 程度上解决了Android版本众多的问题。据Google宣称，将禁止第三方对Android 3.0及以上版进行扩展（如HTC Sense就是一种Android扩展），这样可以使Android更加统一，从而可大大提升用户体验。&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;a href="http://www.china-pub.com/196865"&gt;&lt;img alt="" src="http://dev.10086.cn/cmdn/supesite/attachments/information_attachments/20100816090827_23846.jpg" border="0" width="301" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p align="center"&gt;《Android/OPhone开发完全讲义》&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;a href="http://www.china-pub.com/196905"&gt;&lt;img alt="" src="http://dev.10086.cn/cmdn/supesite/attachments/information_attachments/20100816090835_58745.jpg" border="0" width="301" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p align="center"&gt;《人人都玩开心网：Ext JS + Android + SSH整合开发Web与移动SNS》&lt;/p&gt;&#xD;
&lt;p&gt;李宁看到，由于Android的支持厂商众多，从低端到高端机型都有，因此，他决定从Android入手，挖掘在移动领域属于他的第一批宝藏。由于 从事Android的时间比较早，也算是国内第一批Android开发人员，经历了Android的几乎所有的版本的变迁，亲身体会了Android由弱 变强的过程。为了纪念首次进入移动领域以及Android，在2009年下半年开始，李宁用了四个月多的时间将他的经验写成了一本书 《Android/OPhone开发完全讲义》，该书在上市近一个月以来，销售排名一直在计算机类前10的位置，取得了不错的成绩。李宁还告诉我们，这本 书的版权目前已卖给台湾的一家出版社，估计二个月后将会在台湾市场销售。李宁还写了一本与Android相关的书籍：《人人都玩开心网：Ext JS + Android + SSH整合开发Web与移动SNS》。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;结晶之作：&amp;#8220;乐博Android客户端&amp;#8221;开发、升级&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;img alt="" src="http://dev.10086.cn/cmdn/supesite/attachments/information_attachments/20100816090856_67511.png" border="0" width="320" /&gt; &lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;img alt="" src="http://dev.10086.cn/cmdn/supesite/attachments/information_attachments/20100816090803_41583.png" border="0" width="320" /&gt; &lt;/p&gt;&#xD;
&lt;p align="center"&gt;&amp;#8220;乐博Android客户端0.9&amp;#8221;软件界面&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;img alt="" src="http://dev.10086.cn/cmdn/supesite/attachments/information_attachments/20100816090816_95798.png" border="0" width="320" /&gt; &lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;img alt="" src="http://dev.10086.cn/cmdn/supesite/attachments/information_attachments/20100816090822_14760.jpg" border="0" width="320" /&gt; &lt;/p&gt;&#xD;
&lt;p align="center"&gt;&amp;#8220;乐博Android客户端0.9&amp;#8221;软件界面&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;img alt="" src="http://dev.10086.cn/cmdn/supesite/attachments/information_attachments/20100816090831_96473.jpg" border="0" width="320" /&gt; &lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;img alt="" src="http://dev.10086.cn/cmdn/supesite/attachments/information_attachments/20100816090843_29315.jpg" border="0" width="320" /&gt; &lt;/p&gt;&#xD;
&lt;p align="center"&gt;&amp;#8220;乐博Android客户端1.0&amp;#8221;软件开发中&lt;/p&gt;&#xD;
&lt;p&gt;在学习Android的过程中，写书可能只是一部分，李宁还开发了一系列软件，包括多功能日历、乐博Android客户端（用户在Android手 机上管理微博）等。&amp;#8220;乐博Android客户端&amp;#8221;这款软件的开发，源于国内外有很多微博网站，而很多人在不同的微博都有帐号，这会在同步管理上带来麻烦。 因此，乐博Android客户端就是帮助用户维护这些微博，并能实现同步发送。&lt;/p&gt;&#xD;
&lt;p&gt;2010年初李宁完成了第一个版本0.9版的开发，目前1.0版正在开发中，1.0版将基于Android 2.1开发，并完善多种功能。比如将支持超过10种微博（包括新浪、搜狐、Follow5、Twitter等），除了具有微博客户端的基本功能（发布、浏 览、评论、转发微博）外，还支持同步多种微博、自动翻译（将微博内容翻译成其他语言）、图像编辑（支持多种图像效果）、辅助输入（输入表情字符、节日祝贺 等）、快速发布（通过手机桌面上的功能图标可以迅速调用输入微博的界面）等功能。在未来的版本中还支持将指定的微博生成电子书、更高级的辅助输入功能。&lt;/p&gt;&#xD;
&lt;p&gt;对于这款软件，还要提及的是其图片处理功能，因为一条微博只允许发布一张图片，而李宁通过对拍照效果进行处理，对照片的后期处理，通过软件将多张照片通过 横竖合并在一张图上等特殊效果处理，从而实现一条微博可以发布多张图片的效果。相信这个功能会让很多围脖为此欢呼。&lt;/p&gt;&#xD;
&lt;p&gt;软件开发完成，李宁打算将其发布在中国移动Mobile Market应用商场，之前也发布过但因移动MM不支持联网应用而被驳回，所以希望到时可以通过审核并顺利上架。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;爱要理智：爱Android更要懂Android&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们关注李宁对Android投入的爱是否有所回报，他告诉我们并未直接带来收益，不过已经从著作及参赛奖项中获得一定回报。对于移动MM，他认为 MM是目前国内最大的手机软件商店，但收费软件和免费软件的下载量差距很大，这可能是因为国人都不习惯花钱买软件所造成的，希望MM可以为开发人员提供更 多的赢利机会。通过某些服务而不是卖软件来赢利，例如，开放通信接口、植入性广告、专业广告等。对于软件，产品销售是一方面，后期服务也很关键。以移动的 角度看，可以进行培训，培养更多的Android人才，毕竟现在靠软件卖钱的时代已经快过去了（直接向用户收费也不符合互联网的精神），免费才是王道。而 通过开发免费软件赚钱的人也不在少数，比如Foxmail作者张小龙，当Foxmail用户达到几千万时，软件也自然拥有巨大的市场价值，最终以2000 万卖出；再比如来电通的作者苏志宏也是一个例子。&lt;/p&gt;&#xD;
&lt;p&gt;在这个全球热恋Android的时代，李宁不只爱着Android，更懂得Android，这对于很多痴迷着Android的开发者来说，尤为重 要。李宁认为，学好Android有两大法宝：Android源代码（包括Java和C/C++的源代码）和Linux.他把新入门的新手分为二种类型， 一种是技术新手，一种是Android新手。&lt;/p&gt;&#xD;
&lt;p&gt;对于技术新手，李宁奉劝他们应该先从Java学起，至少需要几个月甚至半年的熟悉这种语言，这是不可缺少的基本功练习。对于现在有的人急于求成，自认为Java不熟练但Android却很精通，李宁用&amp;#8220;拿着驾照但却不会开车的马路杀手&amp;#8221;来形容这部分人。&lt;/p&gt;&#xD;
&lt;p&gt;当技术新手对Java有了一定掌握，并独自编写大量的代码，对于一般的技术领域能驾轻就熟时，就可以开始Android的学习了，这时候的技术新手 才能晋升为Android新手。而对于Android新手，一般一、二天就能够学会使用Android编写程序，但要深入研究就需要些功夫。因为 Android是开源的，所以首先要研究Android的源代码，虽然关于Android的书在国内已经有几十本了，但书籍只能引导入门却不能将你带到一 定高度，如果要深入研究就必须研究源代码，通过源代码才能真正了解Android的内部构造。&lt;/p&gt;&#xD;
&lt;p&gt;李宁认为：&amp;#8220;开发是一件很痛苦的事，但也是一件很快乐的事。就像一杯咖啡，虽然喝着感觉很苦，但随后而来的却是咖啡的香甜。&amp;#8221;当然，这里所说的痛苦 并非开发本身，而是在开发过程中遇到无法解决的问题时，如果时间要求再紧，会更加郁闷。李宁记得2年前刚接触Android时，虽然凭着多年的开发经验， 应付一般的技术不成问题，但仍然还有很多Android技术问题无法得到解决。那时国内、外关于Android的技术论坛并不多，而且资源匮乏，除了 Android的官方文档外，最大的资源就是Android的源代码，而任何与Android相关的文档（也包括官方文档）永远只能是入门或API列表， 永远不能触及实质的东西。因此，获得我所需要的东西的唯一途径就是直接查阅Android的源代码（幸好源代码很容易从网上获得）。所以，要学好 Android最好的方法，也是最快的捷径，就是尽可能理解Android的源代码。同时，鉴于Android是基于Linux内核的，所以学习 Linux的相应API以及各种操作也是十分必要的。这就好比如果想要学习Windows Mobile就多研究下Windows的道理是一样的。&lt;/p&gt;&#xD;
&lt;p&gt;当以上几点都能够达到基本上就是高手了。当我们问及李宁目前是处于哪个阶段时，他很谦虚地告诉我们，正处在源代码阶段，他收集了1.7G的源代码，正在仔细研究中。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;附：李宁简介&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;李宁，东北大学计算机专业硕士、CSDN博客专家、51CTO客座专家、中国移动开发者社区技术管理员、OPhone专家、ophonesdn版主 （Id：mobileguy）、eoeandroid版主（id：androidguy）。曾任东软股份项目经理，领导并参与开发十几个大中型项目。从 2005年进入写作领域以来，为程序员、电脑编程技巧与维护、电脑报、IT168、天极网等平面媒体和网络媒体撰写了一百多篇原创技术和评论文章。并在个 人blog（&lt;a href="http://nokiaguy.blogjava.net/"&gt;http://nokiaguy.blogjava.net&lt;/a&gt;）上发表了大量的原创技术文章。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;主要奖项：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1、2009年ophone原创技术征文大赛二等奖（奖品：dell mini 3i手机一部）&lt;/p&gt;&#xD;
&lt;p&gt;2、2010年获得ophonesdn季度优秀版主（奖品：LG GW800手机一部）&lt;/p&gt;&#xD;
&lt;p&gt;3、《OPhone2.0之初体验》博客征文最佳人气博文二等奖&lt;/p&gt;&#xD;
&lt;p&gt;4、CSDN应用达人（奖品：微软无线鼠标）&lt;/p&gt;&#xD;
&lt;p&gt;5、2007年获得《电脑编程技巧与维护》优秀作者（奖品：U盘）&lt;/p&gt;&#xD;
&lt;p&gt;6、首届.Net平台创新编程征文比赛三等奖（2008年）（奖品：MP5）&lt;/p&gt;&#xD;
&lt;p&gt;7、第二届微软.net平台应用程序开发征文大赛三等奖（2009年）（奖品：MP5）&lt;/p&gt;&#xD;
&lt;p&gt;8、MSN机器人大赛最佳人气奖（奖品：价值1000元的无线鼠标和键盘）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;主要著作：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1、&lt;a href='http://www.china-pub.com/196865'&gt;《Android/OPhone开发完全讲义》&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2、&lt;a href='http://www.china-pub.com/196905'&gt;《人人都玩开心网：ext js+android+ssh整合开发web与移动SNS》&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3、&lt;a href='http://www.china-pub.com/48015'&gt;《Java Web开发速学宝典》&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;img src="http://www.cnblogs.com/nokiaguy/aggbug/1807746.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nokiaguy/archive/2010/08/25/1807746.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
