<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>阿飞是个流氓</title>
    <description>阿飞</description>
    <link>http://afeitech.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>OA,ERP,CRM</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/190607" style="color:red;">http://afeitech.javaeye.com/blog/190607</a>&nbsp;
          发表时间: 2008年05月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://baike.baidu.com/view/9490.html?wtp=tt">OA </a></p>
<p><a href="http://baike.baidu.com/view/3609.html?wtp=tt">ERP</a> </p>
<p><a href="http://baike.baidu.com/view/4799.html?wtp=tt">CRM</a></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/190607#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 May 2008 15:01:18 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/190607</link>
        <guid>http://afeitech.javaeye.com/blog/190607</guid>
      </item>
      <item>
        <title>Seam精品文章一锅端</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/178590" style="color:red;">http://afeitech.javaeye.com/blog/178590</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: red"><div style="text-align: center">Seam精品文章一锅端</div></span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/178590#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Apr 2008 22:36:56 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/178590</link>
        <guid>http://afeitech.javaeye.com/blog/178590</guid>
      </item>
      <item>
        <title>Android文档阅读06—入门指引之笔记本1</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/176096" style="color:red;">http://afeitech.javaeye.com/blog/176096</a>&nbsp;
          发表时间: 2008年03月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span class="mw-headline">&nbsp;&nbsp;<span class="mw-headline"><span style="color: #ff0000">许可协议:<a href="http://creativecommons.org/licenses/by/2.5/cn/legalcode"><span style="color: #e9650e">creativecommons licenses</span></a><a href="http://creativecommons.org/licenses/by/2.5/cn/legalcode"></a></span></span></span></p><p>&nbsp;</p><p><span class="mw-headline">记事本练习 1</span> </p><p>&nbsp;</p><p>在这个练习中，你将要创建一个简单的记事本列表，用户可以添加新的记事但是不能编辑他们。这个练习示范了如下内容： </p><p>&nbsp;</p><p>列表活动创建并操作菜单项的基本知识。怎样在SQLite数据库中存取记事。怎样将数据绑定到一个使用了数组适配器的列表视图（最简单的一种绑定到列表视图的方式）。关于屏幕布局，包括怎样布局一个列表视图，怎样将一个项目加入活动的菜单，活动是怎样操作那些菜单选择，这些内容的基础知识。 [Exercise 1] [Exercise 2] [Exercise 3] [Extra Credit] </p><h2><span class="mw-headline">Step 1</span></h2><p>第一步 在Eclipse中打开Notepadv1项目。 </p><p>&nbsp;</p><p>Notepadv1项目是一个起点，它关注一些样板性的工作，如果你完成了Hello Android教程，那么你就曾经见过它们。 </p><p>&nbsp;</p><p>右击包资源管理器，选择把.../General/Existing Projects导入到工作区。按浏览键，转到你拷贝的那三个练习所在的文件夹，选择Notepadv1然后点OK。你应该看到Notepadv1列在项目表中,并且有个检查标记在它旁边，点完成。练习项目应该已经打开。如果AndroidManisfest.xml 或者Android zip 文件有什么错误，右击项目然后选择Android Tools-&gt;Fix Project Properties（项目在错误的路径里查找库文件，上面的操作会替你修复它）。 </p><h2><span class="mw-headline">Step 2</span></h2><div style="font-size: 12px; float: right; margin: 5px; width: 250px; font-style: italic"><p>&nbsp;</p><div style="font-style: normal"><strong>访问和修改数据</strong> <p>在这个练习中，我们仅打算直接用SQLite 数据库来存储我们的数据，但是在一个实际的应用程序中，也许写一个合适的内容提供器（Content Provider）来封装这个行为会更好。 </p><p>如果你感兴趣，你可以找到更多关于内容提供器或者介绍存储，查找，显示数据的整个主题。 </p></div></div><p>&nbsp;</p><p>看一下DBHelper类-它用来封装对SQLite数据库的数据访问，这个数据库将保存我们的记事本数据并且允许我们更新它。 </p><p>通常你将利用一个内容提供器来实现，事实上在SDK中包含的那个完整的记事本程序确实实现了这样一个 ContentProvider。不管怎样，没理由不让你直接用自己的SQLite数据，像我们在这里做的一样。最主要的事是注意这个类是怎样为我们存储，查找，更新SQLite数据库中的数据。对于查找行，基于行id查找，创建新行，删除已存在的行和更新一行，这里有一些方法。如果你想迅速了解如何在你的程序中使用SQLite数据库的基础知识，或者看一下这个例子中的类，或者更好的，看一下完整的记事本应用程序。它在SDK的samples/目录中，作为一个使用ContentProvider的例子。 </p><h2><span class="mw-headline">Step 3</span></h2><div style="font-size: 12px; float: right; margin: 5px; width: 250px; font-style: italic"><p>&nbsp;</p><div style="font-style: normal"><p><strong>布局和活动</strong> </p><p>大多数活动会有一个相联系的布局。布局是活动对用户的直观表现。在这个例子中，我们的布局将占据整个屏幕并提供一个记事列表。 </p><p>全屏的布局并不是活动的唯一选择。你也许想知道如何用浮动布局（例如，对话框或者警告），或者也许你完全不需要一个布局（这类活动对用户将是不可见的，除非你为它指定了某种布局） </p></div></div><p>&nbsp;</p><p>打开res/layout中的notepad_list.xml文件，看一下： </p><p>这是一个布局定义文件，其中包含了默认的起始项。我们提供这些，是为了便于你迅速开始 </p><dl><dd>a.所有的Android布局文件必须以XML头为开始：&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; </dd><dd>b.同样，下一条定义通常（但不完全）是一个某种类的布局定义，在这个例子中是LinearLayout. </dd><dd>c.Android的XML名字空间应该总是定义在xml文件中组件或布局的最上级，这样标签&quot;android:&quot;才能用在文件的其余部分: </dd></dl><p>xmlns:android=&quot;<a href="http://schemas.android.com/apk/res/android" class="external free" title="http://schemas.android.com/apk/res/android" rel="nofollow">http://schemas.android.com/apk/res/android</a>&quot; </p><h2>&nbsp;<span class="mw-headline">Step 4</span></h2><p>我们需要创建一个布局来容纳我们的列表。在LinearLayout标签中添加代码，使得这个文件看起来像下面的样子：（你得敲Source tab按钮来编辑XML文件） </p><pre name="code" class="xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    android:layout_width=&quot;wrap_content&quot;
    android:layout_height=&quot;wrap_content&quot;&gt;

  &lt;ListView id=&quot;@id/android:list&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;/&gt;
  &lt;TextView id=&quot;@id/android:empty&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:text=&quot;@string/no_notes&quot;/&gt;

&lt;/LinearLayout&gt;
</pre><p>&nbsp;</p><p>&nbsp;</p><hr /><ul><li>ListView 和TextView可以看做是两个替代的视图，同一时间只有一个可以被显示。ListView可以用在有记事要显示的时候，而TextView（有一个&ldquo;No Notes Yet！&rdquo;的字符串资源作为默认值会在没有任何记事的时候显示）。 </li><li>ListView和TextView的id字串中有一个&ldquo;@&rdquo;符号，它的意思是XML解释器应当解析并且展开id字串的剩余部分并且利用ID资源。 </li><li>android:list和android:empty是Android平台已经提供给我们的ID，android:empty在list adapter中没有数据时自动提供。List Adapter默认的搜索这些名字。作为替代，你也可以用setEmptyView();更广泛的，Android.R类是平台提供的预定义资源的集合，你项目中的R类是在你项目中预定义的资源集合。在资源类android.R中出现的资源可以通过android:名字空间前缀在XML文件中使用。 </li></ul><h2><span class="mw-headline">Step 5</span></h2><div style="font-size: 12px; float: right; margin: 5px; width: 250px; font-style: italic"><p>&nbsp;</p><div style="font-style: normal"><strong>资源和R类</strong> <p>在Eclipse项目res/下的文件夹很特殊。在这个文件夹下的子文件夹和文件有特定的结构。 </p>尤其，定义在这些文件夹和文件里的资源会在R类中有相应的入口。这样你的程序就可以轻松的访问到这些资源。更进一步的，它们会被绑定，作为程序的一部分。</div></div><p>&nbsp;</p><p>要产生一个列表视图，我们需要定义表中各行的显示： </p><ul><li>在res/layout下创建一个名为notes_row.xml的文件 </li><li>添加如下的内容（注：xml头又一次被用到了，并且第一个节点定义了Android xml名字空间） </li></ul><pre name="code" class="xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;TextView id=&quot;@+id/text1&quot;
    xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    android:layout_width=&quot;wrap_content&quot;
    android:layout_height=&quot;wrap_content&quot;/&gt;</pre><p>&nbsp;</p><ul><li>每一行的标题将用到这个视图-它仅有一个文字区域。 </li><li>在这个例子中，我们创建了一个叫text1的新id。在id字串中+号跟在@号之后，显示了这个id如果不存在，则应当自动创建。因此我们定义了一个悬空的text1，然后使用它。 </li><li>保存文件后，打开项目中的R.java类，你应该看到notes_row和text1的新定义（我们的新定义），这意味着，我们可以从我们的代码中获得访问。 </li></ul><h2><span class="mw-headline">Step 6</span></h2><hr /><p>然后，打开源码中的Notepadv1类。我们将要替换这个类，成为列表适配器来显示我们的记事，同时允许我们添加新的记事。 </p><p>Notepadv1将成为Activity的一个子类，称为ListActivity，它拥有一些适合做与列表相关的额外功能，例如：在屏幕上按行显示列表项的数字，在列表项中移动，允许他们被选择。 </p><p>看一下Notepadv1类中的现有代码。在最上面有一些常量定义，接着的私有区域里我们将创建数字形式的记事标题，并且还有一些从超类重载的方法。 </p><h2>&nbsp;<span class="mw-headline">Step 7</span></h2><hr /><p>将Notepadv1的父类从Activity改为ListActivity： </p><pre>public class Notepadv1 extends ListActivity
</pre><p>注：你必须用Eclipse把ListActivity导入到Notepadv1类中，在Windows或Linux按crtl-shift-O，或者在Mac下按cmd-shift-O。 </p><h2><span class="mw-headline">Step 8</span> <hr /></h2><p>这里定义了三个重载方法：onCreate,onCreateOptionsMenu和onOptionsItemSelected,我们把需要的内容详细说明一下： </p><ul><li>onCreate()在活动开始的时候被调用-它有一点像activity的&quot;main&quot;方法。我们用这个函数在活动运行的时候为它设置资源和状态。 </li><li>onCreateOptionsMenu()用来为活动产生一个菜单。当使用者点击menu按钮的时候，它会显示，并且有一列可以选择的选项（像&ldquo;Create Note&rdquo;） </li><li>onOptionsItemSelected()是菜单等式中（菜单处理过程）的另一半，它用来处理由菜单产生的事件（例如.当用户选择了&ldquo;Create Note&rdquo;选项） </li></ul><h2><span class="mw-headline">Step 9</span></h2><p>详细说明onCreate（）方法的主体。 </p><p>在这儿，我们将要为活动设定一个名称（显示在屏幕的最上面），利用我们先前为活动创建的notepad_list布局来显示内容，建立DBHelper实例来访问记事数据，然后产生带有有效记事标题的列表： </p><ol><li>在我们的方法中，调用带有icicle参数的super（）函数 </li><li>setContentView到R.layout.notepad_list </li><li>在类中新建一个叫dbHelper的私有域，它是DBHelper的实例（在OnCreate 方法之前） </li><li>回到onCreate方法，新建一个DBHelper实例-assign到dbHelper区域（注，你必须为DBHelper的构造函数传递一个this参数） </li><li>最后，调用一个新方法-fillData()-利用helper获取并产生数据，我们现在还没有定义这个函数。 </li><li>onCreate()函数应该像这样： </li></ol><pre name="code" class="java">@Override
   public void onCreate(Bundle icicle)
   {
       super.onCreate(icicle);
       setContentView(R.layout.notepad_list);
       dbHelper = new DBHelper(this);
       fillData();
   }</pre><p>&nbsp;</p><p>记住添加DBHelper的定义（在noteNumber定义的下面）： </p><pre> private DBHelper dbHelper;
</pre><h2><span class="mw-headline">Step 10</span></h2><div style="float: right; margin: 5px; width: 250px; font-style: italic"><p>&nbsp;</p><div style="font-style: normal"><strong>菜单的更多解释</strong> <p>我们构建的记事本程序仅仅涉及了菜单的表面。 </p>你可以为菜单项添加快捷键，创造子菜单甚至将菜单添加到别的应用程序中</div></div><p>onCreateOptionMenu()方法的主体 </p><p>我们现在要添加一个菜单项，&ldquo;Add Item&rdquo;，它会用到我们在strings.xml中创建的字符串，并且用到一个常量定义，这个常量我们在类的顶部创建来标志Add项的操作。 </p><ol><li>在strings.xml资源中（在res/values下），为menu_insert添加一个新的字符创&ldquo;Add Item&rdquo;&lt;string name=&quot;menu_insert&quot;&gt;Add Item&lt;/string&gt;，然后保存文件 </li><li>同时，你需要在Notepadv1类的顶部定义一个菜单位置常量（在KEY_BODY的定义下面）public static final int INSERT_ID=Menu.FIRST; </li><li>在onCreateOptionsMenu()方法中，添加一个菜单项。同时注意super调用的返回值结果。整个方法应该看起来像下面的样子： </li></ol><pre name="code" class="java">@Override
   public boolean onCreateOptionsMenu(Menu menu) {
       boolean result = super.onCreateOptionsMenu(menu);
       menu.add(0, INSERT_ID, R.string.menu_insert);
       return result;
   }</pre><p>&nbsp;</p><h2><span class="mw-headline">Step 11</span></h2><p>onOptionsItemSelected()方法： </p><p>这个方法将要处理我们新的&ldquo;添加记事&rdquo;菜单项。当选中这个菜单项时，onOptionsItemSelected()方 </p><p>法就将被调用，同时item.getId()的值会被设为INSERT_ID（我们用这个常量来标志菜单项）。我们能 </p><p>检查这个，然后选择适当的动作： </p><ol><li>super.onOptionsItemSelected(item)方法出现在这个方法的最后-我们想要先抓取我们的事件！ </li><li>在item.getId()上的选择语句。 </li><li>INSERT_ID项。 </li><li>调用新方法createNote() </li><li>在case的结尾用break </li><li>在结束的时候返回超类onOptionsItemSelected()方法的返回值 </li><li>整个onOptionsItemSelect()方法看起来应该如下： </li></ol><pre name="code" class="java">@Override
   public boolean onOptionsItemSelected(Item item) {
       switch (item.getId()) {
       case INSERT_ID:
           createNote();
           break;
       }
      
       return super.onOptionsItemSelected(item);
   }</pre><p>&nbsp;</p><h2>&nbsp;<span class="mw-headline">Step 12</span></h2><p>添加一个createNote()方法：在我们应用程序的这个第一版里，createNote()不会很有用。我们只是简单的创建一个带有标题的记事， </p><p>这个标题被赋值为（&ldquo;Note1&rdquo;，&ldquo;Note2&rdquo;。。。）这类基于计数的东东，但是记事的内容为空。现在我 </p><p>们还不能修改记事的内容，所以我们现在只能满足于一些默认值： </p><ol><li>String noteName=&quot;Note&quot;+noteNumber++;(用&ldquo;Note&rdquo;来构造名字并且用到我们已经在类中定义过的计数器) </li><li>调用dbHelper.createRow(),使用noteName作为标题，&ldquo;&rdquo;为内容 </li><li>在添加之后再调用一次fillData()方法（一个低效但是简单的方法） </li><li>整个createNote()方法看起来应该像这样： </li></ol><pre name="code" class="java">private void createNote() {
       String noteName = &quot;Note &quot; + noteNumber++;
       dbHelper.createRow(noteName, &quot;&quot;);
       fillData();
   }</pre><h2>&nbsp;<span class="mw-headline">Step 13</span></h2><div style="font-size: 12px; float: right; margin: 5px; width: 250px; font-style: italic"><p>&nbsp;</p><div style="font-style: normal"><p>列表适配器 </p><p>我们的例子使用了一个非常简单的数组适配器，它将一个项目的数组或列表添加至列表视图。在Android中更常见的是，列表适配器和ContenProviders一起运行，并且这也是列表的一种非常简单的用法。 </p><p>将ContentProvider捆绑至ListView，你可以用android.widget.SimpleCursorAdapter。 </p></div></div><p>&nbsp;</p><p>定义fillData()方法。这个方法很长： </p><p>这个方法使用了ArrayAdapter，它是将数据放入ListView的最简单方法。ArrayAdapter读取一个列表或者字串数组，并且将他们绑定到一个文本视图，在布局中提供了这个为列表行定义的文本视图（在我们的notes_row.xml布局文件中的text1域）。这个方法简单的从database helper中获取一列记事，利用从每行得到的标题字串构造了一个字符串列表，然后通过这些items创建一个ArrayAdapter，并使用我们定义过的notes_row </p><ol><li>数组适配器需要一个字符串列表(List&lt;String&gt;)来包含要显示的。 </li><li>数据从数据库中按行读出，每行的标题域用来产生字符串列表。 </li><li>我们指定notes_row视图，作为数据容器。 </li><li>如果有关于未找到类的错误，ctrl-shift-O(在mac上用cmd-shift-O)来组织导入。 </li></ol><p>注：在这个练习中我们使用了ArrayAdapter，这并不是好的解决方案，更典型的，一个SimpleCursorAdapter应该和ContenProvider一起用或者至少是一个从查询返回的Cursor。看侧边的列表适配器获得更多信息。 </p><a name="Step_14" title="Step_14"></a><h2><span class="mw-headline">Step 14</span></h2><p>运行！ </p><ol><li>右击Notepadv1项目 </li><li>在弹出菜单中，选择Run As-&gt;Android Application </li><li>如果你看见出现一个对话框，选择Android Launcher的方式去运行程序（你同样可以用对话框顶部的链接，把这个设置为你工作空间的默认属性，推荐这样做，它可以避免插件每次都询问你同样的问题） </li><li>单击菜单按钮，选择Add Item 来添加记事 </li></ol><a name="Solution_and_Next_Steps" title="Solution_and_Next_Steps"></a><h2>&nbsp;<span class="mw-headline">Solution and Next Steps</span></h2><p><br />方案和下一步 </p><p>你可以在zip文件Notepadv1Solution中找到这个类的解决方案，对照一下你自己的。一旦你准备好，继续入门指引练习2为程序添加新建，编辑删除记事的能力。返回入门指引首页。 </p><!-- Saved in parser cache with key wikidb:pcache:idhash:57-0!1!0!!zh-cn!2 and timestamp 20080325173856 --><!-- end content -->
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/176096#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 26 Mar 2008 06:42:39 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/176096</link>
        <guid>http://afeitech.javaeye.com/blog/176096</guid>
      </item>
      <item>
        <title>Spring精品文章一锅端</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/176094" style="color:red;">http://afeitech.javaeye.com/blog/176094</a>&nbsp;
          发表时间: 2008年03月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p align="center"><span style="color: #ff0000">Spring精品文章一锅端</span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/176094#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 26 Mar 2008 06:27:02 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/176094</link>
        <guid>http://afeitech.javaeye.com/blog/176094</guid>
      </item>
      <item>
        <title>Hibernate精品文章一锅端</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/176093" style="color:red;">http://afeitech.javaeye.com/blog/176093</a>&nbsp;
          发表时间: 2008年03月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div style="text-align: center"><span style="color: #ff0000">Hibernate精品文章一锅端</span></div><p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/176093#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 26 Mar 2008 06:26:19 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/176093</link>
        <guid>http://afeitech.javaeye.com/blog/176093</guid>
      </item>
      <item>
        <title>Struts精品文章一锅端</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/176092" style="color:red;">http://afeitech.javaeye.com/blog/176092</a>&nbsp;
          发表时间: 2008年03月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p align="center"><span style="color: #ff0000">Struts精品文章一锅端</span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/176092#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 26 Mar 2008 06:25:05 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/176092</link>
        <guid>http://afeitech.javaeye.com/blog/176092</guid>
      </item>
      <item>
        <title>使用Listener实现SessionFactory和DaoFactory的初始化</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/175842" style="color:red;">http://afeitech.javaeye.com/blog/175842</a>&nbsp;
          发表时间: 2008年03月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>前面已经介绍了</p><p><a href="../../blog/175836"><span style="color: #108ac6">采用单态模式保证Hibernate的SessionFactory的单态</span></a></p><p>和</p><p><a href="../../blog/175823"><span style="color: #108ac6">用DAO工厂创建并管理dao实例</span></a></p><p>&nbsp;</p><p>那么现在，我们用Listener实现在系统启动时，即完成SessionFactory实例的初始化，以及DaoFactory的初始化。</p><pre name="code" class="java">public class FactoryLoaderListener implements ServletContextListener {

	DaoFactory df=null;
	SessionFactory sf=null;
	
	//在系统启动时候加载
	public void contextInitialized(ServletContextEvent sce) {
		
		try{//初始化Hibernate的SessionFactory
			sf=SessionFactoryBuilder.instance().getSessionFactory();
			System.out.println(&quot;Hibernate的SessionFactory已经初始化...&quot;+sf);
		}catch(Exception e){
			System.out.println(&quot;Hibernate的SessionFactory初始化失败...&quot;+e);
		}
		
		try{//获取系统的DAO配置文件路径
			String path=sce.getServletContext().getRealPath(&quot;/WEB-INF/&quot;);
			df=DaoFactory.instance(path);//创建DAO工厂的实例
			System.out.println(&quot;DAO工厂已经被初始化...&quot;+df);
		}catch(Exception e){
			System.out.println(&quot;DAO工厂初始化失败，出现异常...&quot;+e);
		}

	}
	public void contextDestroyed(ServletContextEvent arg0) {
		 sf=null;
		 df=null;
	}
}
</pre><p>需要在web.xml增加配置</p><pre name="code" class="xml">	&lt;listener&gt;
		&lt;listener-class&gt;
			com.afei.web.FactoryLoaderListener
		&lt;/listener-class&gt;
	&lt;/listener&gt;</pre><p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/175842#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 25 Mar 2008 14:49:51 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/175842</link>
        <guid>http://afeitech.javaeye.com/blog/175842</guid>
      </item>
      <item>
        <title>采用单态模式保证Hibernate的SessionFactory的单态</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/175836" style="color:red;">http://afeitech.javaeye.com/blog/175836</a>&nbsp;
          发表时间: 2008年03月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>SessionFactoryBuilder.java</p><p>&nbsp;</p><pre name="code" class="java">//由SessionFactoryBuilder的单态来保证SessionFactory的单态
public class SessionFactoryBuilder {
	
	private SessionFactory sessionFactory;
	private static SessionFactoryBuilder sfb;
	
	//空的私有构造函数
	private SessionFactoryBuilder(){
		
	}
	
	public static SessionFactoryBuilder instance(){
		if(sfb==null){
			sfb=new SessionFactoryBuilder();
		}
		return sfb;
	}
	
	public SessionFactory getSessionFactory()throws MessageException{
		if(sessionFactory==null){
			try {
				Configuration configuration=new Configuration().configure();
				sessionFactory=configuration.buildSessionFactory();
			} catch (HibernateException e) {
				System.out.println(&quot;初始化SessionFactory出现异常......&quot;+e);
				throw new MessageException(&quot;初始化SessionFactory出现异常......&quot;);
			}
		}
		return sessionFactory;
	}

}
</pre><p>&nbsp;</p><p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/175836#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 25 Mar 2008 14:32:48 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/175836</link>
        <guid>http://afeitech.javaeye.com/blog/175836</guid>
      </item>
      <item>
        <title>用DAO工厂创建并管理dao实例</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/175823" style="color:red;">http://afeitech.javaeye.com/blog/175823</a>&nbsp;
          发表时间: 2008年03月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>不用Spring的时候，我们常用DAO工厂来创建并管理dao实例。</p><p>daoContext.xml</p><pre name="code" class="xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;daoContect&gt;
	&lt;dao id=&quot;userDao&quot; class=&quot;com.afei.dao.impl.UserDaoHibernate&quot;&gt;&lt;/dao&gt;
	&lt;dao id=&quot;messageDao&quot; class=&quot;com.afei.dao.impl.MessageDaoHibernate&quot;&gt;&lt;/dao&gt;
&lt;/daoContect&gt;</pre><p><span style="background-color: #fafafa">DaoFactory.java</span></p><pre name="code" class="java">public class DaoFactory {
	
	//建立一个DAO实例的缓冲池
	private Map&lt;String,Object&gt; daoMap=new HashMap&lt;String,Object&gt;();
	
	//建立DAO工厂实例：他是一个单态模式，所以是静态的实例
	private static DaoFactory df;
	
	//初始化DAO工厂
	//构造器私有才能阻止系统创建多个DaoFactory实例
	private DaoFactory(String path)throws Exception{
		//采用dom4j来读取配置文件，获得Document对象
		Document doc=new SAXReader().read(new File(path+&quot;\\daoContext.xml&quot;));
		Element root=doc.getRootElement();//由Document获得根元素
		List el=root.elements();//由根元素获得所有元素
		for(Iterator it=el.iterator();it.hasNext();){
			Element em=(Element)it.next();
			String id=em.attributeValue(&quot;id&quot;);
			String impl=em.attributeValue(&quot;class&quot;);//得到class表示字符串
			Class implClass=Class.forName(impl);// 把该字符串变成一个具体的类
			Object obj=implClass.newInstance();//生成该类的对象
			daoMap.put(id, obj);//把这个对象放到DAO缓冲池里
		}
	}
	
	//提供一个普通的入口方法，用以返回一个DaoFactory实例
	public static DaoFactory instance(String path)throws Exception{
		if(df==null){
			df=new DaoFactory(path);
		}
		return df;
	}
	
	//获取具体的DAO实例
	public Object getDao(String id){
		return daoMap.get(id);
	}
}</pre><p>MessageManagerImpl.java</p><pre name="code" class="java">public class MessageManagerImpl implements MessageManager {

	private UserDao userDao;
	private MessageDao messageDao;
	
	//构造方法：负责初始化DAO组件
	public MessageManagerImpl()throws MessageException{
		try {
			userDao=(UserDao)DaoFactory.instance(null).getDao(&quot;userDao&quot;);
			messageDao=(MessageDao)DaoFactory.instance(null).getDao(&quot;messageDao&quot;);
		} catch (Exception e) {
			e.printStackTrace();
			throw new MessageException(&quot;初始化业务逻辑组件出现异常......&quot;);
		}
	}
	
                //...................................................
	
                //下面就可以用了

}</pre><p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/175823#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 25 Mar 2008 14:21:16 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/175823</link>
        <guid>http://afeitech.javaeye.com/blog/175823</guid>
      </item>
      <item>
        <title>Struts+Hibernate分页代码：从dao到jsp</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/175782" style="color:red;">http://afeitech.javaeye.com/blog/175782</a>&nbsp;
          发表时间: 2008年03月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>listMessage.jsp：</p><pre name="code" class="html">&lt;table border=&quot;1&quot; align=&quot;center&quot; width=&quot;600&quot; style=&quot;border-collapse:collapse;font-size:10pt&quot; &gt;
  &lt;caption&gt;
    电子留言系统
  &lt;/caption&gt;
  &lt;tr&gt;
    &lt;td colspan=&quot;2&quot; align=&quot;right&quot;&gt;
    	&lt;a href=&quot;enterPostMessage.do&quot;&gt; 发表新留言&lt;/a&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th width=&quot;120&quot;&gt;作者&lt;/th&gt;
    &lt;th width=&quot;480&quot; &gt;留言标题&lt;/th&gt;
  &lt;/tr&gt;
&lt;logic:present name=&quot;messageList&quot; scope=&quot;request&quot; &gt;
	&lt;logic:iterate id=&quot;message&quot; name=&quot;messageList&quot; type=&quot;org.afei.vo.MessageBean&quot; scope=&quot;request&quot; &gt;
    &lt;tr&gt;
      &lt;td align=&quot;center&quot; width=&quot;167&quot;&gt;&lt;bean:write name=&quot;message&quot; property=&quot;owerName&quot;/&gt;&lt;/td&gt;
      &lt;td align=&quot;center&quot;&gt;
      	&lt;a href='viewMessage.do?messageId=&lt;bean:write name=&quot;message&quot; property=&quot;id&quot;/&gt;'&gt;&lt;bean:write name=&quot;message&quot; property=&quot;title&quot;/&gt;&lt;/a&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
&lt;/logic:iterate&gt;
  &lt;tr&gt;
    &lt;td align=&quot;right&quot; colspan=&quot;2&quot;&gt;
		第${requestScope.currentPage}页&nbsp;
		共${requestScope.pageCount}页&nbsp;	
		&lt;a href=&quot;listMessage.do?pageNo=1&quot;&gt;首页&lt;/a&gt;	
		&lt;logic:greaterThan name=&quot;currentPage&quot; value=&quot;1&quot; scope=&quot;request&quot;&gt;
			&lt;a href=&quot;listMessage.do?pageNo=${requestScope.currentPage - 1}&quot;&gt;	
				上一页	
			&lt;/a&gt;
		&lt;/logic:greaterThan&gt;		
		&lt;logic:lessThan name=&quot;currentPage&quot; value='${requestScope.pageCount}' scope=&quot;request&quot;&gt;
			&lt;a href=&quot;listMessage.do?pageNo=${requestScope.currentPage + 1}&quot;&gt;
			下一页
			&lt;/a&gt;
		&lt;/logic:lessThan&gt;	
		&lt;a href=&quot;listMessage.do?pageNo=${requestScope.pageCount}&quot;&gt;尾页&lt;/a&gt;
  	&lt;/td&gt;
  &lt;/tr&gt;
&lt;/logic:present&gt;
&lt;logic:notPresent name=&quot;messageList&quot; scope=&quot;request&quot; &gt;
  &lt;tr&gt;
    &lt;td align=&quot;center&quot; colspan=&quot;2&quot;&gt;暂时没有任何留言&lt;/td&gt;
  &lt;/tr&gt;
&lt;/logic:notPresent&gt;
&lt;/table&gt;</pre><p><span style="background-color: #fafafa">ListMessageAction.java</span></p><pre name="code" class="java">public class ListMessageAction extends BaseAction {

	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		//获取消息总数
		int messageCount=messManager.getMessageCount();		
		//获取总页数
		int pageCount=messManager.getPageCount(messageCount, MessageManager.MESSAGE_PAGE_SIZE);
		
		int pageNo;
		String pageNoStr=request.getParameter(&quot;pageNo&quot;);
		if(pageNoStr==null||&quot;&quot;.equals(pageNoStr.trim())){			
			pageNo=1;//第一次登陆，显示第一页
		}
		try {
			pageNo=Integer.parseInt(pageNoStr.trim());
		} catch (Exception e) {
			pageNo=1;
		}
		
		// 如果请求页已经超出最大页
		if(pageNo&gt;pageCount){
			pageNo=pageCount;
		}
		
		request.setAttribute(&quot;pageCount&quot;, pageCount);
		request.setAttribute(&quot;currentPage&quot;, pageNo);
		request.setAttribute(&quot;messageList&quot;, messManager.getAllMessageByPage(pageNo));
		return mapping.findForward(&quot;success&quot;);
	}

}</pre><p>&nbsp;</p><p><span style="background-color: #fafafa">MessageManagerImpl.java</span></p><pre name="code" class="java">	//获取消息数量
	public int getMessageCount() throws MessageException {
		Session sess=null;
		Transaction tx=null;
		try{
			sess=SessionFactoryBuilder.instance().getSessionFactory().openSession();
			tx=sess.beginTransaction();
			
			int result=(int)messageDao.findCount(sess);
			tx.commit();
			return result;
		}catch(Exception e){
			tx.rollback();
			e.printStackTrace();
			throw new MessageException(&quot;获取消息数量出现异常&quot;);
		}finally{
			sess.close();
		}
	}

	//根据总记录数和每页记录数获取总页数
	public int getPageCount(int count, int pageSize) throws MessageException {
		
		return (count+pageSize-1)/pageSize;
	}
 
</pre><p>&nbsp;</p><p><span style="background-color: #fafafa">MessageDaoHibernate.java</span></p><span style="background-color: #fafafa"><pre name="code" class="java">	public List findAllByPage(Session sess, int pageNo, int pageSize) {
		int offset=(pageNo-1)*pageSize;//（当前页码-1）*每页行数=开始查询的行号
		return sess.createQuery(&quot;from Message as m order by m.id desc&quot;)
				.setFirstResult(offset)//设置开始查询的第一行，默认从0开始
				.setMaxResults(pageSize)//设置需要查询的最大行数
				.list();
	}

	public long findCount(Session sess) {
		Object obj=sess.createQuery(&quot;select count(m.id) from Message as m&quot;)
		.uniqueResult();//返回一的实例
		return (Long)obj;	}</pre></span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/175782#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 25 Mar 2008 12:47:21 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/175782</link>
        <guid>http://afeitech.javaeye.com/blog/175782</guid>
      </item>
      <item>
        <title>GWT精品文章一锅端</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/175183" style="color:red;">http://afeitech.javaeye.com/blog/175183</a>&nbsp;
          发表时间: 2008年03月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: #ff0000"><span style="font-size: medium"><div style="text-align: center"><span style="color: #ff0000">博主收集的GWT精品文章</span></div><div align="left" style="text-align: center"></div></span></span><p>GWT官网: <a href="http://code.google.com/webtoolkit/">http://code.google.com/webtoolkit/</a></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/175183#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 23 Mar 2008 20:30:42 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/175183</link>
        <guid>http://afeitech.javaeye.com/blog/175183</guid>
      </item>
      <item>
        <title>Android文档阅读05—Hello, Android!及调试</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/174729" style="color:red;">http://afeitech.javaeye.com/blog/174729</a>&nbsp;
          发表时间: 2008年03月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;<span class="mw-headline"><span style="color: #ff0000">许可协议:<a href="http://creativecommons.org/licenses/by/2.5/cn/legalcode"><span style="color: #e9650e">creativecommons licenses</span></a><a href="http://creativecommons.org/licenses/by/2.5/cn/legalcode"></a></span></span></p><p>&nbsp;</p><p>第一印象，作为一个开发人员，我们对一个新的开发框架的第一印象通常是看他的&rdquo;Hello,World!&rdquo;程序有多简单。在Android中，实现起来是非常简单的。 </p><p><strong>实现Hello World需要几个步骤：</strong> </p><ul><li>创建项目 </li><li>设计用户界面 </li><li>运行程序：Hello，Android&nbsp;</li></ul><p><strong>以下几节讨论更加详细的内容</strong> </p><ul><li>通过（XML 布局）<a href="../../wiki/index.php?title=XML_Layout&amp;action=edit" class="new" title="XML Layout">XML Layout</a>更新用户界面 </li><li>调试程序 </li><li>不使用Eclipse创建项目 </li></ul><p>Let's jump in! 废话少说，马上开始。 </p><h2><span class="mw-headline">创建项目 </span></h2><p>创建项目非常简单，Eclipse的插件使Adroid的开发变得异常轻松。首先你需要安装一个3.3或以上版本的eclipse（译注：其实3.2也是可以的），然后给Eclipse安装一个Android插件。安装好上面的内容后，我们就可以开始了。 </p><p>首先，我们来一个总结来看看到底需要几步来完成我们的&quot;Hello, World!&quot;。 </p><p>1. 通过Eclipse的 File &gt; New &gt; Project 菜单创建&quot;Android Project&quot;项目。 </p><p>2. 在新Android 项目对话框中添加项目的详细信息 </p><p>3. 修改自动生成代码模板来显示一些东西 </p><p>上面3步已经足够了！接下来，让我们开始吧 </p><p>&nbsp;</p><p><strong>1. 创建Android项目</strong> </p><p>在Eclipse中选择 File &gt; New &gt; Project 菜单项。如果你已经成功安装了Android 插件，你会在弹出的新项目对话框中看到一个叫做&ldquo;Android&rdquo;的条目，包含一个&rdquo;Android Project&rdquo;的项目 </p><p>&nbsp;</p><p>选中&quot;Android Project&quot;，点击 Next进行入下一步。 </p><p>&nbsp;</p><p><strong>2. 填写项目的相关信息</strong> </p><p>这个窗口里你需要填写一些项目的相关信息.请看图中的示例： </p><p>&nbsp;</p><p>下面解释一下屏幕上的内容： </p><p>&nbsp;</p><p>这是计算机中保存项目文件目录的名称。 </p><p>这是和Java语言意义相同的包名(Package namespace)&mdash;你的源代码将属于这个包名。同时stub Activity也将据此生成。 </p><p>你所给出的报名必须保证在你的应用中是唯一的；因为这个原因，包的命名遵循域名方式（domain-style）就显得非常重要了；在实例中我们使用&quot;com.google.android&quot;作为包名；你可以选择一个适合你自己的包名。 </p><p>&nbsp;</p><p>Android插件将根据这个名称来创建一个stub类。他是一个继承自<a href="../../wiki/index.php/Activity" title="Activity">Activity</a>类的子类。<a href="../../wiki/index.php/Activity" title="Activity">Activity</a>类似一个简单的可以运行和工作的类。它能够根据你的需要创建用户界面，当然了这不是必须的。 </p><p>&nbsp;这是你应用程序的标题。 </p><p>&nbsp;</p><p>你可以通过选择&quot;Use default location&quot;这个复选框来项目文件的存储位置。 </p><p>&nbsp;</p><p><strong>3.编辑自动生成的程序代码</strong> </p><p>&nbsp;</p><p>Android插件执行完毕后将创建一个叫做HelloAndroid类，他的内容如下： </p><pre name="code" class="java">public class HelloAndroid extends Activity {  /**在activity被创建后执行*/ 

   @Override
   public void onCreate(Bundle icicle)
   {
       super.onCreate(icicle);
       setContentView(R.layout.main);
   }
} </pre><h2><span class="mw-headline">创建用户界面 </span></h2><p>创建好项目以后，我们要做的是在屏幕上显示一点文字。下面是完成后的代码，我们将逐行分析它： </p><pre name="code" class="java">public class HelloAndroid extends Activity {/**在activity被创建后执行*/ 

   @Override
   public void onCreate(Bundle icicle) {
       super.onCreate(icicle);
       TextView tv = new TextView(this);
       tv.setText(&quot;Hello, Android&quot;);
       setContentView(tv);
   }
} </pre><p>在Android中，用户界面是由<a href="../../wiki/index.php?title=View&amp;action=edit" class="new" title="View">View</a>来组成的。一个<a href="../../wiki/index.php?title=View&amp;action=edit" class="new" title="View">View</a>就是一个drawable的对象，比如一个单选按钮，一个动画，或者（本例中）是一个文字标签。<a href="../../wiki/index.php?title=View&amp;action=edit" class="new" title="View">View</a>子类型中用来显示文字 类是<a href="../../wiki/index.php?title=TextView&amp;action=edit" class="new" title="TextView">TextView</a>。 </p><p>下面演示如何构建一个<a href="../../wiki/index.php?title=TextView&amp;action=edit" class="new" title="TextView">TextView</a>的实例 </p><pre name="code" class="java">TextView tv = new TextView(this); </pre><p>&nbsp;TextView构造函数中的参数类型是Context。Context类可以简单的理解为系统的句柄；他提供访问了诸如资源、数据库以及程序设置的服务。Activity类继承自Context。我们的HelloAndroid类继承自Activity类，他同时也继承了Context。正因为如此我们才能使用&rsquo;this&rsquo;这个参数来创建TextView。 </p><p>&nbsp;</p><p>上面我们已经创建了一个TextView，下面我们来让他显示些文字： </p><pre name="code" class="java">tv.setText(&quot;Hello, Android&quot;); </pre><p>&nbsp;这里没有什么好说的。 </p><p>我们已经创建了一个TextView并且告诉了他要显示什么，最后就是让他显示在屏幕上了，就像下面这样： </p><pre name="code" class="java">setContentView(tv); </pre><p>&nbsp;setContentView()方法让系统知道哪个View是与Activity的界面有联系的。如果你的Activity没有执行这个方法，界面将什么都不会显示，系统只会显示空屏幕。我们的目的是要显示一些文字，所以我们在这个方法的参数中填上TextView。 </p><p>&nbsp;</p><p>这就是我们Android中的&quot;Hello, World&quot;了！接下来当然是看看如何运行它了。 </p><h2><span class="mw-headline">运行程序：Hello, Android </span></h2><p>Android提供的Eclipse插件使得运行我们的程序非常简单。选择Run &gt; Open Run Dialog菜单；你会看到一个这样的对话框： </p><p>&nbsp;</p><p>接下来，选中&quot;Android Application&quot;这一项。点击左上角按钮（文档图标上有个加号的那个）或者简单双击&quot;Android Application&quot;项。你会得到一个叫做&quot;New_configuration&quot; 新launcher。 </p><p>&nbsp;</p><p>选择一个更好的名字，比如&quot;Hello, Android&quot;, 点击&quot;Browse&quot;按钮选择你的项目。(如果你现在打开了多个Android的项目，一定要确认你选择了正确的那个)。Android插件会自动的扫描你的项目来查找Activity 的子类，在&quot;Activity:&quot; 标签下面的下拉框中列出所有的选项。你的&quot;Hello, Android&quot; 只有一个，他将作为缺省的选项。 </p><p>点击 &quot;Apply&quot; 按钮。示例如下： </p><p>&nbsp;</p><p>大功告成！点击run按钮，Androi模拟器将运行。当模拟器启动完成你将看到你的程序。到这里我们就完成了。 </p><p>&nbsp;</p><p>这就是我们Android中 &ldquo;Hello，World&rdquo;。很简单吧，嗯？下面的章节我们会探讨一些比较深入的东西，对你学习Android肯定有所帮助。 </p><h2><span class="mw-headline">通过XML Layout构造用户界面 </span></h2><p>你刚刚完成&quot;Hello, World&quot;时通过编程来创建用户界面的。也就是说你在你的程序代码中来创建界面。如果你以前做过很多的界面编程，你一定知道有个非常麻烦的事情：在一大段代码中找到并且修改一个小的界面变化是很头疼的。而且也容易忘记属性与视图之间的关系，从而导致错误，浪费大量的时间来调试代码。 </p><p>&nbsp;</p><p>这就是Android提供了一个替代创建用户界面的模式：基于XML的XML Layout文件。解释这个概念的最好方法就是创建一个例子。这个XML Layout文件实现了我们上面用程序代码实现的功能。 </p><pre name="code" class="xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;TextView xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; 

 android:layout_width=&quot;fill_parent&quot;
 android:layout_height=&quot;fill_parent&quot;
 android:text=&quot;Hello, Android&quot;

/&gt;
</pre><p>一般的Android XML Layout 文件 结构非常简单。它由树形的标记组成，每一个标记都是一个View类。在上面这个例子中只有一个元（element）-TextView。你可以在XML layout中使用任何一个继承自View的类，也包括你自己定义的类。这样简单的结构和语法使我们能够比使用代码更快的创建用户界面。它的灵感来自Web开发中用户界面与程序逻辑分开的模式。 </p><p>&nbsp;</p><p>这个例子中只有4个XML属性，下面列出含义： </p><p><strong><em>android:layout_width</em></strong></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个属性定义了使用宽度，磁力中使用最大可用宽度。</p><p><strong><em>android:layout_height</em></strong></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同上，使用可用的屏幕高度</p><p><strong><em>android:text</em></strong>&nbsp; </p><p>TextView显示的文字内容，这个例子中显示 &quot;Hello, Android&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p><p>&nbsp;</p><p>这就是XML layout的内容，但是该将它放在那里呢？在项目的res/ 目录中。这个&quot;res&quot;是对&quot;resources&quot;的缩写，这个目录中存放项目中所有不是代码的资源或文件。包括：图片，本地字符串，XML layout文件。 </p><p>&nbsp;</p><p>Eclipse插件已经为我们创建了这些XML文件。在我们上面的例子中，我们根本没有使用过他们。在Package Explorer中展开res/layout,目录，修改其中的main.xml文件。使用上面的文本替换掉他的内容。现在从Package Explorer中的源代码文件夹中打开R.java文件，你将看到如下内容： </p><pre name="code" class="java">public final class R { 

   public static final class attr {
   };
   public static final class drawable {
       public static final int icon=0x7f020000;
   };
   public static final class layout {
       public static final int main=0x7f030000;
   };
   public static final class string {
       public static final int app_name=0x7f040000;
   };
}</pre><p>&nbsp;</p><p>项目中的R.java文件是对文件中所有定义资源的索引。可以用最简单的方式在代码中使用项目中定义的资源。利用Eclipse的代码提示功能可以更快找到需要的内容。 </p><p>&nbsp;</p><p>其中最重要的两个内部类就是&quot;layou&quot;和&quot;main&quot;。Eclipse插件会根据你在XML layout文件中更改自动生成R.java文件。当时你在项目中添加了其他资源后你会先R.java会马上发生变化。 </p><p>&nbsp;</p><p>最后一件事就是你要修改你的HelloAndroid 代码，让程序使用XML layout文件定义的界面而不是采用我们以前的硬编码方式。看看现在的代码，简单多了： </p><pre name="code" class="java">public class HelloAndroid extends Activity { 

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle icicle) {
       super.onCreate(icicle);
       setContentView(R.layout.main); 
   }
} </pre><p>&nbsp;</p><p>不要简单的拷贝粘贴来修改文件，试试R类的代码自动完成，这是你或许感觉到R类的作用了。 </p><p>&nbsp;</p><p>好，现在你已经完成了修改，让我们重新运行一下程序---你要做的就是点击以下有绿色箭头图标的Run按钮，或者选择Run&gt;Run菜单来运行。你会看到和以前相同的结果。我们可以看出两种不同的布局方法结果是相同的。 </p><p>&nbsp;</p><p>我们只是对XML layouts有了个大概的了解，你需要阅读用户界面部分的完整文档来获取进一步的信息。 </p><h2>&nbsp;<span class="mw-headline">调试程序 </span></h2><p>Android的Eclipse的插件也能够完美的与Eclipse的调试器集成。为了证实这一点，我们来做一个简单的测试。将你HelloAndroid 程序的代码改成这样: </p><p>这段代码很明显将产生一个NullPointerException 异常。运行后你看到： </p><pre name="code" class="java">public class HelloAndroid extends Activity { 

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle icicle) {
      super.onCreate(icicle);
      Object o = null;
      o.toString();
      setContentView(R.layout.main);
  }
}</pre><p>&nbsp;</p><p>为了找出错误，我们在&quot;Object o = null;&quot;这一行设置一个断点（你可以通过双击eclipse编辑器行号左边的空余部分来创建）。选择 Run &gt; Debug菜单进入到调试模式。你的程序在模拟器中重新启动，但是这次程序会在运行到断点的地方停住。就行你在其他开发工具中那样，你可以在Eclipse的Debug Perspective中检查代码。 </p><h2><span class="mw-headline">不使用eclipse创建项目 </span></h2><p>如果你不使用Eclipse(比如其他IDE或者是使用简单的文本编辑器和命令行工具)，那么Android的Eclipse插件就帮不了你了。但是别太担心--你不会因为不使用Eclipse而失去某些功能。 </p><p>&nbsp;</p><p>Android 插件实际上只是对SDK里面的工具做了一下封装。因此可以使用其他工具来封装这些工具，比如'ant'来编译文件。（像emulator, aapt, adb, ddms这些工具都可以在文档中找到使用的方法） </p><p>&nbsp;</p><p>Android SDK 同时包含了一个名称为&quot;activityCreator.py&quot;的Python的程序脚本，用来创建项目中的代码和目录，以及一个兼容'ant'的build.xml文件。这使得你可以通过命令行或者使之与其他的IDE工具集成。 </p><p>&nbsp;</p><p>例如，创建一个想刚才我们在eclipse中创建的HelloAndroid 项目，你可以使用这样的命令： </p><p>activityCreator.py --out HelloAndroid com.google.android.hello.HelloAndroid </p><p>为了编译这个项目，你必须使用ant命令。当命令成功完成后，你可以在'bin'目录中找到一个HelloAndroid.apk文件。这个.apt文件就是一个Android 包，你可以使用'adb'工具把它安装到模拟器中。 </p><!-- end content -->
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/174729#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 22 Mar 2008 02:13:31 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/174729</link>
        <guid>http://afeitech.javaeye.com/blog/174729</guid>
      </item>
      <item>
        <title>Android文档阅读04—Application的生命周期</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/173593" style="color:red;">http://afeitech.javaeye.com/blog/173593</a>&nbsp;
          发表时间: 2008年03月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;<span class="mw-headline"><span style="color: #ff0000">许可协议:<a href="http://creativecommons.org/licenses/by/2.5/cn/legalcode"><span style="color: #e9650e">creativecommons licenses</span></a><a href="http://creativecommons.org/licenses/by/2.5/cn/legalcode"></a></span></span></p><p>&nbsp;</p><p>在多数情况下, 每个Android应用运行在自己的Linux进程中. 当一个应用的某段code需要运行的时候这个进程将会被创建, 直到不再需要该应用或系统要为其他的应用释放内存的时候才停止. </p><p>&nbsp;</p><p>一个非常重要且少有的特性是, 应用进程的存活时间不是由这个应用直接控制的. 而是由系统决定的, 系统会根据每个已知的正在运行的应用情况来定夺, 包括, 该应用对用户的重要性和系统全部可用内存. </p><p>&nbsp;</p><p>对于开发人员来讲, 了解每个应用组件(尤其是, Activity, Service, 和IntentReceiver)对于应用进程存活时间的影响是非常重要的. 如果没有正确使用, 可能会导致应用进程在处理重要工作的时候被系统杀掉. </p><p>&nbsp;</p><p>在对应用进程生命周期的理解中, 一个典型的错误就是当一个IntentReceiver 接收到Intent 之后, 会在自己的onReceiveIntent()方法中开起一个线程, 而后return这个方法. 一旦这个方法return, 系统会认为这个IntentReceiver 不在处于活跃状态, 也就认为他的宿主进程不再需要(除非还包有其他活跃的应用组件). 以至于当系统需要回收内存的时候会随时释kill掉这个进程, 中止其中的子线程. 解决这个问题的办法是在IntentReceiver中启动一个Service, 这样系统会知道在这个进程中还有活跃的任务需要完成. </p><p>&nbsp;</p><p>为了决定在内存较低的时候杀掉哪个进程, Android会根据运行在这些进程内的组件及他们的状态把进程划分成一个&quot;重要程度层次&quot;. 其重要的程度按以下规则排序: </p><dl><ol><li><strong>前端进程</strong>可以是一个持有运行在屏幕最前端并与用户交互的Activity的进程(onResume方法被调用时)，也可以是持有一个正在运行的IntentReceiver(也就是说他正在执行自己的onReceiveIntent方法)的进程. 在系统中, 只会有少数这样的进程, 并且除非内存已经低到不够这些进程运行, 否则系统不会主动杀掉这些进程. 这时, 设备通常已经达到了需要内存整理的状态, 所以杀掉这些进程是为了不让用户界面停止响应.</li><li><strong>可视进程</strong>是持有一个被用户可见, 但没有显示在最前端 (onPause方法被调用时) 的Activity的进程. 举例来说, 这种进程通常出现在一个前端Activity以一个对话框出现并保持前一个Activity可见时. 这种进程被系统认为是极其重要的, 并且通常不会被杀掉, 除非为了保持所有前端进程正常运行不得不杀掉这些可见进程. </li><li><strong>服务进程</strong>是持有一个Service的进程, 该Service是由startService()方法启动的, 尽管这些进程用户不能直接看到, 但是通常他们做的工作用户是十分关注的(例如, 在后台播放mp3或是在后台下载 上传文件), 所以, 除非为了保持所有的前端进程和可视进程正常运行外, 系统是不会杀掉服务进程的. </li><li><strong>后台进程</strong>是持有一个不再被用户可见的Activity(onStop()方法被调用时)的进程. 这些进程不会直接影响用户体验. 加入这些进程已经完整的,正确的完成了自己的生命周期(访问Activity查看更多细节), 系统会在为前三种进程释放内存时随时杀掉这些后台进程. 通常会有很多的后台进程在运行, 所以这些进程被存放在一个LRU列表中, 以保证在低内存的时候, 最近一个被用户看到的进程会被最后杀掉. </li><li><strong>空进程</strong>是没有持有任何活动应用组件的进程. 保留这种进程的唯一理由是为了提供一种缓存机制, 缩短他的应用下次运行时的启动时间. 就其本身而言, 系统杀掉这些进程的目的是为了在这些空进程和底层的核心缓存之间平衡整个系统的资源. </li></ol></dl><p>当需要给一个进程分类的时候, 系统会在该进程中处于活动状态的所有组件里掉选一个重要等级最高作为分类依据. 查看Activity, Service,和IntentReceiver的文档, 了解每个组件在进程整个生命周期中的贡献. 每一个classes的文档详细描述他们在各自应用的生命周期中所起得作用. </p><!-- end content -->
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/173593#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 19 Mar 2008 08:34:21 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/173593</link>
        <guid>http://afeitech.javaeye.com/blog/173593</guid>
      </item>
      <item>
        <title>Android文档阅读03—开发工具</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/173238" style="color:red;">http://afeitech.javaeye.com/blog/173238</a>&nbsp;
          发表时间: 2008年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;<span class="mw-headline"><span style="color: #ff0000">许可协议:<a href="http://creativecommons.org/licenses/by/2.5/cn/legalcode"><span style="color: #e9650e">creativecommons licenses</span></a><a href="http://creativecommons.org/licenses/by/2.5/cn/legalcode"></a></span></span></p><p>&nbsp;</p><p>Android SDK包含了在Android平台上开发移动应用的各种工具集。它不仅包括了Android模拟器和用于Eclipse的Android开发工具插件(ADT)，而且包括了各种用来调试、打包和在模拟器上安装应用的工具。 </p><a name="Android_Emulator" title="Android_Emulator"></a><h2>&nbsp;<span class="mw-headline">Android Emulator </span></h2><p>Android模拟器：一个运行在电脑上的手机模拟器。你可以使用这个模拟器，在真实的Android运行环境中去设计、调试和测试自己开发的应用程序。 </p><a name="Android_Development_Tools_Plugin_for_the_Eclipse_IDE" title="Android_Development_Tools_Plugin_for_the_Eclipse_IDE"></a><h2>&nbsp;<span class="mw-headline">Android Development Tools Plugin for the Eclipse IDE </span></h2><p>用于Eclipse集成开发环境的Android应用开发工具插件：它为Eclipse集成开发环境增加了强大的功能，使得创建和调试Android应用程序更加简单和快速。如果你使用Eclipse来开发Android应用，ADT插件将给你带来极大的帮助： </p><ul><li>可以从Eclipse集成开发环境内部访问别的Android开发工具。例如，ADT允许你直接从Eclipse访问DDMS工具的很多功能，包括截屏、管理端口转发(port-forwarding)、设置断点、查看线程和进程信息。 </li><li>它提供一个新的项目向导，用于快速创建一个新的Android应用需要的所有基本文件。 </li><li>它使构建Android应用的过程自动化和简单化。 </li><li>它提供一个Android代码编辑器，用于为Android的manifest和资源文件编写有效的XML。 </li></ul><p>更多的关于ADT插件的信息，包括安装指令，请参见<a href="../../wiki/index.php?title=Intro/installing&amp;action=edit" class="new" title="Intro/installing">Installing the ADT Plugin for Eclipse</a>。<a href="../../wiki/index.php/Intro/hello-android" title="Intro/hello-android">Hello Android</a>描述了一个有用的例子程序和程序的效果图。 </p><h2><span class="mw-headline">Dalvik Debug Monitor Service(ddms) </span></h2><p>Dalvik调试监视服务：它集成在Dalvik（Android平台的虚拟机）中，用于管理运行在模拟器或设备上的进程，并协助进行调试。你可以用它来杀死进程、选择一个特定程序来调试、生成跟踪数据、查看堆和线程数据、对模拟器或设备进行屏幕快照等等。 </p><a name="Android_Debug_Bridge_.28adb.29" title="Android_Debug_Bridge_.28adb.29"></a><h2><span class="mw-headline">Android Debug Bridge (adb) </span></h2><p>Android调试桥：它用于向模拟器或设备安装应用程序的.apk文件和从命令行访问模拟器或设备。也可以用于将标准的调试器连接到运行在Android模拟器或设备上的应用代码。 </p><a name="Android_Asset_Packaging_Tool_.28aapt.29" title="Android_Asset_Packaging_Tool_.28aapt.29"></a><h2>&nbsp;<span class="mw-headline">Android Asset Packaging Tool (aapt) </span></h2><p>Android资源打包工具：你可以通过aapt工具来创建.apk文件，这些文件包含了Android应用程序的二进制文件和资源文件。 </p><h2><span class="mw-headline">Android Interface Description Language (aidl) </span></h2><p>Android接口描述语言：它用来生成进程间接口代码。例如，在一个服务中可能就会用到。 </p><a name="sqlite3" title="sqlite3"></a><h2><span class="mw-headline">sqlite3 </span></h2><p>SQLite3数据库：Android应用程序可以创建和使用SQLite数据文件，而开发者和使用者也可以方便的访问这些SQLite数据文件。 </p><a name="Traceview" title="Traceview"></a><h2><span class="mw-headline">Traceview </span></h2><p>跟踪显示工具：它可以生成跟踪日志数据的图形分析视图。这些跟踪日志数据由Android应用程序产生。 </p><a name="mksdcard" title="mksdcard"></a><h2><span class="mw-headline">mksdcard </span></h2><p>创建SD卡工具：它帮助创建磁盘镜像。这个磁盘镜像可以在模拟器上模拟外部存储卡（比如SD卡）。 </p><a name="dx" title="dx"></a><h2><span class="mw-headline">dx </span></h2><p>DX工具：它将.class字节码重写为Android字节码(存储在.dex文件中)。 </p><a name="activityCreator" title="activityCreator"></a><h2><span class="mw-headline">activityCreator </span></h2><p>activityCreator：它是一个脚本，用来生成<a href="http://ant.apache.org/" class="external text" title="http://ant.apache.org/" rel="nofollow">Ant</a>构建文件。<a href="http://ant.apache.org/" class="external text" title="http://ant.apache.org/" rel="nofollow">Ant</a>构建文件用来编译Android应用程序。如果你在安装了ADT插件的Eclipse环境下开发，就不需要这个脚本了。 </p><!-- end content -->
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/173238#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Mar 2008 07:14:50 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/173238</link>
        <guid>http://afeitech.javaeye.com/blog/173238</guid>
      </item>
      <item>
        <title>Android文档阅读02—解析Android程序</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/173237" style="color:red;">http://afeitech.javaeye.com/blog/173237</a>&nbsp;
          发表时间: 2008年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span class="mw-headline"><span style="color: #ff0000">许可协议:<a href="http://creativecommons.org/licenses/by/2.5/cn/legalcode"><span style="color: #e9650e">creativecommons licenses</span></a><a href="http://creativecommons.org/licenses/by/2.5/cn/legalcode"></a></span></span>&nbsp;</p><p>&nbsp;</p><p>在Android应用程序中有四个构建块： </p><ul><li>Activity </li><li>Intent Receiver </li><li>Service </li><li>Content Provider </li></ul><p>并不是每个程序都需要所有的四个部分，你的程序可能用到它们其中一些的组合。 </p><p>一旦你决定在你的程序中需要哪个组件，你应该在一个叫AndroidManifest.xml的文件中列出它们。你在这个XML文件中声明程序中用到的组件和它们的用途和需要。在<a href="http://code.google.com/android/devel/bblocks-manifest.html" class="new" title="Android manifest file 文档" target="_blank">Android manifest file 文档</a>中查阅完整的细节。</p><p>&nbsp;</p><h2>&nbsp;<span class="mw-headline">Activity</span></h2><p>Activity是Android构造块中最基本的一种，在应用中，一个activity通常就是一个单独的屏幕。每一个activity都被实现为一个独立的类，并且继承于Activity这个基类。这个activity类将会显示由几个Views控件组成的用户接口，并对事件做出响应。大部份的应用都会包含多个的屏幕。例如，一个短消息应用程序将会有一个屏幕用于显示联系人列表，第二个屏幕用于写短消息，同时还会有用于浏览旧短消息及进行系统设置的屏幕。每一个这样的屏幕，就是一个activity。从一个屏幕导航到另一个屏幕是很简单的。在一些应用中，一个屏幕甚至会返回值给前一个屏幕。 </p><p>&nbsp;</p><p>当一个新的屏幕打开后，前一个屏幕将会暂停，并保存在历史堆栈中。用户可以返回到历史堆栈中的前一个屏幕。当屏幕不再使用时，还可以从历史堆栈中删除。默认情况下，Android将会保留从主屏幕到每一个应用的运行屏幕。 </p><p><strong><span style="font-size: medium">Intent and Intent Filters</span></strong> </p><p>&nbsp;</p><p>Android使用了Intent这个特殊类，实现在屏幕与屏幕之间移动。Intent类用于描述一个应用想要做什么事。在Intent的描述结构中，有两个最重要的部分：动作和动作对应的数据。</p><p>典型的动作类型有：MAIN（activity的门户）、VIEW、PICK、EDIT等。而动作对应的数据则以URI的形式进行表示。例如：要查看一个人的联系方式，你需要创建一个动作类型为VIEW的intent，以及一个表示这个人的URI。 </p><p>Android利用一个叫Intent的特殊类来实现屏幕间的切换。一个Intent描述了一个应用程序想要做什么。intent数据结构中两个最重要的部分是动作和动作对应的数据。一个典型动作的值是MAIN(活动的入口)，VIEW,PICK,EDIT,和其它一些。数据表示为URI。例如，浏览一个人的联系信息，你应该创建一个带有VIEW活动的intent，并且URI的数据集指向那个人。 </p><p>&nbsp;</p><p>与之有关系的一个类叫IntentFilter。相对于intent是一个有效的做某事的请求，一个intent filter则用于描述一个activity（或者Intent Receiver）能够操作哪些intent。一个activity如果要显示一个人的联系方式时，需要声明一个IntentFilter，这个IntentFilter要知道怎么去处理VIEW动作和表示一个人的URI。IntentFilter需要在AndroidManifest.xml中定义。 </p><p>&nbsp;</p><p>一个屏幕到另一个屏幕之间的导航是通过解析意图（Intent）来实现的。当向前导航时，activity将会调用startActivity (Intent myIntent)方法。然后，系统会在所有安装的应用程序中定义的IntentFilter中查找，找到最匹配myIntent的 Intent对应的activity。新的activity接收到myIntent的通知后，开始运行。当startActivity方法被调用将触发解析 myIntent的动作，这个机制提供了两个关键好处： </p><ul><li>Activity能够简单的通过在Intent表中发送请求，从其他组件中复用功能 </li><li>Activity能够在任何时候由一个带有相同IntentFilter的Activity替换 </li></ul><a name="Intent_Receiver" title="Intent_Receiver"></a><h2>&nbsp;<span class="mw-headline">Intent Receiver</span></h2><p>当你希望你的应用能够对一个外部的事件（如当电话呼入时，或者数据网络可用时，或者到了晚上时）做出响应，你可以使用一个Intent Receiver。虽然Intent Receiver在感兴趣的事件发生时，会使用NotificationManager 通知用户，但它并不能生成一个UI。Intent Receiver在AndroidManifest.xml中注册，但也可以在代码中使用 Context.registerReceiver()进行注册。当一个intent receiver被触发时，你的应用不必对请求调用intent receiver，系统会在需要的时候启动你的应用。各种应用还可以通过使用Context.broadcastIntent()将它们自己的 intent receiver广播给其它应用程序。 </p><a name="Service" title="Service"></a><h2>&nbsp;<span class="mw-headline">Service</span></h2><p>一个Service是一段长生命周期的，没有用户界面的程序。比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中，应该会有多个activity，让使用者可以选择歌曲并播放歌曲。然而，音乐重放这个功能并没有对应的activity，因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。在这个例子中，媒体播放器这个activity会使用Context.startService()来启动一个service，从而可以在后台保持音乐的播放。同时，系统也将保持这个service一直执行，直到这个service运行结束。另外，我们还可以通过使用Context.bindService()方法，连接到一个service上（如果这个service还没有运行将启动它）。当连接到一个service之后，我们还可以service提供的接口与它进行通讯。拿媒体播放器这个例子来说，我们还可以进行暂停、重播等操作。 </p><a name="Content_Provider" title="Content_Provider"></a><h2><span class="mw-headline">Content Provider</span></h2><p>应用程序能够将它们的数据保存到文件中、SQL数据库中，甚至是任何有效的设备中。当你想将你的应用数据与其它的应用共享时，Content Provider将会很有用。一个Content Provider类实现了一组标准的方法，从而能够让其它的应用保存或读取此Content Provider处理的各种数据类型。 </p><p>更详细的Content Provider资料，可以参考附带文档中的<a href="http://code.google.com/android/devel/data/contentproviders.html" target="_blank">Accessing Content Providers。</a></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/173237#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Mar 2008 07:07:52 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/173237</link>
        <guid>http://afeitech.javaeye.com/blog/173237</guid>
      </item>
      <item>
        <title>Android文档阅读01—Android是什么?</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/173233" style="color:red;">http://afeitech.javaeye.com/blog/173233</a>&nbsp;
          发表时间: 2008年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span class="mw-headline"><span style="color: #ff0000">许可协议:<a href="http://creativecommons.org/licenses/by/2.5/cn/legalcode">creativecommons licenses</a><a href="http://creativecommons.org/licenses/by/2.5/cn/legalcode"></a></span></span></p><p><span class="mw-headline"><strong></strong></span></p><p><span class="mw-headline"><strong><span style="color: #ff0000">Android是什么?</span></strong> </span></p><p>Android是一个针对移动设备的程序集, 其中包括一个操作系统, 一个中间件和一些关键性应用. 本文首先概览了<a href="http://code.google.com/android/download.html" class="external text" title="http://code.google.com/android/download.html" rel="nofollow">Android SDK</a>提供的工具和APIs, 当您在使用Java语言来开发Android平台的应用时您会用到它们. </p><a name=".E7.89.B9.E6.80.A7" title=".E7.89.B9.E6.80.A7"></a><h2><span class="mw-headline">特性</span></h2><dl><dd><ul><li><strong>程序程序框架</strong>可重用及可复写组件组成 </li></ul></dd></dl><dl><dd><ul><li>针对移动设备优化过的<strong>Dalvik虚拟机</strong> </li></ul></dd></dl><dl><dd><ul><li><strong>整合浏览器</strong>, 该浏览器基于开源的<a href="http://webkit.org/" class="external text" title="http://webkit.org/" rel="nofollow">WebKit</a>引擎开发 </li></ul></dd></dl><dl><dd><ul><li>提供了优化过得图形系统, 该系统由一个自定义的2D图形库; 一个遵循OpenGL ES 1.0标准(硬件加速)的3D图形库组成 </li></ul></dd></dl><dl><dd><ul><li>使用<strong>SQLite</strong>来实现结构化数据的存储 </li></ul></dd></dl><dl><dd><ul><li><strong>媒体</strong>方面对一些通用的audio, video, 和图片格式提供支持(MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF) </li></ul></dd></dl><dl><dd><ul><li><strong>GSM技术</strong>(依赖硬件) </li></ul></dd></dl><dl><dd><ul><li><strong>蓝牙, EDGE, 3G和WiFi</strong>(依赖硬件) </li></ul></dd></dl><dl><dd><ul><li><strong>Camera, GPS, 指南针, 和加速计</strong> (依赖硬件) </li></ul></dd></dl><dl><dd><ul><li><strong>非常丰富的开发环境</strong>, 包括一个设备模拟器, 调适工具, 内存和效率调优工具和一个Eclipse的插件 </li></ul></dd></dl><a name="Android.E7.9A.84.E7.BB.93.E6.9E.84" title="Android.E7.9A.84.E7.BB.93.E6.9E.84"></a><h2><span class="mw-headline">Android的结构 </span></h2><p>下图展示了Android 操作系统的主要组件结构. 每一部分都在下面的段落有详细介绍 </p><p><img src="../../../upload/attachment/17377/15ce8e18-f4cc-3873-bda4-919bce08fc6c.jpg" border="0" height="512" alt="the major components of the Android operating system" width="713" /></p><a name=".E5.BA.94.E7.94.A8.E7.A8.8B.E5.BA.8F" title=".E5.BA.94.E7.94.A8.E7.A8.8B.E5.BA.8F"></a><h2><span class="mw-headline">应用程序 </span></h2><p>Android会附带一些核心的应用程序, 包括一个email客户端, 短信程序, 日历, 地图, 浏览器, 通讯录等等. 所有的应用程序都是由Java语言完成的. </p><a name=".E5.BA.94.E7.94.A8.E7.A8.8B.E5.BA.8F.E6.A1.86.E6.9E.B6" title=".E5.BA.94.E7.94.A8.E7.A8.8B.E5.BA.8F.E6.A1.86.E6.9E.B6"></a><h2><span class="mw-headline">应用程序框架 </span></h2><p>Developers have full access to the same framework APIs used by the core applications. The application architecture is designed to simplify the reuse of components; any application can publish its capabilities and any other application may then make use of those capabilities (subject to security constraints enforced by the framework). This same mechanism allows components to be replaced by the user. </p><p>开发人员可以跟那些核心应用一样, 拥有访问框架APIs的全部权限. 应用的系结构设计简化了各组件之间的重用；任何应用都可以分发自己的组件, 任何应用也可以使用这些分发的组件（应用的使用方法需遵循框架的安全性约束）。这个机制对用户来说同样适用, 他们也可以替换组件. </p><p>隐藏在每个应用后面的是一套服务和系统, 其中包括: </p><p>&nbsp;</p><dl><dd><ul><li>一套表现丰富,扩展性很强的<a href="../../wiki/index.php?title=Reference/view-gallery&amp;action=edit" class="new" title="Reference/view-gallery">View</a>, 通过这些View您可以创建包括list, grid, 文本框, 按钮, 甚至一个嵌入浏览器的应用 </li></ul></dd></dl><dl><dd><ul><li><a href="../../wiki/index.php/Devel/data/contentproviders" title="Devel/data/contentproviders">Content Providers</a>, 通过它可以在某个应用内访问其他应用的数据(例如通讯录), 或者共享自己的数据 </li></ul></dd></dl><dl><dd><ul><li><a href="../../wiki/index.php/Devel/resources-i18n" title="Devel/resources-i18n">Resource Manager</a>, 提供对静态资源的访问能力, 例如国际化文本和layout文件 </li></ul></dd></dl><dl><dd><ul><li><a href="../../wiki/index.php/Reference/android/app/NotificationManager" title="Reference/android/app/NotificationManager">Notification Manager</a>, 通过该机制, 所有的应用都可以在状态栏显示自己的提醒信息 </li></ul></dd></dl><dl><dd><ul><li><a href="../../wiki/index.php/Reference/android/app/Activity" title="Reference/android/app/Activity">Activity Manager</a>, 用于管理应用的生命周期, 并且提供了通用的向后导航功能 </li></ul></dd></dl><p><br />预想了解更多并且对一个应用有一个整体的了解, 请您看<a href="../../wiki/index.php/Intro/tutorial" title="Intro/tutorial">编写一个Android应用</a> </p><a name=".E5.BA.93" title=".E5.BA.93"></a><h2><span class="mw-headline">库 </span></h2><p>Android 包含一套C/C++库, 被用于Android 系统中的各种组件中. 这些功能通过Android 应用框架展现给开发人员. 下面列出一些核心库: </p><dl><dd><ul><li><strong>System C library</strong> - 实现了BSD-derived 的标准C系统库(libc), 用于嵌入式的基于Linux的设备 </li></ul></dd></dl><dl><dd><ul><li><strong>Media Libraries</strong> - 基于PacketVideo的 OpenCORE; 该库提供了对许多流行的音频和视频格式的播放回放和录制功能, 同样包括静态图片文件, 包括MPEG4, H.264, MP3, AAC, AMR, JPG, 和 PNG 等 </li></ul></dd></dl><dl><dd><ul><li><strong>Surface Manager</strong> - 用于管理不同应用对图形显示子系统和2D和3D图形层的访问 </li></ul></dd></dl><dl><dd><ul><li><strong>LibWebCore</strong> - 一个时尚的web浏览器引擎, 为Android浏览器和内嵌的web view提供实现 </li></ul></dd></dl><dl><dd><ul><li><strong>SGL</strong> - 隐藏的2D图形引擎 </li></ul></dd></dl><dl><dd><ul><li><strong>3D libraries</strong> - 基于OpenGL ES 1.0 APIs实现的库; 该库用于3D图形加速或提供高优化的3D软件光栅器 </li></ul></dd></dl><dl><dd><ul><li><strong>FreeType</strong> - 位图和向量模式的字体绘制 </li></ul></dd></dl><dl><dd><ul><li><strong>SQLite</strong> - 一个强大的, 轻量的关系型数据库引擎, 用于所有的应用 </li></ul></dd></dl><a name="Android_.E8.BF.90.E8.A1.8C.E6.97.B6" title="Android_.E8.BF.90.E8.A1.8C.E6.97.B6"></a><h2><span class="mw-headline">Android 运行时 </span></h2><p>Android包含一组核心库, 提供了Java语言核心库内的大部分功能. </p><p><br />每一个Android应用运行在自己的进程里, 用该应用自己的Dalvik 虚拟机实例. Dalvik 可以让一个设备高效的运行很多个VM. Dalvik 虚拟机执行Dalvik Executable (.dex)格式的文件, 该格式的文件经过优化 占用很小的内存. 该虚拟机是基于存储器的, 运行经过Java语言编译器的类, 这些类通过&quot;dx&quot;工具被转换成.dex格式. </p><p><br />Dalvik 虚拟机依赖Linux kernel 来实现一些潜在功能, 例如线程和底层内存管理. </p><a name="Linux_Kernel" title="Linux_Kernel"></a><h2><span class="mw-headline">Linux Kernel </span></h2><p>Android基于Linux version 2.6内核来提供系统的核心服务, 例如安全机制, 内存管理, 进程管理, 网络堆栈和驱动模块. 该内核还扮演着一个虚拟的中间层, 该层介于硬件和其余的软件堆栈. </p><!-- end content -->
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/173233#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Mar 2008 06:44:46 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/173233</link>
        <guid>http://afeitech.javaeye.com/blog/173233</guid>
      </item>
      <item>
        <title>Android 文档的阅读顺序</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/173230" style="color:red;">http://afeitech.javaeye.com/blog/173230</a>&nbsp;
          发表时间: 2008年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="font-size: small"><span style="font-family: 宋体">因为看了看</span><span><a href="http://android-developers.blogspot.com/2007/11/android-first-week.html" target="_blank"><span style="color: #006699; text-decoration: none; text-underline: none"><span style="font-family: Times New Roman">Android Blog</span></span></a><span style="font-family: Times New Roman">, </span></span><span style="font-family: 宋体">在最新的文章里面介绍了几篇文章，其中一篇是</span><span><span style="font-family: Times New Roman">&lt;&lt;</span><a href="http://www.linuxdevices.com/articles/AT9900056470.html" target="_blank"><span style="color: #006699; font-family: 宋体; text-decoration: none; text-underline: none"><span>以开发者的眼光来看</span></span><span style="color: #006699; text-decoration: none; text-underline: none"><span style="font-family: Times New Roman">Android SDK</span></span></a><span style="font-family: Times New Roman">&gt;&gt;</span></span><span style="font-family: 宋体">，作者在其中分析了的关于</span><span><span style="font-family: Times New Roman">DOC</span></span><span style="font-family: 宋体">的阅读顺序引起了我的兴趣，确实，那么多的文档，应该怎么看呢？哪些是必须先弄明白的？哪些应该先知道个大概，今后引用的时候再细细阅读？现在简要的介绍一下<span class="ttag">原作者</span>的观点，希望能帮上你的忙。</span></span><span><br /><br /><span style="font-size: small; font-family: Times New Roman">1. </span></span><span style="font-family: 宋体"><span style="font-size: small">首先当然是要知道，</span></span><span><a href="http://code.google.com/android/what-is-android.html" target="_blank"><span style="font-size: small"><span style="color: #006699; font-family: 宋体; text-decoration: none; text-underline: none"><span>什么是</span></span><span style="color: #006699; text-decoration: none; text-underline: none"><span style="font-family: Times New Roman">Android</span></span><span style="color: #006699; font-family: 宋体; text-decoration: none; text-underline: none"><span>？</span></span></span></a><br /><span style="font-size: small; font-family: Times New Roman">2. </span></span><span style="font-size: small"><span style="font-family: 宋体">读一下</span><span style="font-family: Arial"><a href="http://code.google.com/android/intro/anatomy.html" target="_blank"><span style="color: #006699">Anatomy of an Android Application</span></a></span><span><span style="font-family: Times New Roman"> </span></span><span style="font-family: 宋体">能够知道一个</span><span><span style="font-family: Times New Roman">Android application </span></span><span style="font-family: 宋体">中到底都有些什么东西</span></span><span><br /><span style="font-size: small; font-family: Times New Roman">3.&nbsp;&nbsp;</span></span><span style="font-size: small"><span style="font-family: 宋体">接着可以读一下</span><span><span style="font-family: Times New Roman"> </span></span><span style="font-family: Arial"><a href="http://code.google.com/android/intro/tools.html" target="_blank"><span style="color: #006699">Development Tools</span></a> </span><span style="font-family: 宋体">文档</span></span><span><br /><span style="font-size: small; font-family: Times New Roman">4.&nbsp;&nbsp;</span></span><span style="font-family: 宋体"><span style="font-size: small">然后可以看一下关于什么周期的文章</span></span><span style="font-family: Arial"><span style="font-size: small"> </span><span><a href="http://code.google.com/android/intro/lifecycle.html" target="_blank"><span style="color: #006699"><span style="font-size: small">Lifecycle of an Android Application</span></span></a><br /><span style="font-size: small">5. </span></span></span><span style="font-size: small"><span style="font-family: 宋体">现在可以动手了，玩玩</span><span style="font-family: Arial">hello world </span><span style="font-family: 宋体">吧，</span></span><span style="font-family: Arial"><a href="http://code.google.com/android/intro/hello-android.html" target="_blank"><span style="color: #006699"><span style="font-size: small">Hello Android</span></span></a><br /><span style="font-size: small">6. </span></span><span style="font-size: small"><span style="font-family: 宋体">回去读一下</span><span style="font-family: Arial"> <span><a href="http://code.google.com/android/intro/installing.html" target="_blank"><span style="color: #006699">Installing the SDK</span></a></span></span><span style="font-family: 宋体">文档，再这篇文章的后半部分讲了很多关于</span><span style="font-family: Arial">Debug</span><span style="font-family: 宋体">的功能和技巧</span></span><span style="font-family: Arial"><br /><span style="font-size: small">7. </span></span><span style="font-size: small"><span style="font-family: 宋体">开始</span><span style="font-family: Arial">Notepad Application </span><span style="font-family: 宋体">的制作和学习吧，如果你真正弄懂了关于这个应用程序的</span><span style="font-family: Arial">4</span><span style="font-family: 宋体">个练习，你已经从菜鸟开始转向高手喽。</span></span><span style="font-family: Arial"><br /><span style="font-size: small">8. </span><a href="http://code.google.com/android/devel/index.html" target="_blank"><span style="color: #006699"><span style="font-size: small">Developing Android Applications</span></span></a><span style="font-size: small"> </span></span><span style="font-size: small"><span style="font-family: 宋体">花了很多时间来介绍更多的细节，包括如何实现</span><span style="font-family: Arial">UI</span><span style="font-family: 宋体">，数据存储和读取，安全问题等</span></span><span style="font-family: Arial"><br /><span style="font-size: small">9. </span></span><span style="font-size: small"><span style="font-family: 宋体">最后，你现在可以自由的漫步在</span><span style="font-family: Arial">links</span><span style="font-family: 宋体">中了，找你感兴趣的读读吧。</span></span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/173230#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Mar 2008 06:36:44 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/173230</link>
        <guid>http://afeitech.javaeye.com/blog/173230</guid>
      </item>
      <item>
        <title>Android 精品文章一锅端</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/173229" style="color:red;">http://afeitech.javaeye.com/blog/173229</a>&nbsp;
          发表时间: 2008年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: medium"><span style="color: red"><div style="text-align: center">以下是博主收集的Android 精品文章</div></span></span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/173229#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Mar 2008 06:23:45 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/173229</link>
        <guid>http://afeitech.javaeye.com/blog/173229</guid>
      </item>
      <item>
        <title>NetBeans IDE 6.0 下载及中文文档</title>
        <author>afeitech</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afeitech.javaeye.com">afeitech</a>&nbsp;
          链接：<a href="http://afeitech.javaeye.com/blog/173217" style="color:red;">http://afeitech.javaeye.com/blog/173217</a>&nbsp;
          发表时间: 2008年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>关于 NetBeans IDE 6.0 的最新的中文文档，其中包括发行说明，安装说明，学习教程等。</p><p>&nbsp;</p><p><a href="http://zh-cn.netbeans.org/kb/60/index.html" target="_blank">NetBeans IDE 6.0 中文文档</a></p><p>&nbsp;</p><p><a href="http://zh-cn.netbeans.org/download/6.0/ml/netbeans-6.0.1-ml-windows.exe" target="_blank">下载NetBeans IDE 6.0</a></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://afeitech.javaeye.com/blog/173217#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Mar 2008 00:20:50 +0800</pubDate>
        <link>http://afeitech.javaeye.com/blog/173217</link>
        <guid>http://afeitech.javaeye.com/blog/173217</guid>
      </item>
  </channel>
</rss>