﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-小菜毛毛技术分享-随笔分类-andriod</title><link>http://www.blogjava.net/caizh2009/category/45317.html</link><description>与大家共同成长</description><language>zh-cn</language><lastBuildDate>Fri, 17 Dec 2010 22:27:11 GMT</lastBuildDate><pubDate>Fri, 17 Dec 2010 22:27:11 GMT</pubDate><ttl>60</ttl><item><title>Android获取Contact Number的例子（2.0系统以前的获取方式）</title><link>http://www.blogjava.net/caizh2009/archive/2010/12/17/341010.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Fri, 17 Dec 2010 09:45:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/12/17/341010.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/341010.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/12/17/341010.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/341010.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/341010.html</trackback:ping><description><![CDATA[<ol class="dp-j" start="1">
    <li>String[]&nbsp;projection&nbsp;=&nbsp;<span class="keyword">new&nbsp;String[]&nbsp;{&nbsp;&nbsp;</span></li>
    <li>People._ID,&nbsp;&nbsp;</li>
    <li>People.NAME,&nbsp;&nbsp;</li>
    <li>People.NUMBER,&nbsp;&nbsp;</li>
    <li>};&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li><span class="comment">//&nbsp;Get&nbsp;the&nbsp;base&nbsp;URI&nbsp;for&nbsp;People&nbsp;table&nbsp;in&nbsp;Contacts&nbsp;content&nbsp;provider.&nbsp;&nbsp;</span></li>
    <li><span class="comment">//&nbsp;which&nbsp;is:&nbsp;content://contacts/people/&nbsp;&nbsp;</span></li>
    <li>Uri&nbsp;contactUri&nbsp;=&nbsp;People.CONTENT_URI;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li><span class="comment">//&nbsp;Best&nbsp;way&nbsp;to&nbsp;retrieve&nbsp;a&nbsp;query;&nbsp;returns&nbsp;a&nbsp;managed&nbsp;query.&nbsp;&nbsp;</span></li>
    <li>Cursor&nbsp;peopleCursor&nbsp;=&nbsp;managedQuery&nbsp;(contactUri,&nbsp;&nbsp;</li>
    <li>projection,&nbsp;<span class="comment">//Which&nbsp;columns&nbsp;to&nbsp;return.&nbsp;&nbsp;</span></li>
    <li><span class="keyword">null,&nbsp;<span class="comment">//&nbsp;WHERE&nbsp;clause--we&nbsp;won't&nbsp;specify.</span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">null,&nbsp;<span class="comment">//&nbsp;Selection&nbsp;Args??</span>&nbsp;&nbsp;</span></li>
    <li>People.DEFAULT_SORT_ORDER);&nbsp;<span class="comment">//&nbsp;Order-by&nbsp;name&nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li><span class="comment">//&nbsp;go&nbsp;to&nbsp;the&nbsp;beginning&nbsp;of&nbsp;the&nbsp;list&nbsp;&nbsp;</span></li>
    <li>peopleCursor.moveToFirst();&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li><span class="comment">//&nbsp;So,&nbsp;here&nbsp;we&nbsp;have&nbsp;a&nbsp;contact.&nbsp;We&nbsp;need&nbsp;to&nbsp;get&nbsp;the&nbsp;contact&nbsp;ID&nbsp;(_id)&nbsp;then&nbsp;&nbsp;</span></li>
    <li><span class="comment">//&nbsp;build&nbsp;the&nbsp;Uri&nbsp;to&nbsp;get&nbsp;the&nbsp;phones&nbsp;section&nbsp;of&nbsp;that&nbsp;user's&nbsp;record&nbsp;&nbsp;</span></li>
    <li><span class="comment">//&nbsp;which&nbsp;is&nbsp;a&nbsp;subdirectory&nbsp;of&nbsp;a&nbsp;contact&nbsp;record&nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li><span class="keyword">long&nbsp;personId&nbsp;=&nbsp;peopleCursor.getLong(peopleCursor.getColumnIndex(<span class="string">"_id"</span>));&nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>Uri&nbsp;personUri&nbsp;=&nbsp;ContentUris.withAppendedId(contactUri,&nbsp;personId&nbsp;);&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li><span class="comment">//&nbsp;So&nbsp;now&nbsp;the&nbsp;URL&nbsp;looks&nbsp;like:&nbsp;content://contacts/people/_id(where&nbsp;the&nbsp;actual&nbsp;id&nbsp;of&nbsp;the&nbsp;record&nbsp;is&nbsp;here)&nbsp;&nbsp;</span></li>
    <li>Uri&nbsp;phoneUri=&nbsp;&nbsp;</li>
    <li>Uri.withAppendedPath(personUri,&nbsp;Contacts.People.Phones.CONTENT_DIRECTORY);&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li><span class="comment">//&nbsp;Now&nbsp;the&nbsp;URL&nbsp;looks&nbsp;like:&nbsp;content://contacts/people/_id/phones&nbsp;(where&nbsp;phones&nbsp;is&nbsp;literally&nbsp;"phones")&nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li><span class="comment">//&nbsp;Now&nbsp;get&nbsp;all&nbsp;the&nbsp;phone&nbsp;numbers&nbsp;for&nbsp;this&nbsp;contact&nbsp;&nbsp;</span></li>
    <li>Cursor&nbsp;phonesCursor&nbsp;=&nbsp;managedQuery(phoneUri,&nbsp;&nbsp;</li>
    <li><span class="keyword">null,&nbsp;&nbsp;</span></li>
    <li><span class="keyword">null,&nbsp;&nbsp;</span></li>
    <li><span class="keyword">null,&nbsp;&nbsp;</span></li>
    <li>Phones.DEFAULT_SORT_ORDER);&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li><span class="comment">//&nbsp;We&nbsp;now&nbsp;have&nbsp;a&nbsp;cursor&nbsp;for&nbsp;all&nbsp;the&nbsp;phone&nbsp;numbers&nbsp;for&nbsp;that&nbsp;User&nbsp;ID&nbsp;&nbsp;</span></li>
    <li><span class="comment">//&nbsp;go&nbsp;to&nbsp;the&nbsp;beginning&nbsp;of&nbsp;the&nbsp;phone&nbsp;list.&nbsp;&nbsp;</span></li>
    <li>phonesCursor.moveToFirst(); &nbsp;&nbsp;</li>
</ol>
<img src ="http://www.blogjava.net/caizh2009/aggbug/341010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-12-17 17:45 <a href="http://www.blogjava.net/caizh2009/archive/2010/12/17/341010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android 2.2 获取联系人，电话，并拨号</title><link>http://www.blogjava.net/caizh2009/archive/2010/12/17/341002.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Fri, 17 Dec 2010 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/12/17/341002.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/341002.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/12/17/341002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/341002.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/341002.html</trackback:ping><description><![CDATA[<h1 class="title_txt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0.5em; padding-left: 1.5em; font-size: 15px; font-family: 'Microsoft yahei', verdana, sans-serif; border-bottom-width: 2px; border-bottom-style: solid; border-bottom-color: #dcdcdc; line-height: 18px; "><img src="http://blog.csdn.net/images/authorship.gif" border="0" width="15" height="15" alt="原创" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: -20px; " />&nbsp; android 2.2 获取联系人，电话，并拨号&nbsp;<cite class="fav_csdnstylebykimi" style="font-style: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 5px; display: inline; text-decoration: none; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://blog.csdn.net/happyhell/archive/2010/07/05/5714108.aspx" class="fav_csdnstylebykimi" title="收藏到我的网摘中，并分享给我的朋友" style="text-decoration: none; color: #336699; font: normal normal normal 12px/normal Tahoma, sans-serif; padding-top: 1px; padding-right: 25px; padding-bottom: 1px; padding-left: 10px; background-image: url(http://blog.csdn.net/images/share-add.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; background-position: 0px 0px; background-repeat: no-repeat no-repeat; ">收藏</a></cite></h1>
<div class="blogstory" style="float: left; width: 923px; font-size: 14px; line-height: 21px; font-family: verdana, sans-serif; ">
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">该demo是第一次基于android开发。</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">主要功能有： 读取联系人姓名、号码，并lisetview 显示，获取listview数据，并发短信、或者拨号</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">package com.android.hello;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">import android.app.Activity;<br />
import android.content.Intent;&nbsp;&nbsp;&nbsp;<br />
import android.database.Cursor;<br />
import android.graphics.Color;&nbsp;&nbsp;&nbsp;<br />
import android.net.Uri;&nbsp;&nbsp;&nbsp;<br />
import android.os.Bundle;&nbsp;<br />
import android.telephony.PhoneNumberUtils;&nbsp;<br />
import android.util.Log;&nbsp;&nbsp;&nbsp;<br />
import android.view.View;&nbsp;&nbsp;&nbsp;<br />
import android.widget.AdapterView;&nbsp;&nbsp;&nbsp;<br />
import android.widget.LinearLayout;&nbsp;&nbsp;&nbsp;<br />
import android.widget.ListAdapter;&nbsp;&nbsp;&nbsp;<br />
import android.widget.ListView;<br />
import android.widget.RelativeLayout;<br />
import android.widget.TextView;<br />
import android.widget.Toast;&nbsp;<br />
import android.provider.ContactsContract;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">import java.util.ArrayList;&nbsp;&nbsp;&nbsp;<br />
import java.util.HashMap;<br />
import android.widget.SimpleAdapter;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">@SuppressWarnings("deprecation")<br />
public class hello extends Activity {<br />
&nbsp;&nbsp;&nbsp; /** Called when the activity is first created. */<br />
&nbsp;&nbsp; // @SuppressWarnings("deprecation")<br />
//&nbsp;@Override<br />
&nbsp;//&nbsp;&nbsp;<br />
&nbsp;private static final String TAG="App";&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; ListView listView;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; ListAdapter adapter;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; /** Called when the activity is first created. */&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; @Override&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; public void onCreate(Bundle savedInstanceState) {&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.onCreate(savedInstanceState);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // setContentView(R.layout.main);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LinearLayout linearLayout=new LinearLayout(this);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; linearLayout.setOrientation(LinearLayout.VERTICAL);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; linearLayout.setBackgroundColor(Color.BLACK);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LinearLayout.LayoutParams param=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listView=new ListView(this);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listView.setBackgroundColor(Color.BLACK);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; linearLayout.addView(listView,param);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setContentView(linearLayout);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //生成动态数组，加入数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArrayList&lt;HashMap&lt;String, Object&gt;&gt; listItem = new ArrayList&lt;HashMap&lt;String, Object&gt;&gt;();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArrayList&lt;HashMap&lt;String, Object&gt;&gt; listItemRead = new ArrayList&lt;HashMap&lt;String, Object&gt;&gt;();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (cursor.moveToNext())&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;HashMap&lt;String, Object&gt; map = new HashMap&lt;String, Object&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;String phoneName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;map.put("ItemTitle", phoneName);//电话姓名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (hasPhone.compareTo("1") == 0)&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,null, null);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (phones.moveToNext())&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String phoneTpye = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put("ItemText", phoneNumber); // 多个号码如何处理<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log.d(TAG,"testNum="+ phoneNumber + "type:"+phoneTpye);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phones.close();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId,null, null);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (emails.moveToNext())&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String emailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String emailType = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log.d(TAG,"testNum="+ emailAddress + "type:"+emailType);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emails.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listItem.add(map);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //生成适配器的Item和动态数组对应的元素&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SimpleAdapter listItemAdapter = new SimpleAdapter(this,listItem,//数据源&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android.R.layout.simple_list_item_2,//ListItem的XML实现&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //动态数组与ImageItem对应的子项&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new String[] {"ItemTitle", "ItemText"},&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ImageItem的XML文件里面的一个ImageView,两个TextView ID&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new int[] {android.R.id.text1,android.R.id.text2}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listView.setAdapter(listItemAdapter);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cursor.close();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //listView.setEmptyView(findViewById(R.id.empty));&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void onItemSelected(AdapterView&lt;?&gt; arg0, View arg1,&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int arg2, long arg3) {&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //openToast("滚动到："+arg0.getSelectedItemId());&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //短信发送&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;setTitle("选择"+arg2+"项目");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;openToast("选择"+arg0.getSelectedItemId()+"项目");<br />
&nbsp;&nbsp;&nbsp;&nbsp;RelativeLayout lr = (RelativeLayout) arg1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;TextView mText = (TextView) lr.getChildAt(1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;openToast(mText.getText().toString());</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp;String number = mText.getText().toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Log.d(TAG, "number=" + number);<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 判断电话号码的有效性<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (PhoneNumberUtils.isGlobalPhoneNumber(number)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Intent intent = new Intent(Intent.ACTION_SENDTO, Uri<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.parse("smsto://" + number));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intent.putExtra("sms_body", "The SMS text");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startActivity(intent);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void onNothingSelected(AdapterView&lt;?&gt; arg0) {&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){&nbsp;&nbsp;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp;public void onItemClick(AdapterView&lt;?&gt; arg0, View arg1,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int position, long arg3) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;// TODO Auto-generated method stub<br />
&nbsp;&nbsp;&nbsp;&nbsp;// openToast("Click"+Integer.toString(position+1)+"项目");<br />
&nbsp;&nbsp;&nbsp;&nbsp;RelativeLayout lr = (RelativeLayout) arg1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;TextView mText = (TextView) lr.getChildAt(1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;openToast(mText.getText().toString());</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp;String number = mText.getText().toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Log.d(TAG, "number=" + number);<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 判断电话号码的有效性<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (PhoneNumberUtils.isGlobalPhoneNumber(number)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Intent intent = new Intent(Intent.ACTION_DIAL, Uri<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.parse("tel://" + number));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startActivity(intent);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;});<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; private void openToast(String str){&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Toast.makeText(this,str,Toast.LENGTH_SHORT).show();&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;<br />
}&nbsp;</p>
</div>
<img src ="http://www.blogjava.net/caizh2009/aggbug/341002.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-12-17 16:58 <a href="http://www.blogjava.net/caizh2009/archive/2010/12/17/341002.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android中添加Admob广告（转</title><link>http://www.blogjava.net/caizh2009/archive/2010/12/10/340283.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Fri, 10 Dec 2010 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/12/10/340283.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/340283.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/12/10/340283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/340283.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/340283.html</trackback:ping><description><![CDATA[<p>花了整整一天时间，研究怎么通过在<font style="background-color: #00ffff;">Android</font>应用程序中添加Admob广告来赚钱。网上也有些教程，不过说得不够详细，自己还得花时间摸索。为了让后来者能更快开始Admob广告赚钱，所以写个详细一点的教程，供大家参考。</p>
<p>例子工程源码下载地址：(建议使用浏览器自带的下载工具下载)<a href="http://cid-cb78b387364ae9a7.skydrive.live.com/browse.aspx/.Public/%e8%bd%af%e4%bb%b6/Andoroid">http://cid-cb78b387364ae9a7.skydrive.live.com/browse.aspx/.Public/%e8%bd%af%e4%bb%b6/Andoroid</a><br />
当然，我也参考了一些网上的资料，主要有：</p>
<p>AdMob：在<font style="background-color: #00ffff;">android</font>应用中嵌入广告的方案<br />
如何在<font style="background-color: #00ffff;">Android</font> Market赚钱 part 2 - 免费app附带广告<br />
Publisher Starter Kit<br />
面向开发者 Wiki 的 AdMob</p>
<p>好了，现在让我从头开始说起&#8230;&#8230;在这之前，你不需要有任何的帐号，唯一需要的就是有一个有效的email邮箱。只要按照下面的步骤一步步来，你就能通过将Admob的广告插到自己的程序中赚钱啦！</p>
<p>首先，当然是需要注册一个Admob的帐号。Admob的主页是：<a href="http://www.admob.com/">http://www.admob.com/</a> 。 当然，如果你对于浏览英文网页还有些障碍的话，可以登录中文网站：<a href="http://zhcn.admob.com/">http://zhcn.admob.com/</a>
。如果网站的文字还是英文，你可以在网站主页的右下角的&#8220;Language&#8221;处，选择&#8220;中文（简体）&#8221;。点击进入注册页面后，有一些栏目需要填写，不要太
过疑虑，就像你注册一个论坛一样，随便填下就好了。最关键的是保证填写的email地址有效，另外就是填上姓名，选择语言。帐户类型我选择的&#8220;不确定&#8221;，
语言&#8220;中文（简体）&#8221;～ 提交注册申请之后，不久你就会收到用于确认并激活帐号的电子邮件，点击激活链接，就可以了激活你的Admob帐号了～</p>
<p>第二步就是设置你的<font style="background-color: #00ffff;">Android</font>应
用程序信息，并获得Admob的插入代码。登录你的Admob帐号后，在主页的左上方（Logo上面）点击&#8220;Marketplace（手机广告市场）&#8221;，
进入页面后，在&#8220;Sites&amp;Apps（站点和应用程序）&#8221;标签下，点击&#8220;Add Site/App&#8221;。选择我们熟悉的图标——" <font style="background-color: #00ffff;">Android</font> App &#8221; 。这时会出现需要你填写一个&#8220;详细信息&#8221;，随便填上一些信息。（不要太过在意现在填写的东西，因为这些以后都是可以修改的）。比如&#8220;<font style="background-color: #00ffff;">Android</font> Package URL&#8221; 我到现在都还没有填写，描述之类的，想写就写点吧。填好详细信息后，点击&#8220;继续&#8221;，就可以到AdMob <font style="background-color: #00ffff;">Android</font> SDK 的下载页面了。下载这个SDK（当然，这个很重要）。</p>
<p>The AdMob <font style="background-color: #00ffff;">Android</font> SDK includes:</p>
<p>README: Get started with AdMob <font style="background-color: #00ffff;">Android</font> ads! <br />
AdMob Jar file: Required for publishing ads. Follow the documentation in
javadoc/index.html and drop the AdMob Jar file into your project. <br />
Sample Projects: Examples of AdMob <font style="background-color: #00ffff;">Android</font> ads shown in the LunarLander application.</p>
<p>第三步获取你的应用程序对应的Publisher ID。在下载页面点击"Go to Sites/Apps"就可以到你应用程序的管理界面了。这时你会发现在这个页面醒目的位置会有一个叫你填写详细信息的提示：</p>
<p>在我们发送任何有待收入之前，您需要填写技术联系详细信息和付款首选项。</p>
<p>我们暂时可以不用管它，因为钱是会存在我们的Admob的账户上的，等我们需要提现的时候，或者你想填的时候再填就可以了。在下面的列表中，选择你
的应用程序并进入。这个界面就是你的应用程序广告的管理界面了，里面有比较多的功能，以后可以慢慢了解，现在我们只需要知道两个东西，一个是发布者
ID（Publisher ID），一个是你程序的状态。Publisher
ID是一个15个字符的字符串，而你程序的状态现在应该还是不活动（Inactive）。我们下面要做的就是怎么让它变为Active。</p>
<p> </p>
<p>第四步代码编写——在你的应用程序中插入Admob广告。经过上面的步骤，我们在网站上的设置就告一个段落了，现在我们终于要进入主题了，如何在自己的<font style="background-color: #00ffff;">Android</font>应用程序中插入Admob广告。如果你不健忘的话，一定还记得我们之前下载的那个AdMob <font style="background-color: #00ffff;">Android</font> SDK 。解压它，看看里面有些什么东西。这里面最重要的就是那个名为&#8220;admob-sdk-<font style="background-color: #00ffff;">android</font>.jar&#8221;的包啦，Admob将如何把广告加载到<font style="background-color: #00ffff;">Android</font>应用程序中的代码集成在这个包里，我们编写程序的时候就需要将这个包导入到我们的工程里面去。另外，解压出来的文件夹中还有一个名为&#8220;javadoc&#8221;的文件夹，打开它里面的index.html。它是关于Admob <font style="background-color: #00ffff;">Android</font> SDK的帮助文档，在Package 下的Setup下，有详细完整的在自己的应用程序中插入广告的方法介绍，在这里我就偷懒，引用一下～</p>
<p><br />
Including the Jar<br />
Add the Jar file included with the SDK to your <font style="background-color: #00ffff;">Android</font>
project as an external library. In your project's root directory create
a subdirectory libs (this will already be done for you if you used <font style="background-color: #00ffff;">Android</font>'s activitycreator). Copy the AdMob Jar file into that directory. For Eclipse projects:</p>
<p>Go to the Properties of your project (right-click on your project from the Package Explorer tab and select Properties) <br />
Select "Java Build Path" from left panel <br />
Select "Libraries" tab from the main window <br />
Click on "Add JARs..." <br />
Select the JAR copied to the libs directory <br />
Click "OK" to add the SDK to your <font style="background-color: #00ffff;">android</font> project</p>
<p>注意：需要首先在你工程的根目录下新建一个叫做&#8220;libs&#8221;的文件夹，并把之前所说的最重要的东西&#8220;admob-sdk-<font style="background-color: #00ffff;">android</font>.jar&#8221;复制到里面。</p>
<p><br />
<font style="background-color: #00ffff;">Android</font>Manifest.xml</p>
<p>Your AdMob publisher ID was given to you when creating your publisher account on <a href="http://www.admob.com/">www.admob.com</a>
before downloading this code. It is a 15-character code like
a1496ced2842262. Just before the closing &lt;/application&gt; tag add a
line to set your publisher ID:</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;!-- The application's publisher ID assigned by AdMob --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;meta-data <font style="background-color: #00ffff;">android</font>:value="YOUR_ID_HERE" <font style="background-color: #00ffff;">android</font>:name="ADMOB_PUBLISHER_ID" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;/application&gt;<br />
Set any permissions not already included just before the closing &lt;/manifest&gt; tag: <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;!-- AdMob SDK permissions --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;uses-permission <font style="background-color: #00ffff;">android</font>:name="<font style="background-color: #00ffff;">android</font>.permission.INTERNET" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;uses-permission <font style="background-color: #00ffff;">android</font>:name="<font style="background-color: #00ffff;">android</font>.permission.ACCESS_COARSE_LOCATION" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;/manifest&gt;</p>
<p>Only the INTERNET permission is required. Setting
ACCESS_COARSE_LOCATION (and/or ACCESS_FINE_LOCATION) allows narrowly
geo-targeted ads be shown.</p>
<p>这里需要注意的是，&lt;meta-data <font style="background-color: #00ffff;">android</font>:value="YOUR_ID_HERE" <font style="background-color: #00ffff;">android</font>:name="ADMOB_PUBLISHER_ID"
/&gt;中，我们只需要改的是"YOUR_ID_HERE"。这里需要你填上的ID就是我们之前在Admob网站我们的应用程序管理页面上看到的
Publisher ID，而name="ADMOB_PUBLISHER_ID"是不应该改的。程序需要这个Key来查找对应的Value。</p>
<p>attrs.xml<br />
The attrs.xml file specifies custom AdView attributes in XML layout
files. If your application does not already have an
/res/values/attrs.xml file then create one and copy-and-paste the
following into it. If you do have that file then just add the
declare-styleable element:</p>
<p> </p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;resources&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;declare-styleable name="com.admob.<font style="background-color: #00ffff;">android</font>.ads.AdView"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;attr name="testing" format="boolean" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;attr name="backgroundColor" format="color" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;attr name="textColor" format="color" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;attr name="keywords" format="string" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;attr name="refreshInterval" format="integer" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;attr name="isGoneWithoutAd" format="boolean" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;/declare-styleable&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;/resources&gt;</p>
<p>这个，没什么说的。</p>
<p><br />
Placing an AdView in a Layout<br />
AdView widgets can be put into any XML layout now. The first step is to
reference attrs.xml in your layout element by adding an xmlns line that
includes your package name specified in <font style="background-color: #00ffff;">Android</font>Manifest.xml:</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  xmlns:yourapp=http://schemas.<font style="background-color: #00ffff;">android</font>.com/apk/res/yourpackage</p>
<p>For example a simple screen with only an ad on it would look like:</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;LinearLayout <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  xmlns:<font style="background-color: #00ffff;">android</font>="<a href="http://schemas.android.com/apk/res/android">http://schemas.<font style="background-color: #00ffff;">android</font>.com/apk/res/<font style="background-color: #00ffff;">android</font></a>"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  xmlns:admobsdk="<a href="http://schemas.android.com/apk/res/com.admob.android.example">http://schemas.<font style="background-color: #00ffff;">android</font>.com/apk/res/com.admob.<font style="background-color: #00ffff;">android</font>.example</a>"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <font style="background-color: #00ffff;">android</font>:orientation="vertical"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <font style="background-color: #00ffff;">android</font>:layout_width="fill_parent"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <font style="background-color: #00ffff;">android</font>:layout_height="fill_parent"&gt;<br />
&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;com.admob.<font style="background-color: #00ffff;">android</font>.ads.AdView <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <font style="background-color: #00ffff;">android</font>:id="@+id/ad" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <font style="background-color: #00ffff;">android</font>:layout_width="fill_parent" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <font style="background-color: #00ffff;">android</font>:layout_height="wrap_content"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  admobsdk:backgroundColor="#000000"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  admobsdk:textColor="#FFFFFF"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  admobsdk:keywords="<font style="background-color: #00ffff;">Android</font> application"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;/LinearLayout&gt;</p>
<p>这里好像也没什么需要特别注意的，注意加上xmlns，另外知道这里可以设置一个keywords</p>
<p>Test Mode<br />
When you start integrating AdMob ads into your application it is
recommended to use test mode. This always returns the same ad. Normal ad
requests are not deterministic making it harder to be sure the ad view
looks like you want (e.g. ad requests can timeout or may not fill).</p>
<p> </p>
<p>Once the ad shows up as you expect be sure to turn test mode off to get real ads. Never put your application into the <font style="background-color: #00ffff;">Android</font> Market with test mode enabled.</p>
<p> </p>
<p>Test mode can be enabled either by calling
AdManager.setInTestMode(true) or by adding a "admobsdk:testing="true""
property to the ad in your XML layout (where "admobsdk" is the XML
namespace for your application).</p>
<p><br />
设置Test Mode这个很关键，千万别将处于Test Mode的程序发布出去了，那样可赚不了钱啊～！如果在AdView的属性中不加上admobsdk:testing="false"，似乎程序也是不处于Test Mode的，不过最好还是加上吧～</p>
<p>第五步编译运行，并激活程序。编译运行你的程序，在模拟器上就可以看到效果啦～（当然你的模拟器需要能上网，关于怎么让模拟器上网呢？用路由的应该
可以直接上，如果不是用路由，那么可能需要设置下，具体方法大家自己网上搜吧，具体忘了）。如果你的应用程序能显示出广告，那么恭喜你，你的应用程序很快
就会在Admob上被激活了（需要一定的时间，我的好像花了一个小时不到）！</p>
<p>第六步在Admob网站上查看应用程序赚了多少钱～&#8220;手机广告市场&#8221;—&gt;&#8220;报告&#8221;—&gt;&#8220;站点和应用程序报告&#8221;。选择你的应用程序，然后点击页面最下面的&#8220;创建报告&#8221;～ OK，赚钱啦～</p>
<p>最后，我把我自己写的一个例子工程上传上来，大家可以下载来参考下。另外，我的工程将广告作为移动的，并且改变了它默认的宽度和背景，希望对如何在应用程序中摆放广告，起到一个抛砖引玉的作用。效果图如下（哈哈，在模拟器跑的～）：</p>
<p><br />
</p>
<p><br />
</p>
<p>
<h3>1.http://www.admob.com/注册一个帐号，</h3>
<p>添加Add Mobile Site/app，输入相关信息后，提交完成，</p>
<p>下载Android平台使用的JAR，查看发布者 ID。</p>
<h3>2.然后将JAR添加到你的项目中</h3>
<p>Properties-&gt;Java Build Path-&gt;Libraries-&gt;Add JARs&#8230;-&gt;Select the JAR-&gt;OK</p>
<h3>3.编辑AndroidManifest.xml</h3>
<p>application节点中添加</p>
<p>&lt;!&#8211; The application&#8217;s publisher ID assigned by AdMob &#8211;&gt;</p>
<p>&lt;meta-data android:value=&#8221;a14ae1ce0357305&#8243; android:name=&#8221;ADMOB_PUBLISHER_ID&#8221; /&gt;</p>
<p>manifest节点添加权限申请</p>
<p>&lt;!&#8211; AdMob SDK permissions &#8211;&gt;</p>
<p>&lt;uses-permission android:name=&#8221;android.permission.INTERNET&#8221; /&gt;</p>
<h3>4.添加attrs.xml</h3>
<p>/res/values/attrs.xml</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;?&gt;</p>
<p>&lt;resources&gt;</p>
<p>&lt;declare-styleable name=&#8221;com.admob.android.ads.AdView&#8221;&gt;</p>
<p>&lt;attr name=&#8221;testing&#8221; format=&#8221;boolean&#8221; /&gt;</p>
<p>&lt;attr name=&#8221;backgroundColor&#8221; format=&#8221;color&#8221; /&gt;</p>
<p>&lt;attr name=&#8221;textColor&#8221; format=&#8221;color&#8221; /&gt;</p>
<p>&lt;attr name=&#8221;keywords&#8221; format=&#8221;string&#8221; /&gt;</p>
<p>&lt;attr name=&#8221;refreshInterval&#8221; format=&#8221;integer&#8221; /&gt;</p>
<p>&lt;attr name=&#8221;isGoneWithoutAd&#8221; format=&#8221;boolean&#8221; /&gt;</p>
<p>&lt;/declare-styleable&gt;</p>
<p>&lt;/resources&gt;</p>
<h3>5.添加广告组件</h3>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;?&gt;</p>
<p>&lt;LinearLayout xmlns:android=&#8221;http://schemas.android.com/apk/res/android&#8221;</p>
<p>xmlns:admobsdk=&#8221;http://schemas.android.com/apk/res/com.moandroid.livesports&#8221;</p>
<p>android:orientation=&#8221;vertical&#8221;</p>
<p>android:layout_width=&#8221;fill_parent&#8221;</p>
<p>android:layout_height=&#8221;fill_parent&#8221;</p>
<p>&gt;</p>
<p>&lt;TextView</p>
<p>android:layout_width=&#8221;fill_parent&#8221;</p>
<p>android:layout_height=&#8221;wrap_content&#8221;</p>
<p>android:text=&#8221;@string/hello&#8221;</p>
<p>/&gt;</p>
<p>&lt;com.admob.android.ads.AdView</p>
<p>android:id=&#8221;@+id/ad&#8221;</p>
<p>android:layout_width=&#8221;fill_parent&#8221;</p>
<p>android:layout_height=&#8221;wrap_content&#8221;</p>
<p>admobsdk:backgroundColor=&#8221;#000000&#8243;</p>
<p>admobsdk:textColor=&#8221;#FFFFFF&#8221;</p>
<p>admobsdk:keywords=&#8221;Android application&#8221;</p>
<p>admobsdk:refreshInterval=&#8221;60&#8243;</p>
<p>/&gt;</p>
<p>&lt;/LinearLayout&gt;</p>
<h3>6.显示效果</h3>
<p>为免费app嵌入Admob广告，进而获得广告收入。</p>
<p><img class="alignnone size-full wp-image-1159" src="http://www.moandroid.com/wp-content/uploads/2009/10/adm.png" alt="adm" height="205" width="320" /></p>
</p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/340283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-12-10 17:42 <a href="http://www.blogjava.net/caizh2009/archive/2010/12/10/340283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>区分Activity的四种加载模式</title><link>http://www.blogjava.net/caizh2009/archive/2010/12/10/340227.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Fri, 10 Dec 2010 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/12/10/340227.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/340227.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/12/10/340227.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/340227.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/340227.html</trackback:ping><description><![CDATA[http://marshal.easymorse.com/archives/2950
<div>
<p>在多Activity开发中，有可能是自己应用之间的Activity跳转，或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例，而不是产生大量重复的Activity。</p>
<p>这需要为Activity配置特定的加载模式，而不是使用默认的加载模式。</p>
<h4>加载模式分类及在哪里配置</h4>
<p>Activity有四种加载模式：</p>
<ul>
    <li>standard</li>
    <li>singleTop</li>
    <li>singleTask</li>
    <li>singleInstance</li>
</ul>
<p>设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性：</p>
<blockquote>
<p>&lt;activity android:name="ActB" <strong>android:launchMode</strong>="singleTask"&gt;&lt;/activity&gt;</p>
</blockquote>
<p>也可以在Eclipse ADT中图形界面中编辑：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image54.png"><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb54.png" border="0" height="144" width="498" /></a> </p>
<p>
</p>
<p>区分Activity的加载模式，通过示例一目了然。这里编写了一个Activity A（ActA）和Activity B（ActB）循环跳转的例子。对加载模式修改和代码做稍微改动，就可以说明四种模式的区别。</p>
<h4>standard</h4>
<p>首先说standard模式，也就是默认模式，不需要配置launchMode。先只写一个名为ActA的Activity：</p>
<blockquote>
<p>package com.easymorse.activities; </p>
<p>import android.app.Activity;     <br />
import android.content.Intent;      <br />
import android.os.Bundle;      <br />
import android.view.View;      <br />
import android.view.View.OnClickListener;      <br />
import android.widget.Button;      <br />
import android.widget.LinearLayout;      <br />
import android.widget.TextView; </p>
<p>public class ActA extends Activity {     <br />
&nbsp;&nbsp;&nbsp; /** Called when the activity is first created. */      <br />
&nbsp;&nbsp;&nbsp; @Override      <br />
&nbsp;&nbsp;&nbsp; public void onCreate(Bundle savedInstanceState) {      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.onCreate(savedInstanceState);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextView textView = new TextView(this);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textView.setText(this + "");      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Button button = new Button(this);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; button.setText("go actA");      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; button.setOnClickListener(new OnClickListener() {      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Override      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void onClick(View v) {      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Intent intent = new Intent();      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intent.setClass(ActA.this, ActA.class);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; startActivity(intent);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LinearLayout layout = new LinearLayout(this);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layout.setOrientation(LinearLayout.VERTICAL);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layout.addView(textView);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layout.addView(button);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setContentView(layout);      <br />
&nbsp;&nbsp;&nbsp; }      <br />
}</p>
</blockquote>
<p>例子中都没有用layout，免得看着罗嗦。可见是ActA &#8211;&gt; ActA的例子。在界面中打印出对象的toString值可以根据hash code识别是否创建新ActA实例。</p>
<p>第一个界面：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image55.png"><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb55.png" border="0" height="101" width="244" /></a> </p>
<p>点击按钮后：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image56.png"><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb56.png" border="0" height="114" width="244" /></a> </p>
<p>可以多点几次。发现每次都创建了该Activity的新实例。standard的加载模式就是这样的，intent将发送给新的实例。</p>
<p>现在点Android设备的回退键，可以看到是按照刚才创建Activity实例的倒序依次出现，类似退栈的操作，而刚才操作跳转按钮的过程是压栈的操作。如下图：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image57.png"><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb57.png" border="0" height="233" width="244" /></a> </p>
<h4>singleTop</h4>
<p>singleTop和standard模式，都会将intent发送新的实例（后两种模式不发送到新的实例，如果已经有了的话）。不
过，singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例，则将intent发送给该实例，而不发送给新的实例。</p>
<p>还是用刚才的示例，只需将launchMode改为singleTop，就能看到区别。</p>
<p>运行的时候会发现，按多少遍按钮，都是相同的ActiA实例，因为该实例在栈顶，因此不会创建新的实例。如果回退，将退出应用。</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image58.png"><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb58.png" border="0" height="144" width="244" /></a> </p>
<p>singleTop模式，可用来解决栈顶多个重复相同的Activity的问题。</p>
<p>如果是A Activity跳转到B Activity，再跳转到A Activity，行为就和standard一样了，会在B Activity跳转到A Activity的时候创建A Activity的新实例，因为当时的栈顶不是A Activity实例。</p>
<p>ActA类稍作改动：</p>
<blockquote>
<p>package com.easymorse.activities; </p>
<p>import android.app.Activity;     <br />
import android.content.Intent;      <br />
import android.os.Bundle;      <br />
import android.view.View;      <br />
import android.view.View.OnClickListener;      <br />
import android.widget.Button;      <br />
import android.widget.LinearLayout;      <br />
import android.widget.TextView; </p>
<p>public class ActA extends Activity {     <br />
&nbsp;&nbsp;&nbsp; /** Called when the activity is first created. */      <br />
&nbsp;&nbsp;&nbsp; @Override      <br />
&nbsp;&nbsp;&nbsp; public void onCreate(Bundle savedInstanceState) {      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.onCreate(savedInstanceState);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextView textView = new TextView(this);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textView.setText(this + "");      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Button button = new Button(this);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; button.setText("go actB");      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; button.setOnClickListener(new OnClickListener() {      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Override      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void onClick(View v) {      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Intent intent = new Intent();      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intent.setClass(ActA.this, ActB.class);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; startActivity(intent);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LinearLayout layout = new LinearLayout(this);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layout.setOrientation(LinearLayout.VERTICAL);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layout.addView(textView);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layout.addView(button);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setContentView(layout);      <br />
&nbsp;&nbsp;&nbsp; }      <br />
}</p>
<p>&nbsp;</p>
</blockquote>
<p>ActB类：</p>
<blockquote>
<p>package com.easymorse.activities; </p>
<p>import android.app.Activity;     <br />
import android.content.Intent;      <br />
import android.os.Bundle;      <br />
import android.view.View;      <br />
import android.view.View.OnClickListener;      <br />
import android.widget.Button;      <br />
import android.widget.LinearLayout; </p>
<p>public class ActB extends Activity {     <br />
&nbsp;&nbsp;&nbsp; @Override      <br />
&nbsp;&nbsp;&nbsp; protected void onCreate(Bundle savedInstanceState) {      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.onCreate(savedInstanceState);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Button button=new Button(this);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; button.setText("go actA");      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; button.setOnClickListener(new OnClickListener() {      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Override      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void onClick(View v) {      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Intent intent=new Intent();      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intent.setClass(ActB.this, ActA.class);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; startActivity(intent);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LinearLayout layout=new LinearLayout(this);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layout.addView(button);      <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setContentView(layout);      <br />
&nbsp;&nbsp;&nbsp; }      <br />
}</p>
<p>&nbsp;</p>
</blockquote>
<p>ActB类使用默认（standard）加载，ActA使用singleTop加载。结果类似下图：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image59.png"><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb59.png" border="0" height="211" width="244" /></a> </p>
<p>如果把ActA的加载模式改为standard，情况一样。</p>
<h4>singleTask</h4>
<p>singleTask模式和后面的singleInstance模式都是只创建一个实例的。</p>
<p>当intent到来，需要创建singleTask模式Activity的时候，系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。</p>
<p>把上面singleTop的实例中的ActA的launchMode改为singleTask，ActB的改为standard。那么会发现在ActA界面中按一次按钮：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image60.png"><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb60.png" border="0" height="217" width="244" /></a> </p>
<p>然后在ActB1界面中按按钮，因为ActA是singleTask，会使用原来的ActA1实例。这时候栈内的情况:</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image61.png"><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb61.png" border="0" height="134" width="244" /></a></p>
<p>如果多次按按钮跳转，会发现始终只有ActA1这一个ActA类的实例。 </p>
<h4>singleInstance</h4>
<p>解释singleInstance模式比较麻烦。</p>
<p>首先要说一下Task（任务）的概念。</p>
<p>如果是Swing或者Windows程序，可能有多个窗口可以切换，但是你无法在自己程序中复用人家的窗口。注意是直接复用人家的二进制代码，不是你拿到人家api后的源代码级调用。</p>
<p>Android可以做到，让别人的程序直接复用你的Activity（类似桌面程序的窗口）。</p>
<p>Android为提供这种机制，就引入了Task的概念。Task可以认为是一个栈，可放入多个Activity。比如启动一个应用，那么
Android就创建了一个Task，然后启动这个应用的入口Activity，就是intent-filter中配置为main和launch的那个
（见<a href="http://marshal.easymorse.com/archives/2929" title="一个APK文件部署产生多个应用安装的效果">一个APK文件部署产生多个应用安装的效果</a>）。这个Activity是根（Root）Activity，可能会在它的界面调用其他Activity，这些Activity如果按照上面那三个模式，也会在这个栈（Task）中，只是实例化的策略不同而已。</p>
<p>验证的办法是调用和打印Activity的taskId：</p>
<blockquote>
<p>TextView textView2 = new TextView(this);     <br />
textView2.setText("task id: "+this.getTaskId());</p>
</blockquote>
<p>会发现，无论切换Activity，taskId是相同的。</p>
<p>当然也可以在这个单一的Task栈中，放入别人的Activity，比如google地图，这样用户看过地图按回退键的时候，会退栈回到调用地图的Activity。对用户来说，并不觉得在操作多个应用。这就是Task的作用。</p>
<p>但是，有这样的需求，多个Task共享一个Activity（singleTask是在一个task中共享一个Activity）。</p>
<p>现成的例子是google地图。比如我有一个应用是导游方面的，其中调用的google地图Activity。那么现在我比如按home键，然后到应用列表中打开google地图，你会发现显示的就是刚才的地图，实际上是同一个Activity。</p>
<p>如果使用上面三种模式，是无法实现这个需求的。google地图应用中有多个上下文Activity，比如路线查询等的，导游应用也有一些上下文Activity。在各自应用中回退要回退到各自的上下文Activity中。</p>
<p>singleInstance模式解决了这个问题（绕了这么半天才说到正题）。让这个模式下的Activity单独在一个task栈中。这个栈只有一个Activity。导游应用和google地图应用发送的intent都由这个Activity接收和展示。</p>
<p>这里又有两个问题：</p>
<ul>
    <li>如果是这种情况，多个task栈也可以看作一个应用。比如导游应用启动地图Activity，实际上是在导游应用task栈之上
    singleInstance模式创建的（如果还没有的话，如果有就是直接显示它）一个新栈，当这个栈里面的唯一Activity，地图Activity
    回退的时候，只是把这个栈移开了，这样就看到导游应用刚才的Activity了；</li>
    <li>多个应用（Task）共享一个Activity要求这些应用都没有退出，比如刚才强调要用home键从导游应用切换到地图应用。因为，如果退出导游应用，而这时也地图应用并未运行的话，那个单独的地图Activity（task）也会退出了。</li>
</ul>
<p>如果还是拿刚才的ActA和ActB的示例，可以把ActB的模式改为singleInstance，ActA为standard，如果按一次按钮切换到ActB，看到现象用示意图类似这样：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image62.png"><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb62.png" border="0" height="222" width="244" /></a> </p>
<p>如果是第一次按钮切换到ActB，在ActB在按按钮切换到ActA，然后再回退，示意图是：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image63.png"><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb63.png" border="0" height="166" width="342" /></a> </p>
<p>另外，可以看到两个Activity的taskId是不同的。</p>
</div>
<img src ="http://www.blogjava.net/caizh2009/aggbug/340227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-12-10 10:38 <a href="http://www.blogjava.net/caizh2009/archive/2010/12/10/340227.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>精品Android源码推荐</title><link>http://www.blogjava.net/caizh2009/archive/2010/12/03/339710.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Fri, 03 Dec 2010 04:39:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/12/03/339710.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/339710.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/12/03/339710.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/339710.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/339710.html</trackback:ping><description><![CDATA[<a href="http://g.csdn.net/5163536" title="从零开始Android游戏编程" target="_blank">从零开始Android游戏编程</a><br />
<a href="http://g.csdn.net/5163537" title="五子棋源码" target="_blank">五子棋源码</a><br />
<a href="http://g.csdn.net/5163519" title="Read RSS on OPhone" target="_blank">Read RSS on OPhone</a><br />
<a href="http://g.csdn.net/5163520" title="俄罗斯方块" target="_blank">俄罗斯方块</a><br />
<a href="http://g.csdn.net/5163521" title="空战游戏1945" target="_blank">空战游戏1945</a><br />
<a href="http://g.csdn.net/5163522" title="加速传感器演示" target="_blank">加速传感器演示</a><br />
<a href="http://g.csdn.net/5163523" title="演示如何使用Location和Google Map" target="_blank">演示如何使用Location和Google Map</a><br />
<a href="http://g.csdn.net/5163524" title="个股宝典" target="_blank">个股宝典</a><br />
<a href="http://g.csdn.net/5163525" title="连连看" target="_blank">连连看</a><br />
<a href="http://g.csdn.net/5163496" title="策略游戏——回到战国 android源代码" target="_blank">策略游戏——回到战国 android源代码</a><br />
<a href="http://g.csdn.net/5163497" title="滚屏动作游戏——太空保卫战 android源代码" target="_blank">滚屏动作游戏——太空保卫战 android源代码</a><br />
<a href="http://g.csdn.net/5163498" title="冒险游戏——胜利大逃亡 android源代码" target="_blank">冒险游戏——胜利大逃亡 android源代码</a><br />
<a href="http://g.csdn.net/5163499" title="体育游戏——疯狂足球 android源代码 附件" target="_blank">体育游戏——疯狂足球 android源代码 附件</a><br />
<a href="http://g.csdn.net/5163500" title="水波效应android源码" target="_blank">水波效应android源码</a><br />
<a href="http://g.csdn.net/5163506" title=" Android 下3D赛车游戏" target="_blank"> Android 下3D赛车游戏</a><br />
<a href="http://g.csdn.net/5163507" title="扫雷游戏，android源码，有注解 " target="_blank">扫雷游戏，android源码，有注解 </a><br />
<a href="http://g.csdn.net/5163515" title="MP3切割器" target="_blank">MP3切割器</a><br />
<a href="http://g.csdn.net/5163509" title="Android国际象棋源码" target="_blank">Android国际象棋源码</a><br />
<a href="http://g.csdn.net/5163510" title="旅行记录软件源码" target="_blank">旅行记录软件源码</a><br />
<a href="http://g.csdn.net/5163511" title="DroidReader 源码" target="_blank">DroidReader 源码</a><br />
<a href="http://g.csdn.net/5163512" title="Android下的VOIP客户端源码" target="_blank">Android下的VOIP客户端源码</a><br />
<a href="http://g.csdn.net/5163513" title="Android下的FTP服务器源码" target="_blank">Android下的FTP服务器源码</a><br />
<a href="http://g.csdn.net/5163514" title="Android下俄罗斯方块源码" target="_blank">Android下俄罗斯方块源码</a>
<img src ="http://www.blogjava.net/caizh2009/aggbug/339710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-12-03 12:39 <a href="http://www.blogjava.net/caizh2009/archive/2010/12/03/339710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android高手进阶教程(四)之----Android 中自定义属性(attr.xml,TypedArray)的使用!(转)</title><link>http://www.blogjava.net/caizh2009/archive/2010/11/23/338805.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 23 Nov 2010 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/11/23/338805.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/338805.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/11/23/338805.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/338805.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/338805.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转自：http://blog.csdn.net/Android_Tutor/archive/2010/04/20/5508615.aspx今天我们的教程是根据前面一节扩展进行的，如果你没有看,请点击&nbsp;Android高手进阶教程(三)&nbsp;查看第三课,这样跟容易方便你的理解!在xml 文件里定义控件的属性，我们已经习惯了android:attrs="" ,那么我们能不能定...&nbsp;&nbsp;<a href='http://www.blogjava.net/caizh2009/archive/2010/11/23/338805.html'>阅读全文</a><img src ="http://www.blogjava.net/caizh2009/aggbug/338805.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-11-23 15:22 <a href="http://www.blogjava.net/caizh2009/archive/2010/11/23/338805.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android高手进阶教程(五)之----Android 中LayoutInflater的使用（转）</title><link>http://www.blogjava.net/caizh2009/archive/2010/11/23/338803.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 23 Nov 2010 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/11/23/338803.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/338803.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/11/23/338803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/338803.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/338803.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转自：http://blog.csdn.net/Android_Tutor/archive/2010/04/21/5513869.aspx大家好我们这一节讲的是LayoutInflater的使用,在实际开发种LayoutInflater这个类还是非常有用的,它的作用类似于 findViewById(),不同点是LayoutInflater是用来找layout下xml布局文件，并且实例化...&nbsp;&nbsp;<a href='http://www.blogjava.net/caizh2009/archive/2010/11/23/338803.html'>阅读全文</a><img src ="http://www.blogjava.net/caizh2009/aggbug/338803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-11-23 15:20 <a href="http://www.blogjava.net/caizh2009/archive/2010/11/23/338803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为程序添加版本自动更新功能(转+详细分析)</title><link>http://www.blogjava.net/caizh2009/archive/2010/11/23/338763.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 23 Nov 2010 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/11/23/338763.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/338763.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/11/23/338763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/338763.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/338763.html</trackback:ping><description><![CDATA[<strong>Over<span href="http://www.eoeandroid.com/tag.php?name=View" class="t_tag">View</span>:</strong><br />
<span href="http://www.eoeandroid.com/tag.php?name=%E7%A8%8B%E5%BA%8F" class="t_tag">程序</span>通过后台每天检查是否有最新版本，如果需要更新当前版本，将弹出对话框让用户选择是否在当前通过Market来更新<span href="http://www.eoeandroid.com/tag.php?name=%E8%BD%AF%E4%BB%B6" class="t_tag">软件</span>。<br />
<strong>Knowledge Points:</strong><br />
<ul>
    <li>SharedPreferences: 一个轻量级的存储方法，类似于经常使用的.ini<span href="http://www.eoeandroid.com/tag.php?name=%E6%96%87%E4%BB%B6" class="t_tag">文件</span>，它也是通过检索关键字来取得相应的数值。之所以是成为轻量级，是因为它所能<span href="http://www.eoeandroid.com/tag.php?name=%E5%BA%94%E7%94%A8" class="t_tag">应用</span>的数值类型有限，对于存储较大数值，效率相对较低。<a href="http://developer.android.com/reference/android/content/SharedPreferences.html" target="_blank">官方参考</a></li>
    <li>System.currentTimeMillis:将当前<span href="http://www.eoeandroid.com/tag.php?name=%E6%97%B6%E9%97%B4" class="t_tag">时间</span>以毫秒作为单位来表示，用于比较两个时间的先后顺序。（其数值表示从1970-01-01 00:00:00直到当前时间的总毫秒数）<a href="http://developer.android.com/reference/java/lang/System.html" target="_blank">官方参考</a></li>
    <li>通过<span href="http://www.eoeandroid.com/tag.php?name=%E7%BD%91%E7%BB%9C" class="t_tag">网络</span>来读取信息：在checkUpdate()方法中包含了通过制定的URL来读取网络资源。具体操作步骤，请参考源<span href="http://www.eoeandroid.com/tag.php?name=%E4%BB%A3%E7%A0%81" class="t_tag">代码</span>。</li>
    <li>Runnable: 在其内部的Run()方法中实现所要执行的任何代码，当这个runnable interface被调用后可以视作为新的线程。</li>
</ul>
<strong>Source Code：</strong><br />
<font face="monospace "></font>
<div class="blockcode">
<div id="code0">
<ol><font face="monospace ">
    <li>public class <span href="http://www.eoeandroid.com/tag.php?name=hello" class="t_tag">hello</span> extends Activity&nbsp;&nbsp;{<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/** Called when the <span href="http://www.eoeandroid.com/tag.php?name=activity" class="t_tag">activity</span> is first created. */<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;private Handler mHandler;<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br />
    </li>
    <li>&nbsp; &nbsp; @Override<br />
    </li>
    <li>&nbsp; &nbsp; public void onCreate(Bundle savedInstanceState) {<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;super.onCreate(savedInstanceState);<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;setContentView(R.layout.main);<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;mHandler = new Handler();<br />
    </li>
    <li> <br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/* Get Last Update Time from Preferences */<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;SharedPreferences prefs = getPreferences(0);<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;long lastUpdateTime =&nbsp;&nbsp;prefs.getLong("lastUpdateTime", System.currentTimeMillis());<br />
    </li>
    <li> <br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;int curVersion = 0;<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; try {<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;curVersion = getPackageManager().getPackageInfo("linhai.com.hello", 0).versionCode;<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; } catch (NameNotFoundException e) {<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;// TODO Auto-generated catch block<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;e.printStackTrace();<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; }<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Log.i("DEMO",String.valueOf(curVersion));<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/* Should Activity Check for Updates Now? */<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if ((lastUpdateTime + (24 * 60 * 60 * 1000)) &lt; System.currentTimeMillis()) {<br />
    </li>
    <li> <br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;/* Save current timestamp for next Check*/<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;lastUpdateTime = System.currentTimeMillis();<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;SharedPreferences.Editor editor = getPreferences(0).edit();<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;editor.putLong("lastUpdateTime", lastUpdateTime);<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;editor.commit();&nbsp; &nbsp;&nbsp; &nbsp; <br />
    </li>
    <li> <br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;/* Start Update */<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//&nbsp; &nbsp;checkUpdate.start();<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br />
    </li>
    <li>&nbsp; &nbsp; }<br />
    </li>
    <li> <br />
    </li>
    <li>&nbsp; &nbsp; /* This Thread checks for Updates in the Background */<br />
    </li>
    <li>&nbsp; &nbsp; private Thread checkUpdate = new Thread() <br />
    </li>
    <li>&nbsp; &nbsp; {<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;public void run() {<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;try {<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; URL updateURL = new URL("http://my.company.com/update");<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; URLConnection conn = updateURL.openConnection();<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; InputStream is = conn.getInputStream();<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; BufferedInputStream bis = new BufferedInputStream(is);<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ByteArrayBuffer baf = new ByteArrayBuffer(50);<br />
    </li>
    <li> <br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; int current = 0;<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; while((current = bis.read()) != -1){<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;baf.<span href="http://www.eoeandroid.com/tag.php?name=app" class="t_tag">app</span>end((byte)current);<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; }<br />
    </li>
    <li> <br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; /* Convert the Bytes read to a String. */<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; final String s = new String(baf.toByteArray());&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
    </li>
    <li> <br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; /* Get current Version Number */<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; int curVersion = getPackageManager().getPackageInfo("your.app.id", 0).versionCode;<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; int newVersion = Integer.valueOf(s);<br />
    </li>
    <li> <br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; /* Is a higher version than the current already out? */<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; if (newVersion &gt; curVersion) {<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/* Post a Handler for the UI to pick up and open the Dialog */<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;mHandler.post(showUpdate);<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; }<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;} catch (Exception e) {<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br />
    </li>
    <li>&nbsp; &nbsp; };<br />
    </li>
    <li> <br />
    </li>
    <li>&nbsp; &nbsp; /* This Runnable creates a Dialog and asks the user to open the Market */<br />
    </li>
    <li>&nbsp; &nbsp; private Runnable showUpdate = new Runnable(){<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;public void run(){<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;new AlertDialog.Builder(hello.this)<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;.setIcon(R.drawable.ok)<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;.setTitle("Update Available")<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;.setMessage("An update for is available!\n\nOpen Android Market and see the details?")<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;.setPositiveButton("Yes", new DialogInterface.OnClickListener() {<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;public void onClick(DialogInterface dialog, int whichButton) {<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; /* User clicked OK so do some stuff */<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <span href="http://www.eoeandroid.com/tag.php?name=Intent" class="t_tag">Intent</span> intent = new Intent(Intent.ACTION_VIEW, Uri.parse("<span href="http://www.eoeandroid.com/tag.php?name=market" class="t_tag">market</span>://search?q=pname:your.app.id"));<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; startActivity(intent);<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;})<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;.setNegativeButton("No", new DialogInterface.OnClickListener() {<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;public void onClick(DialogInterface dialog, int whichButton) {<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; /* User clicked Cancel */<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;})<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;.show();<br />
    </li>
    <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br />
    </li>
    <li>&nbsp; &nbsp; };<br />
    </li>
    <li>&nbsp;&nbsp;<br />
    </li>
    <li>}</li>
    </font></ol>
    </div>
    <font face="monospace "><em>复制代码</em></font></div>
    <font face="monospace "></font><br />
    <br />
    分为三个部分：<br />
    <ul>
        <li>置于onCreate()方法中的程序用于判断当前时间是否需要检查更新（如果距离上次更新时间大于1天，将启动检查更新）</li>
        <li>当以上条件满足时，启动checkUpdate来检查当前程序是否为最新版本。</li>
        <li>如果确定版本已过期，那么将登录market，并直接指向当前程序页面。</li>
    </ul>
    *******************************************************************************************<br />
    向上言：<br />
    &nbsp; &nbsp;&nbsp;&nbsp;本人在<span href="http://www.eoeandroid.com/tag.php?name=%E8%AE%BA%E5%9D%9B" class="t_tag">论坛</span>曾经发过一关于此问题的<span href="http://www.eoeandroid.com/tag.php?name=%E6%B1%82%E5%8A%A9" class="t_tag">求助</span>帖，虽然大至的思路和上文差不多，关键点是在于程序如何更新，现在看到它这里指出的更新方法居然是登录market。不过以后发布的程序都是在market中，问题就不存在。
    <div class="blockcode">
    <div id="code1">
    <ol>
        <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=pname:your.app.id"));<br />
        </li>
        <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; startActivity(intent);</li>
    </ol>
    </div>
    <em>复制代码</em></div>
    大家都是在eclipse上<span href="http://www.eoeandroid.com/tag.php?name=%E5%BC%80%E5%8F%91" class="t_tag">开发</span>吧，在每次更新代码，<span href="http://www.eoeandroid.com/tag.php?name=%E8%BF%90%E8%A1%8C" class="t_tag">运行</span><span href="http://www.eoeandroid.com/tag.php?name=%E6%A8%A1%E6%8B%9F" class="t_tag">模拟</span>器时，大家是否有注意到console的提示信息：
    <div class="blockcode">
    <div id="code2">
    <ol>
        <li>[2009-06-06 19:53:50 - Hello] Android Launch!<br />
        </li>
        <li>[2009-06-06 19:53:50 - Hello] adb is running normally.<br />
        </li>
        <li>[2009-06-06 19:53:50 - Hello] Performing linhai.com.hello.hello activity launch<br />
        </li>
        <li>[2009-06-06 19:53:50 - Hello] Automatic Target Mode: using existing emulator 'emulator-5554' running compatible AVD 'avd'<br />
        </li>
        <li>[2009-06-06 19:53:50 - Hello] WARNING: Application does not specify an <span href="http://www.eoeandroid.com/tag.php?name=API" class="t_tag">API</span> level requirement!<br />
        </li>
        <li>[2009-06-06 19:53:50 - Hello] Device API version is 3 (Android 1.5)<br />
        </li>
        <li>[2009-06-06 19:53:50 - Hello] Uploading Hello.apk onto device 'emulator-5554'<br />
        </li>
        <li>[2009-06-06 19:53:50 - Hello] Installing Hello.apk...<br />
        </li>
        <li>[2009-06-06 19:54:05 - Hello] Application already exists. Attempting to re-install instead...<br />
        </li>
        <li>[2009-06-06 19:54:31 - Hello] Success!</li>
    </ol>
    </div>
    <em>复制代码</em></div>
    分析：<br />
    1。<span href="http://www.eoeandroid.com/tag.php?name=android" class="t_tag">android</span>正常运行<br />
    2。通过配置文件AndroidManifest.xml中运行我们的程序<br />
    3。<font color="Red">Uploading Hello.apk onto device 'emulator-5554'</font>这句是关键，更新我们的程序<br />
    4。<font color="Red">Installing Hello.apk...</font><br />
    5。<font color="Red">Application already exists. Attempting to re-install instead...</font>//程序已经存在，尝试重新安装<br />
    <br />
    所以如果我们的程序要<span href="http://www.eoeandroid.com/tag.php?name=%E8%87%AA%E5%8A%A8" class="t_tag">自动</span>更新，本人初步猜想是和上面的步骤是一样的。<br />
    详看logcat中的log
    <div class="blockcode">
    <div id="code3">
    <ol>
        <li>06-06 11:54:02.567: DEBUG/PackageParser(582): Scanning package: /data/app/vmdl12464.tmp<br />
        </li>
        <li>06-06 11:54:08.048: INFO/PackageManager(582): Removing non-system package:linhai.com.hello<br />
        </li>
        <li>06-06 11:54:08.187: DEBUG/PackageManager(582): Removing package linhai.com.hello<br />
        </li>
        <li>06-06 11:54:08.286: DEBUG/PackageManager(582):&nbsp; &nbsp;Activities: linhai.com.hello.hello<br />
        </li>
        <li>06-06 11:54:11.136: DEBUG/PackageManager(582): Scanning package linhai.com.hello<br />
        </li>
        <li>06-06 11:54:11.301: INFO/PackageManager(582): /data/app/vmdl12464.tmp changed; unpacking<br />
        </li>
        <li>06-06 11:54:11.626: DEBUG/installd(555): DexInv: --- BEGIN '/data/app/vmdl12464.tmp' ---<br />
        </li>
        <li>06-06 11:54:12.987: DEBUG/dalvikvm(7756): DexOpt: load 224ms, verify 265ms, opt 1ms<br />
        </li>
        <li>06-06 11:54:13.047: DEBUG/installd(555): DexInv: --- END '/data/app/vmdl12464.tmp' (success) ---<br />
        </li>
        <li>06-06 11:54:13.057: DEBUG/PackageManager(582):&nbsp; &nbsp;Activities: linhai.com.hello.hello<br />
        </li>
        <li>06-06 11:54:15.608: INFO/installd(555): move
        /data/dalvik-cache/data@app@vmdl12464.tmp@classes.dex -&gt;
        /data/dalvik-cache/data@app@linhai.com.hello.apk@classes.dex<br />
        </li>
        <li>06-06 11:54:15.737: DEBUG/PackageManager(582): New package installed in /data/app/linhai.com.hello.apk</li>
    </ol>
    </div>
    <em>复制代码</em></div>
    关于此类的自动更新的第三方管理软件已经有了叫<strong>aTrackDog</strong>,其原理就是使用上面的方式。<br />
    关于得到版本号，使用：
    <div class="blockcode">
    <div id="code4">
    <ol>
        <li>int curVersion = getPackageManager().getPackageInfo("your.app.id", 0).versionCode;</li>
    </ol>
    </div>
    <em>复制代码</em></div>
    程序版本号的是放在AndroidManifest.xml文件中：
    <div class="blockcode">
    <div id="code5">
    <ol>
        <li>&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"<br />
        </li>
        <li>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;package="linhai.com.hello" android:versionCode="2" android:versionName="2.0.1"&gt;</li>
    </ol>
    </div>
    <em>复制代码</em></div>
    主点是关于：getPackageManager()在这个下面有很多方法，你可以通过它得，得到当前终端安装的程序等。关于安装包的函数是：getPackageManager().installPackage(packageURI)<br />
    <br />
    动手试验：<br />
    在dos状态下运行：<br />
    <span style="position: absolute; display: none;" id="attach_370"><img src="http://www.eoeandroid.com/images/default/attachimg.gif" border="0"  alt="" /></span>
    <img src="http://www.eoeandroid.com/attachments/month_0906/09060620396d10363372ae4025.jpg" file="attachments/month_0906/09060620396d10363372ae4025.jpg" class="zoom" id="aimg_370" alt="1.JPG" width="600" />
    <div class="t_attach" id="aimg_370_menu" style="position: absolute; z-index: 301; opacity: 1; left: 249.15px; top: 4893px; display: none; ">
    <a href="http://www.eoeandroid.com/attachment.php?aid=MzcwfDE2YzI5ODVifDEyOTA0ODE1MzJ8MjU3M1NKMzdyOVByVlR0NEhzYUdLbU00V2dXNHZFNENlRkFySE0xM2sxaHY5eTA%3D&amp;nothumb=yes" title="1.JPG" target="_blank"><strong><span href="http://www.eoeandroid.com/tag.php?name=%E4%B8%8B%E8%BD%BD" class="t_tag">下载</span></strong></a> (24.51 KB)<br />
    <div class="t_smallfont">2009-6-6 20:39</div>
    </div>
    <br />
    查看logcat下的信息,大致和刚才相同，分析流程：
    <div class="blockcode">
    <div id="code6">
    <ol>
        <li>06-06 12:18:58.827: INFO/jdwp(8368): received file descriptor 20 from ADB<br />
        </li>
        <li>06-06 12:19:02.546: DEBUG/PackageParser(582): Scanning package: /data/app/vmdl12465.tmp<br />
        </li>
        <li>06-06 12:19:07.738: INFO/PackageManager(582): /data/app/vmdl12465.tmp changed; unpacking<br />
        </li>
        <li>06-06 12:19:07.978: DEBUG/installd(555): DexInv: --- BEGIN '/data/app/vmdl12465.tmp' ---<br />
        </li>
        <li>06-06 12:19:09.617: DEBUG/dalvikvm(8378): DexOpt: load 254ms, verify 564ms, opt 3ms<br />
        </li>
        <li>06-06 12:19:09.697: DEBUG/installd(555): DexInv: --- END '/data/app/vmdl12465.tmp' (success) ---<br />
        </li>
        <li>06-06 12:19:11.907: INFO/installd(555): move
        /data/dalvik-cache/data@app@vmdl12465.tmp@classes.dex -&gt;
        /data/dalvik-cache/data@app@com.example.android.snake.apk@classes.dex<br />
        </li>
        <li>06-06 12:19:11.956: DEBUG/PackageManager(582): New package installed in /data/app/com.example.android.snake.apk<br />
        </li>
        <li>06-06 12:19:14.746: DEBUG/dalvikvm(8368): VM cleaning up<br />
        </li>
        <li>06-06 12:19:14.857: DEBUG/dalvikvm(8368): LinearAlloc 0x0 used 628420 of 4194304 (14%)<br />
        </li>
        <li>06-06 12:19:15.897: DEBUG/dalvikvm(582): GC freed 17704 objects / 903984 bytes in 615ms<br />
        </li>
        <li>06-06 12:19:15.936: DEBUG/HomeLoaders(625): application intent received: android.intent.action.PACKAGE_ADDED, replacing=false<br />
        </li>
        <li>06-06 12:19:15.936: DEBUG/HomeLoaders(625):&nbsp; &nbsp;--&gt; package:com.example.android.snake<br />
        </li>
        <li>06-06 12:19:15.936: DEBUG/HomeLoaders(625):&nbsp; &nbsp;--&gt; add package</li>
    </ol>
    </div>
    <em>复制代码</em></div>
    1。接收<span href="http://www.eoeandroid.com/tag.php?name=%E6%95%B0%E6%8D%AE" class="t_tag">数据</span>，保存到临时文件中/data/app/vmdl12465.tmp<br />
    2。解压此文件，注意路径/data/dalvik-cache/data@<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#97;&#112;&#112;&#64;&#118;&#109;&#100;&#108;&#49;&#50;&#52;&#54;&#53;&#46;&#116;&#109;&#112;">app@vmdl12465.tmp</a>@classes.dex<br />
    它是在data下的dalvik-cache下<br />
    3.安装文件[这个步骤还包括查找程序是否已经安装等]<br />
    4.使用GC清理内存<br />
    <br />
    查看DDMS中的结构<br />
    <span style="position: absolute; display: none;" id="attach_371"><img src="http://www.eoeandroid.com/images/default/attachimg.gif" border="0"  alt="" /></span>
    <img src="http://www.eoeandroid.com/attachments/month_0906/09060620392964ad8487f89c3a.jpg" file="attachments/month_0906/09060620392964ad8487f89c3a.jpg" class="zoom" id="aimg_371" alt="2.JPG" width="600" />
    <div class="t_attach" id="aimg_371_menu" style="position: absolute; display: none; ">
    <a href="http://www.eoeandroid.com/attachment.php?aid=MzcxfGExZjY1YjZlfDEyOTA0ODE1MzJ8MjU3M1NKMzdyOVByVlR0NEhzYUdLbU00V2dXNHZFNENlRkFySE0xM2sxaHY5eTA%3D&amp;nothumb=yes" title="2.JPG" target="_blank"><strong>下载</strong></a> (47.53 KB)<br />
    <div class="t_smallfont">2009-6-6 20:39</div>
    </div>
    <br />
    看到此文件结构，应该可以想起linux下的文件<span href="http://www.eoeandroid.com/tag.php?name=%E7%B3%BB%E7%BB%9F" class="t_tag">系统</span>和它的权限管理，也就可以理解，为什么我们的程序无法在data下创建文件之类的问题了。<br />
    转载：<a href="http://www.androidres.com/?p=349" target="_blank">http://www.androidres.com/?p=349</a>
<img src ="http://www.blogjava.net/caizh2009/aggbug/338763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-11-23 11:07 <a href="http://www.blogjava.net/caizh2009/archive/2010/11/23/338763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>构建自定义组件</title><link>http://www.blogjava.net/caizh2009/archive/2010/11/23/338757.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 23 Nov 2010 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/11/23/338757.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/338757.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/11/23/338757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/338757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/338757.html</trackback:ping><description><![CDATA[<p>ndroid中，你的应用程序程序与View类组件有着一种固定的联系，例如<a href="http://writeblog.csdn.net/reference/android/widget/Button.html"><span style="color: #439740;">按钮（Button）</span></a>、 <a href="http://writeblog.csdn.net/reference/android/widget/TextView.html"><span style="color: #439740;">文本框（TextView）</span></a>, <a href="http://writeblog.csdn.net/reference/android/widget/EditText.html"><span style="color: #439740;">可编辑文本框（EditText）</span></a>, <a href="http://writeblog.csdn.net/reference/android/widget/ListView.html"><span style="color: #439740;">列表框（ListView）</span></a>, <a href="http://writeblog.csdn.net/reference/android/widget/CheckBox.html"><span style="color: #439740;">复选框（CheckBox）</span></a>, <a href="http://writeblog.csdn.net/reference/android/widget/RadioButton.html"><span style="color: #439740;">单选框（RadioButton）</span></a>, <a href="http://writeblog.csdn.net/reference/android/widget/Gallery.html"><span style="color: #439740;">滚动条（Gallery）</span></a>, <a href="http://writeblog.csdn.net/reference/android/widget/Spinner.html"><span style="color: #439740;">微调器（Spinner）</span></a>, 等等，还有一些比较先进的有着特殊用途的View组件，例如 <a href="http://writeblog.csdn.net/reference/android/widget/AutoCompleteTextView.html"><span style="color: #439740;">AutoCompleteTextView</span></a>, <a href="http://writeblog.csdn.net/reference/android/widget/ImageSwitcher.html"><span style="color: #439740;">ImageSwitcher</span></a>和 <a href="http://writeblog.csdn.net/reference/android/widget/TextSwitcher.html"><span style="color: #439740;">TextSwitcher</span></a>。除此之外，种类繁多的像 <a href="http://writeblog.csdn.net/reference/android/widget/LinearLayout.html"><span style="color: #439740;">线性布局（LinearLayout）</span></a>, <a href="http://writeblog.csdn.net/reference/android/widget/FrameLayout.html"><span style="color: #439740;">框架布局（FrameLayout）</span></a>, 这样的布局组件（Layout）也被认为是View组件，他们是从View类派生过来的。</p>
<p>你的应用程序就是这些控制组件和布局组件以某种方式结合显示在屏幕上，一般来说这些组件对你来说基本够用，但是你也应该知道你是可以通过类继承创建
属于自己的组件，一般可以继承像View、Layouts（布局组件）这样的组件，甚至可以是一些比较高级的控制类组件。下面我们说一下为什么要继承：</p>
<ul>
    <li>你可以为实现某种功能创建一个完全自定义风格的组件，例如用二维的图形创建控制组件实现声音的控制，就像电子控制一样。 </li>
    <li>你可以把几种组件结合形成一个新的组件，你的组件可能同时包含ComboBox（一个能输入的文本列表）和dual-pane selector control（左右两个List窗口，你可以分配窗口每一项的从属关系）等等。 </li>
    <li>你可以创建自己的布局组件（Layout）。SDK中的布局组件已经提供了一系列的选项让你打造属于自己的应用程序，但是高级的开发人员会发现根据现有的Layout组件开发新的Layout组件是很有必要的，甚至是完全从底层开发新的组件。 </li>
    <li>你可以覆盖一个现有组件的显示或功能。例如，改变EditText（可编辑文本）组件在屏幕上的显示方式（可以参考Notepad的例子，里面教你如何创建一个下划线的显示页面）。 </li>
    <li>你可以捕获像按键按下这样的事件，以一些通用的方法来处理这些事件（一个游戏的例子）。 </li>
</ul>
<p>为了实现某种目标你可能很有必要扩展一个已经存在的View组件，下面我们结合一些例子教你如何去做。 </p>
<h2 style="clear: right;">内容：</h2>
<dl><dt><a href="http://writeblog.csdn.net/#basic"><span style="color: #439740;">基本方法（The Basic Approach ）</span></a> </dt><dt><a href="http://writeblog.csdn.net/#custom"><span style="color: #439740;">完全自定义组件（Fully Customized Components ）</span></a> </dt><dt><a href="http://writeblog.csdn.net/#customexample"><span style="color: #439740;">定制组件的例子（Customized Component Example ）</span></a> </dt><dt><a href="http://writeblog.csdn.net/#compound"><span style="color: #439740;">组件的混合（或者控制类的混合） （Compound Components (or Compound Controls) ）</span></a> </dt><dt><a href="http://writeblog.csdn.net/#tweaking"><span style="color: #439740;">修改现有组件（Tweaking an Existing Component ）</span></a> </dt><dt><a href="http://writeblog.csdn.net/#goforth"><span style="color: #439740;">小结（Go Forth and Componentize ）</span></a> </dt></dl>
<p><a></a></p>
<h2>基本方法（The Basic Approach ） </h2>
<p>下面的一些步骤都比较概括，教你如何创建自己的组件：</p>
<ol>
    <li>让你的类（Class）继承一个现有的<a href="http://writeblog.csdn.net/reference/android/view/View.html"><span style="color: #439740;">View</span></a> 类或<a href="http://writeblog.csdn.net/reference/android/view/View.html"><span style="color: #439740;">View</span></a>的子类。 </li>
    <li>重载父类的一些方法：需要重载的父类方法一般以&#8216;<code>on</code>&#8217;开头，如<a href="http://writeblog.csdn.net/reference/android/view/View.html#onDraw%28android.graphics.Canvas%29"><span style="color: #439740;">onDraw()</span></a>, <a href="http://writeblog.csdn.net/reference/android/view/View.html#onMeasure%28int,%20int%29"><span style="color: #439740;">onMeasure()</span></a>和 <a href="http://writeblog.csdn.net/reference/android/view/View.html#onKeyDown%28int,%20android.view.KeyEvent%29"><span style="color: #439740;">onKeyDown()</span></a>等等。
    <ul>
        <li>这个在<a href="http://writeblog.csdn.net/reference/android/app/Activity.html"><span style="color: #439740;">Activity</span></a> 或则 <a href="http://writeblog.csdn.net/reference/android/app/ListActivity.html"><span style="color: #439740;">ListActivity</span></a> 派生中同样适用，你需要重载一些生命周期函数和一些其他功能性的HOOK函数。 </li>
    </ul>
    </li>
    <li>使用你的继承类：一旦你的继承类创建完成，你可以在基类能够使用的地方使用你的继承类，但完成功能就是你自己编写的了。 </li>
</ol>
<p>继承类能够定义在activities里面，这样你能够方便的调用，但是这并不是必要的（或许在你的应用程序中你希望创建一个所有人都可以使用的组件）。 </p>
<p><a></a></p>
<h2>完全自定义组件（Fully Customized Components）</h2>
<p>完全自定义组件的方法可以创建一些用于显示的图形组件（graphical components），也许是一个像电压表的图形计量器，或者想卡拉OK里面显示歌词的小球随着音乐滚动。无论那种方式，你也不能单纯的利用组件的结合完成，无论你怎么结合这些现有的组件。</p>
<p>幸运的是，你可以以你自己的要求轻松地创建完全属于自己的组件，你会发现不够用的只是你的想象力、屏幕的尺寸和处理器的性能（记住你的应用程序最后只会在那些性能低于桌面电脑的平台上面运行）。</p>
<p>下面简单介绍如何打造完全自定义的组件：</p>
<ol>
    <li>最为通用的VIEW类的父类毫无疑问是<a href="http://writeblog.csdn.net/reference/android/view/View.html"><span style="color: #439740;">View</span></a>类，因此，最开始你要创建一个基于此类的一个子类。 </li>
    <li>你可以写一个构造函数从XML文件中提取属性和参数，当然你也可以自己定义这些属性和参数（也许是图形计量器的颜色和尺寸，或者是指针的宽度和幅度等等） </li>
    <li>你可能有必要写自己的事件监听器，属性的访问和修改函数和一些组件本身的功能上的代码。 </li>
    <li>如果你希望组件能够显示什么东西，你很有可能会重载 <code>onMeasure()</code> 函数，因而你就不得不重载 <code>onDraw()</code> 函数。当两个函数都用默认的，那么 <code>onDraw() </code>函数将不会做任何事情，并且默认的 <code>onMeasure()</code> 函数自动的设置了一个100x100 —的尺寸，这个尺寸可能并不是你想要的。 </li>
    <li>其他有必要重载的<code>on...</code> 系列函数都需要重新写一次。 </li>
</ol>
<h4><code>onDraw()</code>和<code>onMeasure()</code></h4>
<p><code>onDraw()</code>函数将会传给你一个 <a href="http://writeblog.csdn.net/reference/android/graphics/Canvas.html"><span style="color: #439740;">Canvas</span></a> 对象，通过它你可以在二维图形上做任何事情，包括其他的一些标准和通用的组件、文本的格式，任何你可以想到的东西都可以通过它实现。</p>
<p><em>注意:</em> 这里不包括三维图形如果你想使用三维的图形，你应该把你的父类由View改为<a href="http://writeblog.csdn.net/reference/android/view/SurfaceView.html"><span style="color: #439740;">SurfaceView</span></a>类，并且用一个单独的线程。可以参考GLSurfaceViewActivity 的例子。 </p>
<p><code>onMeasure()</code> 函数有点棘手，因为这个函数是体现组件和容器交互的关键部分，<em>onMeasure（）</em>应该重载，让它能够有效而准确的表现它所包含部分的测量值。这就有点复杂了，因为我们不但要考虑父类的限制（通过<em>onMeasure（）</em>传过来的），同时我们应该知道一旦测量宽度和高度出来后，就要立即调用<em>setMeasuredDimension()</em> 方法。 </p>
<p>概括的来讲，执行<code>onMeasure()</code>函数分为一下几个阶段： </p>
<ol>
    <li>重载的<code>onMeasure（）</code>方法会被调用，高度和宽度参数同时也会涉及到（<code>widthMeasureSpec</code> 和<code>heighMeasureSpec</code>两个参数都是整数类型），同时你应该考虑你产品的尺寸限制。这里详细的内容可以参考<a href="http://writeblog.csdn.net/reference/android/view/View.html#onMeasure%28int,%20int%29"><span style="color: #439740;">View.onMeasure(int, int)</span></a> （这个连接内容详细的解释了整个measurement操作）。 </li>
    <li>你的组件要通过<code>onMeasure（）</code>计算得到必要的measurement长度和宽度从而来显示你的组件，它应该与规格保持一致，尽管它可以实现一些规格以外的功能（在这个例子里，父类能够选择做什么，包括剪切、滑动、提交异常或者用不同的参数又一次调用<code>onMeasure（）</code>函数）。 </li>
    <li>一旦高度和宽度计算出来之后，必须调用<code>setMeasuredDimension(int width, int height)</code>，否则就会导致异常。 </li>
</ol>
<p><a></a></p>
<h3>一个自定义组件的例子（A Customized Component Example）</h3>
<p>在 <a href="http://writeblog.csdn.net/samples/ApiDemos/index.html"><span style="color: #439740;">API Demos</span></a> 中的CustomView提供了以一个自定义组件的例子，这个自定义组件在 <a href="http://writeblog.csdn.net/samples/ApiDemos/src/com/example/android/apis/view/LabelView.html"><span style="color: #439740;">LabelView</span></a> 类中定义。</p>
<p>LabelView例子涉及到了自定义组件的方方面面：</p>
<ul>
    <li>首先让自定义组件从View类中派生出来。 </li>
    <li>编写带参数的构造函数（参数可以来源于XML文件）。这里面的一些处理都已经在View父类中完成，但是任然有些Labelview使用的自定义组件特有的新的参数需要处理。 </li>
    <li>一些标准的Public函数，例如<code>setText()</code>, <code>setTextSize()</code>, <code>setTextColor()</code> </li>
    <li>重载<code>onMeasure（）</code>方法来确定组件的尺寸（注意：在LabelView中是通过一个私有函数<code>measureWidth()</code>来实现的） </li>
    <li>重载<code>onDraw()</code>函数把Lable显示在提供的canvas上。 </li>
</ul>
<p>在例子中，你可以通过<a href="http://writeblog.csdn.net/samples/ApiDemos/res/layout/custom_view_1.html"><span style="color: #439740;">custom_view_1.xml</span></a>看到自定义组件LabelView的用法。在XML文件中特别要注意的是<code>android：</code>和<code>app:</code>两个参数的混合运用，<code>app：</code>参数表示应用程序中被认为是LabelView组件的个体，这些也会作为资源在R类中定义。</p>
<p><a></a></p>
<h2>组件混合技术Compound Components (or Compound Controls) </h2>
<p align="left">如果你不想创建一个完全自定义的组件，而是由几个现有组件的组合产生的新的组件，那么混合组件技术就更加适合。简单的来
说，这样把几个现有的组件融合到一个逻辑组合里面可以封装成一个新的组件。例如，一个Combo
Box组件可以看作是是一个EditText和一个带有弹出列表的Button组件的混合体。如果你点击按钮为列表选择一项， </p>
<p>在Android中，其实还有其他的两个View类可以做到类似的效果： <a href="http://writeblog.csdn.net/reference/android/widget/Spinner.html"><span style="color: #439740;">Spinner</span></a>和<a href="http://writeblog.csdn.net/reference/android/widget/AutoCompleteTextView.html"><span style="color: #439740;">AutoCompleteTextView</span></a>,，但是Combo Box作为一个例子更容易让人理解。 </p>
<p>下面简单的介绍如何创建组合组件：</p>
<ol>
    <li>一般从Layout类开始，创建一个Layout类的派生类。也许在Combo
    box我们会选择水平方向的LinearLayout作为父类。记住，其他的Layout类是可以嵌套到里面的，因此混合组件可以是任何组件的混合。注
    意，正如Activity一样，你既可以使用外部XML文件来声明你的组件，也可以嵌套在代码中。 </li>
    <li>在新的混合组件的构造函数中，首先，调用所有的父类的构造函数，传入对应的参数。然后可以设置你的混合组件的其他的一些方面，在哪创建
    EditText组件，又在哪创建PopupList组件。注意：你同时也可以在XML文件中引入一些自己的属性和参数，这些属性和参数也可以被你的混合
    组件所使用。 </li>
    <li>你也可以创建时间监听器去监听新组件中View类触发的事件，例如，对List选项单击事件的监听，你必须在此时间发生后更新你EditText的值。 </li>
    <li>你可能创建自己的一些属性，带有访问和修改方法。例如，允许设置EditText初始值并且提供访问它的方法。 </li>
    <li>在Layout的派生类中，你没有必要去重载<code>onDraw（）</code>和<code>onMeasure（）</code>方法，因为Layout会有比较好的默认处理。但是，如果你觉得有必要你也可以重载它。 </li>
    <li>你也可能重载一些<code>on</code>系列函数，例如通过<code>onKeyDown()</code>的重载，你可以通过按某个键去选择列表中的对应的值。 </li>
</ol>
<p>总之，把Layout类作为基类有下面几个优点：</p>
<ul>
    <li>正如activity一样，你也可以通过XML文件去声明你的新组件，或者你也可以在代码中嵌套。 </li>
    <li><code>onDraw（）</code>函数和<code>onMeasure()</code>函数是没有必要重载的，两个函数已经做得很好了。 </li>
    <li>你可以很快的创建你的混合组件，并且可以像单一组件那样使用。 </li>
</ul>
<h4>混合组件的例子（Examples of Compound Controls）</h4>
<p>In the API Demos project 在API Demos工程中，有两个List类的例子——Example 4和Example 6，里面的SpeechView组件是从LinearLayout类派生过来，实现显示演讲显示功能，对应的原代码是<code>List4.java</code>和<code>List6.java</code>。</p>
<p><a></a></p>
<h2>调整现有组件（Tweaking an Existing Component） </h2>
<p>在某些情况下，你可能有更简单的方法去创建你的组件。如果你应经有了一个非常类似的组件，你所要做的只是简单的从这个组件派生出你的组件，重在其中
一些有必要修改的方法。通过完全自定义组件的方法你也可以同样的实现，但通过冲View派生产生新的组件，你可以简单获取一些已经存在的处理机制，这些很
可能是你所想要的，而没有必要从头开始。</p>
<p>例如，在SDK中有一个NotePad的例子（<a href="http://writeblog.csdn.net/samples/NotePad/index.html"><span style="color: #439740;">NotePad application</span></a> ）。该例子演示了很多Android平台实用的细节，例如你会学到从EditView派生出能够自动换行的记事本。这还不是一个完美的例子，因为相比早期的版本来说，这些API已经感变了很多，但它确实说明了一些问题。</p>
<p>如果你还未查看该程序，现在你就可以在Eclipse中导入记事本例程（或仅通过提供的链接查看相应的源代码）。特别是查看<a href="http://writeblog.csdn.net/samples/NotePad/src/com/example/android/notepad/NoteEditor.html"><span style="color: #439740;">NoteEditor.java</span></a> 中的<code>MyEditText</code>的定义。</p>
<p>下面有几点要注意的地方：</p>
<ol>
    <li><strong>声明（The Definition）</strong>
    <p>这个类是通过下面一行代码来定义的：</p>
    <code>public static class MyEditText extends EditText</code><br />
    <br />
    <ul>
        <li>它是定义在<code>NoteEditor activity</code>类里面的，但是它是共有的（public），因此如果有必要，它可以通过<code>NoteEditor.MyEditText</code>从<code>NoteEditor</code>外面来调用。 </li>
        <li>它是<code>static</code>类（静态类），意味着不会出现所谓的通过父类访问数据的&#8220;虚态方法&#8221;， 这样就使该类成为一个可以不严重依赖<code>NoteEditor</code>的单独类。对于不需要从外部类访问的内联类的创建，这是一个很清晰地思路，保证所产生的类很小，并且允许它可以被其他的类方便的调用。 </li>
        <li>它是<code>EditText</code>类的扩展，它是我们选择的用来自定义的父类。当我们完成以后，新的类就可以作为一个普通的<code>EditText</code>来使用。<br />
        </li>
    </ul>
    </li>
    <li><strong>类的初始化</strong>
    <p>一般来说，父类是首先调用的。进一步来说，这不是一个默认的构造函数，而是一个带参数的构造函数。因为<code>EditText</code>是使用从XML布局文件提取出来的参数进行创建，因此我们的构造函数也要取出参数并且将这些参数传递给父类。</p>
    </li>
    <li><strong>方法重载</strong>
    <p>在本例中，仅对<code>onDraw()</code>一个方法进行重载。但你可以很容易地为你的定制组件重载其他需要的方法。</p>
    <p>对于记事本例子来说，通过重载<code>onDraw()</code>方法我们可以在<code>EidtView</code>的画布（<code>canvas</code>）上绘制蓝色的线条（<code>canvas</code>类是通过重写的<code>onDraw()</code>方法传递）。该函数快要结束时要调用<code>super.onDraw()</code>函数。父类的方法是应该调用，但是在这个例子里面，我们是在我们划好了蓝线之后调用的。</p>
    </li>
    <li><strong>使用定制组件</strong>
    <p>现在，我们已经有自己定制的组件了，但是应该怎样使用它呢？在记事本例子中，定制的组件直接在预定义的布局文件中使用，让我们看一看<code>res/layout</code>目录中的<code>note_editor.xml文件。</code></p>
    <pre>&lt;view xmlns:android="http://schemas.android.com/apk/res/android" <br />
    class="com.android.notepad.NoteEditor$MyEditText" <br />
    id="@+id/note"<br />
    android:layout_width="fill_parent"<br />
    android:layout_height="fill_parent"<br />
    android:background="@android:drawable/empty"<br />
    android:padding="10dip"<br />
    android:scrollbars="vertical"<br />
    android:fadingEdge="vertical" /&gt; </pre>
    <ul>
        <li>该自定义组件在XML中是作为一个一般的View类来创建的，并且是通过全路径包来描述的。注意这里内联类是通过<code>NoteEditor$MyEditText</code>来表示的，这是Java编程中引用内联类的标准方法。 </li>
        <li>在定义中的其他属性和参数将传递给定制组件的构造函数，然后才传到EditText构造函数中，因此这些参数也是你使用EditText组件的参数。注意，这里你也可以增加你自己的参数，我们将在下面讨论这个问题。 </li>
    </ul>
    </li>
</ol>
<p>这就是你全部需要做的，诚然这是一个简单的例子。但问题的关键是：你的需求有多复杂，那么你的自定义组件就有多么复杂。</p>
<p>一个更为复杂的组件可能需要重载更多的<code>on</code>系列函数，并且还要很多特有的函数来充分实现自定义组件的功能。唯一的限制就是你的想象力和你需要组件去执行什么工作。</p>
<p><a></a></p>
<h2>现在开始你的组件化之旅吧 </h2>
<p>如你所见，Android提供了一种精巧而又强大的组件模型，让你尽可能的完成你的工作。从简单的组件调整到组件混合，甚至完全自定义组件，灵活的运用这些技术，你应该可以得到一个完全符合你外观要求的的Android程序&nbsp;</p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/338757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-11-23 10:19 <a href="http://www.blogjava.net/caizh2009/archive/2010/11/23/338757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是android market？国内三大类android market知多少？</title><link>http://www.blogjava.net/caizh2009/archive/2010/11/22/338717.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Mon, 22 Nov 2010 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/11/22/338717.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/338717.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/11/22/338717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/338717.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/338717.html</trackback:ping><description><![CDATA[http://apphu.com/androidmarket
<div>
<p><strong>APP虎大讲堂：</strong><br />
<strong>android market</strong>就是程序应用商店。在2008年8月29日，谷歌推出了Android  Market，为使用Android操作系统的手机用户提供第三方应用。</p>
<p>这个平台相似于Apple的<strong><a href="http://www.apple.com/itunes">App Store</a></strong>，可以连接最新的Google在线 服务器。由于其本土化的设计，Android  Market可以让用户下载和安装支持Android系统的第三方软件。</p>
<p>Google作为Android Market的东道主，却一再强调Android Market的扮演的角色仅仅是&#8220;<strong>软件销售和传播的中心</strong>&#8221;而不是&#8220;软件过滤器&#8221;。</p>
<h4>为什么Google选择 android market 而不是Store？</h4>
<p>Google选择&#8220;&#8217;Market&#8217;&#8221;这个词而不是&#8220;Store&#8221;，是因为其觉得开发者需要的是一个开放的、毫无阻碍的环境来创造内容。Google希望 <a href="http://apphu.com/androidmarket">Android Market</a>最终会像YouTube那样，只需要注册一个发行人资格和软件的类别就可以发布软件。<br />
Google并没有表示会对android market进行监管，只是表示Android
Market里的软件将拥有反馈系统以及类似YouTube上的等级系统。Google
将通过追踪工具获得软件的反馈，如果某个软件有危险性，将会有标识提醒用户注意。但是其中的隐私问题却在前不久的<strong><a href="http://apphu.com/androidtest">SMobile 的分析报告&gt;</a></strong>中显露无疑，而且普通用户很难注意到有些软件会侵犯他们的隐私，况且让谷歌android手机用户去辨别生涩的专业名词，实在太强人所难了。</p>
<p>Android Market学习了App Store开创的软件销售模式，对iPhone以及App Store是一个冲击；更重要的一方面是 Google选择的Market模式与苹果的App Store之间的差异会逐渐显现出来。</p>
<h4>国内三大类android market知多少</h4>
<p>自从android在中国大大的火了一把之后，android market也如雨后春笋般的不断涌现出来。总的来说android market有如下几类：<br />
第一类： 谷歌创建的android market<br />
谷歌android market，只此一家，别无其他官方market。</p>
<p>第二类： 国内有头有脸的手机厂商和移动运营商创建的android market</p>
<ul>
    <li><a href="http://developer.motorola.com/"><strong>MOTO的智件园</strong>:</a><br />
    摩托罗拉也是通过去年转型生产一系列android手机，才着实大赚了一把，流转了不利局面，倒是Nokia迟缓的反应速度让其市场份额半年几乎损失过
    半，虽然只在英国占有主导地位，可以在美国的市场份额远不及iphone和android手机，MOTO的Milestone更是让其重新站上历史的舞
    台。不甘于被<strong>谷歌android marke</strong>t 控制的摩托罗拉自然在寻出路，建造自己的android market</li>
    <li><a href="http://labs.chinamobile.com/"><strong>中移动的Mobile Market</strong></a></li>
    <p>中移动的MM简单来说是在android1.0/android1.5的基础上改良版的android系统，虽然当时可以跑动大部分android
    软件，但是这个market仍处于不愠不火的状态。不过不久前，中国移动在原来版本的基础上进行了许多创新和改进，推出的OPhone2,0，还完全兼容
    Android2.1，甚至三星&#8220;奥斯卡I7680&#8221;也搭载了OMS系统。目前MM已经初具规模，中国移动Mobile
    Market拥有16400款应用。</p>
    <li><strong>联通的UniStore</strong></li>
    <p>联通应用商店(UniStore)已经完成了漫长的&#8220;内测阶段&#8221;，将于7月中旬正式发布，该应用商店在支付模式上将采用&#8220;中间账户&#8221;的模式，用户注
    册联通应用商店时会自动注册&#8220;中间账户&#8221;，便可绑定话费支付或者支付宝、财付通等第三方支付工具。据悉，联通应用商店将采用开放平台的模式，也就是说不仅
    支持中国联通手机用户使用，也支持中国移动和中国电信的手机用户使用，目前仅有775款。</p>
    <li><a href="http://www.ctmarket.cn/appstore/"><strong>中国电信的天翼软件工厂</strong></a></li>
    <p>中国电信的天翼空间更是时刻处在升级状态，虽然使出浑身解数，也仍然难见起色，天翼空间拥有1054款</p>
    <li><a href="http://www.livesmart.cn/">酷派的Android Coolmart</a>为了支撑新机器的上市，宇龙酷派也正在进行着Android Coolmart的招兵买马中。</li>
</ul>
<p>第三类： 独立第三方创建的android market</p>
<ul>
    <li><a href="http://www.hiapk.com/">安卓市场:</a><br />
    历史最悠久也是最热门的第三方应用市场，论坛的每天流量在第三方市场中居首</li>
    <li><a href="http://www.androidin.net/">机锋市场:</a> 是比较权威的<a href="http://apphu.com/android-bbs">android手机论坛</a></li>
    <p>，但是其手机market却迟迟没有完善。</p>
    <li><a href="http://www.eoemarket.com/">优亿市场:</a>后台不错，上传方便，网站也很专业，对开发者很友好。只是人气欠缺，下载量一直很不理想。而优亿市场内的软件也十分有限，人气实在不及安卓市场。</li>
    <li><a href="http://market.goapk.com/">安智市场:</a>后起之秀，虽然目前用户数量不多，但是其andorid market设计十分人性化且具有很强的创新性，刚使用时会让人耳目一新，强烈推荐，最近又新出了版本1.1，下载地址：<a href="http://bbs.goapk.com/thread-14388-1-1.html">http://bbs.goapk.com/thread-14388-1-1.html</a></li>
    <li><a href="http://www.aimi8.com/aimi8/">爱米软件商店：</a>最近发现一个不错的android手机软件商店-爱米软件商店。下载安装包：<a href="http://apphu.com/d/aimi_v2.0.3_apphu_hvga.apk">http://apphu.com/d/aimi_v2.0.3_apphu_hvga.apk</a><br />
    由于各android手机型号品牌和android版本不同，如果这个无法安装的话，请点击下载：<a href="http://apphu.com/d/aimi_v2.0.3_apphu_wvga.apk">http://apphu.com/d/aimi_v2.0.3_apphu_wvga.apk</a>
    </li>
</ul>
<p>虽然可用的谷歌android市场越来越多，但是同质化越来越严重的Market只能让用户无所适从，也无法产生类似App
Store一样的用户黏性。怎么样教育用户用自家的market是最大的问题，让我们期待中国的android市场是如何演绎他们自己的故事。当然APP
虎的软件在各类市场都可以通过搜索APPhu下载。</p>
</div>
<img src ="http://www.blogjava.net/caizh2009/aggbug/338717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-11-22 17:41 <a href="http://www.blogjava.net/caizh2009/archive/2010/11/22/338717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PC上试玩Android Market</title><link>http://www.blogjava.net/caizh2009/archive/2010/11/22/338713.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Mon, 22 Nov 2010 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/11/22/338713.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/338713.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/11/22/338713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/338713.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/338713.html</trackback:ping><description><![CDATA[<p>http://www.iteeyan.com/2010/07/play-android-app-on-emulator/</p>
<p>前几天，Jackeroo给大家介绍了一个Android模拟器，可以让大家在<a href="http://www.iteeyan.com/2010/07/install-android-2-2-on-pc/" target="_blank">PC机上玩Android 2.2</a>。不过，该模拟器中少了一个精华的东西，那就是&#8220;Android Market（电子市场）&#8221;。目前，iPhone手机玩的是操控感、时尚，而Android手机玩的则是软件，少了&#8220;Android Market&#8221;的Android模拟器，无异于自废了一半的功力&#8230;&#8230;</p>
<p>其实，要想在Android 2.2模拟器中使用&#8220;Android Market（电子市场）&#8221;，认真说来还是有点麻烦。网上虽然也有地方介绍过，但很多细节部分语焉不详。Jackeroo就以自己的实战操作，帮助大家温习一下。</p>
<p style="padding-left: 30px;"><strong>Step 01 新建Android 2.2虚拟机</strong></p>
<p>首先，安装Android SDK，新建一台Android 2.2虚拟机。不知道该去哪里下载Android SDK或者不清楚该如何使用虚拟机的朋友，请先阅读&#8220;<a href="http://www.iteeyan.com/2010/07/install-android-2-2-on-pc/" target="_blank">Google手机免费玩&#183;在PC上装Android 2.2</a>&#8221;博文。</p>
<p><a rel="attachment wp-att-863" href="http://www.iteeyan.com/2010/07/play-android-app-on-emulator/playandroidapponemulator-01/"><img class="aligncenter size-medium wp-image-863" title="PlayAndroidAppOnEmulator-01" src="http://www.iteeyan.com/wp-content/uploads/2010/07/PlayAndroidAppOnEmulator-01-393x500.png" alt="PlayAndroidAppOnEmulator 01 393x500 PC上试玩Android Market" height="500" width="393" /></a></p>
<p style="padding-left: 30px;"><strong>Step 02 命令行方式启动新建虚拟机</strong></p>
<p>把SDK包下的System.img文件（F:\android-sdk-windows\platforms\android-8\images）拷贝到的%UserProfile%\.android\avd\Android-2.2下。</p>
<p>然后打开命令行窗口，切换到SDK包的Tools目录下，加参数&#8220;-partition-size 96&#8221;启动虚拟机，才能让/system有足够的空间安装&#8220;Android Market（电子市场）&#8221;。</p>
<blockquote>
<p>cd /d f:\android-sdk-windows\tools</p>
<p>emulator.exe -avd Android-2.2 -partition-size 96</p>
</blockquote>
<p><a rel="attachment wp-att-864" href="http://www.iteeyan.com/2010/07/play-android-app-on-emulator/playandroidapponemulator-02/"><img class="aligncenter size-medium wp-image-864" title="PlayAndroidAppOnEmulator-02" src="http://www.iteeyan.com/wp-content/uploads/2010/07/PlayAndroidAppOnEmulator-02-500x326.png" alt="PlayAndroidAppOnEmulator 02 500x326 PC上试玩Android Market" height="326" width="500" /></a></p>
<p style="padding-left: 30px;"><strong>Step 03 让Android启动Checkin服务</strong></p>
<p>要正常使用&#8220;Android Market（电子市场）&#8221;，必须启动Checkin服务。等Android 2.2虚拟机启动完毕，看到正常的界面。</p>
<p><a rel="attachment wp-att-865" href="http://www.iteeyan.com/2010/07/play-android-app-on-emulator/playandroidapponemulator-03/"><img class="aligncenter size-medium wp-image-865" title="PlayAndroidAppOnEmulator-03" src="http://www.iteeyan.com/wp-content/uploads/2010/07/PlayAndroidAppOnEmulator-03-500x354.png" alt="PlayAndroidAppOnEmulator 03 500x354 PC上试玩Android Market" height="354" width="500" /></a></p>
<p>这时候，我们可以把配置文件build.prop取回来编辑（如果你有真实的Android连在电脑上，一定要先取下来再进行以下操作）。</p>
<blockquote>
<p>cd /d f:\android-sdk-windows\tools</p>
<p>adb pull /system/build.prop .</p>
</blockquote>
<p><a rel="attachment wp-att-866" href="http://www.iteeyan.com/2010/07/play-android-app-on-emulator/playandroidapponemulator-04/"><img class="aligncenter size-medium wp-image-866" title="PlayAndroidAppOnEmulator-04" src="http://www.iteeyan.com/wp-content/uploads/2010/07/PlayAndroidAppOnEmulator-04-500x326.png" alt="PlayAndroidAppOnEmulator 04 500x326 PC上试玩Android Market" height="326" width="500" /></a></p>
<p><strong><span style="color: #008000;">注意：第一次执行adb指令，会加载adb相关服务，然后提示&#8220;device offline（设备不在线）&#8221;。此时，需要再次执行上面的adb指令就可以了。</span></strong></p>
<p>这样一来，build.prop就放在了f:\android-sdk-windows\tools目录下，用文本编辑软件比如EmEditor、UltraEdit之类的打开它。将&#8220;ro.config.nocheckin=yes&#8221;前面加&#8220;#&#8221;号注释掉。</p>
<blockquote>
<p>#ro.config.nocheckin=yes</p>
</blockquote>
<p>然后再传到Android虚拟机上，重新启动虚拟机，Checkin服务就启动了（在上传之前，需要执行&#8220;adb remount&#8221;指令使/system目录可写）。</p>
<blockquote>
<p>adb remount<br />
adb push build.prop /system/build.prop</p>
</blockquote>
<p><a rel="attachment wp-att-867" href="http://www.iteeyan.com/2010/07/play-android-app-on-emulator/playandroidapponemulator-05/"><img class="aligncenter size-medium wp-image-867" title="PlayAndroidAppOnEmulator-05" src="http://www.iteeyan.com/wp-content/uploads/2010/07/PlayAndroidAppOnEmulator-05-500x326.png" alt="PlayAndroidAppOnEmulator 05 500x326 PC上试玩Android Market" height="326" width="500" /></a></p>
<p style="padding-left: 30px;"><strong>Step 04 安装&#8220;Android&nbsp; Market&#8221;到虚拟机</strong></p>
<p>首先，下载一个为各种手机开发的定制版Android 2.2，比如Jackeroo曾经用过的Android 2.2 for
HTC。将它解压缩，将system/app/GoogleServicesFramework.apk
和system/app/Vending.apk放到f:\android-sdk-windows\tools下。</p>
<p>Android 2.2 for Legend ：<a href="http://www.derhofbauer.at/android/" target="_blank">远程下载 </a></p>
<p>然后执行以下指令安装这两个apk安装包，并且删除Android虚拟机上的SdkSetup.apk（注意大小写）：</p>
<blockquote>
<p>adb push GoogleServicesFramework.apk /system/app<br />
adb push Vending.apk /system/app<br />
adb shell rm /system/app/SdkSetup.apk</p>
<p><a rel="attachment wp-att-868" href="http://www.iteeyan.com/2010/07/play-android-app-on-emulator/playandroidapponemulator-06/"><img class="aligncenter size-medium wp-image-868" title="PlayAndroidAppOnEmulator-06" src="http://www.iteeyan.com/wp-content/uploads/2010/07/PlayAndroidAppOnEmulator-06-500x326.png" alt="PlayAndroidAppOnEmulator 06 500x326 PC上试玩Android Market" height="326" width="500" /></a></p>
</blockquote>
<p style="padding-left: 30px;"><strong>Step 05 清理现场</strong></p>
<p>关闭虚拟机, 把产生的 image: userdata-qemu.img, userdata.img, cache.img都删除，重新启动虚拟机它就会自动初始化。</p>
<p style="padding-left: 30px;"><strong>Step 06 &#8220;Android Market&#8221;现身</strong></p>
<p>打开SDK Setup.exe，按照常规方式启动刚才新创建的Android 2.2虚拟机，就可以看到&#8220;Android Market&#8221;。</p>
<p><a rel="attachment wp-att-869" href="http://www.iteeyan.com/2010/07/play-android-app-on-emulator/playandroidapponemulator-07/"><img class="aligncenter size-medium wp-image-869" title="PlayAndroidAppOnEmulator-07" src="http://www.iteeyan.com/wp-content/uploads/2010/07/PlayAndroidAppOnEmulator-07-500x354.png" alt="PlayAndroidAppOnEmulator 07 500x354 PC上试玩Android Market" height="354" width="500" /></a></p>
<p>点击&#8220;Market&#8221;，就需要进行Google登录了，用你自己的Google账号登录吧。</p>
<p><a rel="attachment wp-att-870" href="http://www.iteeyan.com/2010/07/play-android-app-on-emulator/playandroidapponemulator-08/"><img class="aligncenter size-medium wp-image-870" title="PlayAndroidAppOnEmulator-08" src="http://www.iteeyan.com/wp-content/uploads/2010/07/PlayAndroidAppOnEmulator-08-500x354.png" alt="PlayAndroidAppOnEmulator 08 500x354 PC上试玩Android Market" height="354" width="500" /></a></p>
<p>登录以后，理论上说就可以使用&#8220;Android Market（电子市场）&#8221;尝试各种软件了，但由于网络无法连接，暂时还搜索不到。</p>
<p>有连接上的朋友，请告诉我解决方法。&nbsp;</p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/338713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-11-22 16:56 <a href="http://www.blogjava.net/caizh2009/archive/2010/11/22/338713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过AIDL及反射机制,使用隐藏API挂断电话(转载)</title><link>http://www.blogjava.net/caizh2009/archive/2010/11/22/338708.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Mon, 22 Nov 2010 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/11/22/338708.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/338708.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/11/22/338708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/338708.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/338708.html</trackback:ping><description><![CDATA[<p>http://dev.10086.cn/cmdn/bbs/thread-17136-1-1.html</p>
<p>最近看论坛上有人问如何挂断电话,实际上1.1版本后.Google已经把该API隐藏掉<br />
今天看资料,发现可以通过AIDL(Android远程方法)及反射,调用hide API,废话不多说了.附上过程</p>
<p>一:在你的项目中新建包com.android.internal.telephony,因为要使用AIDL,该包与ITelephony.aidl一致<br />
&nbsp; &nbsp; 在该包下新建文件ITelephony.aidl</p>
<p>首先</p>
<pre>package com.android.internal.telephony;
/* * Copyright (C) 2007 The Android Open Source Project
* * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* * [url=http://www.apache.org/licenses/LICENSE-2.0]http://www.apache.org/licenses/LICENSE-2.0[/url]
* * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Interface used to interact with the phone. Mostly this is used by the
* TelephonyManager class. A few places are still using this directly.
* Please clean them up if possible and use TelephonyManager insteadl.
* * {@hide}
*/
interface ITelephony {
/** * End call or go to the Home screen *
* @return whether it hung up
*/
boolean endCall();
/** * Answer the currently-ringing call.
* * If there's already a current active call, that call will be
* automatically put on hold. If both lines are currently in use, the
* current active call will be ended. *
* TODO: provide a flag to let the caller specify what policy to use
* if both lines are in use. (The current behavior is hardwired to
* "answer incoming, end ongoing", which is how the CALL button
* is specced to behave.) *
* TODO: this should be a oneway call (especially since it's called
* directly from the key queue thread). */
void answerRingingCall();
}   </pre>
<pre>&nbsp;</pre>
<pre><span  style="font-family: Simsun; white-space: normal; ">之后会在gen下面自动生成ITelephony.java</span></pre>
二.通过反射生成ITelephony实例
<pre>
<pre>TelephonyManager telMgr = (TelephonyManager)getSystemService(
TELEPHONY_SERVICE);
//初始化iTelephony
Class &lt;TelephonyManager&gt; c = TelephonyManager.class;
Method getITelephonyMethod = null;
try {
&nbsp; &nbsp;&nbsp; &nbsp; getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[])null);
&nbsp; &nbsp;&nbsp; &nbsp; getITelephonyMethod.setAccessible(true);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;iTelephony = (ITelephony) getITelephonyMethod.invoke(telMgr, (Object[])null);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
&nbsp; &nbsp;&nbsp; &nbsp;e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
&nbsp; &nbsp;&nbsp; &nbsp;e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
&nbsp; &nbsp;&nbsp; &nbsp;e.printStackTrace();
}</pre>
这样可以调用iTelephony的endCall()方法<br />
三.在AndroidManifest.xml中增加权限<br />
&nbsp;&nbsp;&lt;uses-permission android:name="android.permission.CALL_PHONE"/&gt;</pre>
<img src ="http://www.blogjava.net/caizh2009/aggbug/338708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-11-22 16:11 <a href="http://www.blogjava.net/caizh2009/archive/2010/11/22/338708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android 核心分析 之六 -----IPC框架分析 Binder，Service，Service manager </title><link>http://www.blogjava.net/caizh2009/archive/2010/11/21/338630.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Sun, 21 Nov 2010 13:13:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/11/21/338630.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/338630.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/11/21/338630.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/338630.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/338630.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://blog.csdn.net/maxleng/archive/2010/04/15/5490770.aspxIPC框架分析 Binder，Service，Service manager&nbsp;   我首先从宏观的角度观察Binder,Service,Service&nbsp;Manager，并阐述各自的概念。从Linux的概念空间中，Android的设计Acti...&nbsp;&nbsp;<a href='http://www.blogjava.net/caizh2009/archive/2010/11/21/338630.html'>阅读全文</a><img src ="http://www.blogjava.net/caizh2009/aggbug/338630.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-11-21 21:13 <a href="http://www.blogjava.net/caizh2009/archive/2010/11/21/338630.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>建立AIDL服务的步骤（3）</title><link>http://www.blogjava.net/caizh2009/archive/2010/11/19/338491.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Fri, 19 Nov 2010 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/11/19/338491.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/338491.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/11/19/338491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/338491.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/338491.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 建立AIDL服务的步骤（3）（4）编写一个MyService类，代码如下：    package&nbsp;net.blogjava.mobile.complex.type.aidl; &nbsp;    &nbsp;    import&nbsp;java.util.HashMap; &nbsp;    import&nbsp;java.util.Map; &nb...&nbsp;&nbsp;<a href='http://www.blogjava.net/caizh2009/archive/2010/11/19/338491.html'>阅读全文</a><img src ="http://www.blogjava.net/caizh2009/aggbug/338491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-11-19 17:09 <a href="http://www.blogjava.net/caizh2009/archive/2010/11/19/338491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>8.4.2 建立AIDL服务的步骤（2）</title><link>http://www.blogjava.net/caizh2009/archive/2010/11/19/338490.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Fri, 19 Nov 2010 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/11/19/338490.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/338490.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/11/19/338490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/338490.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/338490.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 8.4.2&nbsp; 建立AIDL服务的步骤（2）在编写上面代码时应注意如下两点：使用bindService方法来绑定AIDL服务。其中需要使用Intent对象指定AIDL服务的ID，也就是&lt;action&gt;标签中android:name属性的值。在绑定时需要一个ServiceConnection对象。创建ServiceConnection对象的过程中如果绑定成功，系统会调...&nbsp;&nbsp;<a href='http://www.blogjava.net/caizh2009/archive/2010/11/19/338490.html'>阅读全文</a><img src ="http://www.blogjava.net/caizh2009/aggbug/338490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-11-19 16:58 <a href="http://www.blogjava.net/caizh2009/archive/2010/11/19/338490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>建立AIDL服务的步骤（1）</title><link>http://www.blogjava.net/caizh2009/archive/2010/11/19/338489.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Fri, 19 Nov 2010 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/11/19/338489.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/338489.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/11/19/338489.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/338489.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/338489.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://book.51cto.com/art/201006/207070.htm建立AIDL服务的步骤（1）建立AIDL服务要比建立普通的服务复杂一些，具体步骤如下：（1）在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码，但会稍有不同。详细介绍见实例52的内容。（2）如果aidl文件的内容是正确的，ADT...&nbsp;&nbsp;<a href='http://www.blogjava.net/caizh2009/archive/2010/11/19/338489.html'>阅读全文</a><img src ="http://www.blogjava.net/caizh2009/aggbug/338489.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-11-19 16:56 <a href="http://www.blogjava.net/caizh2009/archive/2010/11/19/338489.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android aidl 实例</title><link>http://www.blogjava.net/caizh2009/archive/2010/11/19/338481.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Fri, 19 Nov 2010 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/11/19/338481.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/338481.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/11/19/338481.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/338481.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/338481.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://blog.chinaunix.net/u3/90876/showart_2200991.html在Android中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢? 显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE中,...&nbsp;&nbsp;<a href='http://www.blogjava.net/caizh2009/archive/2010/11/19/338481.html'>阅读全文</a><img src ="http://www.blogjava.net/caizh2009/aggbug/338481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-11-19 15:41 <a href="http://www.blogjava.net/caizh2009/archive/2010/11/19/338481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>俺拽汉化从未如此简单-APKTool使用教材</title><link>http://www.blogjava.net/caizh2009/archive/2010/11/19/338448.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Fri, 19 Nov 2010 01:51:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/11/19/338448.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/338448.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/11/19/338448.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/338448.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/338448.html</trackback:ping><description><![CDATA[http://zenz.ourcafe.mobi/archives/216
<div>
<div class="post_content">
<p>在有APKTool之前，Android软件的汉化是一件非常痛苦的事情。例如汉化狂人的汉化工具，那都是直接修改二进制文件的，首先
是寻找需要修改的字符串苦难（当然汉化狂人已经做得不错了），然后修改的字符串长度还要注意中文长度不能长过原来的文字&#8230;&#8230;个中郁闷就不细说了。</p>
<p>APKTool可以说是一个革命性的工具，有了APKTool之后，可以说，俺拽软件的汉化工作到了一个前所未有的简单程度。<br />
闲话不说，我们用汉化实例来证明APKTool的方便简单，在动手之前，需要去 <a href="http://code.google.com/p/android-apktool/" target="_blank">APKTool</a> 的网站把工具下载下来。当然也可以下载我已经打包的 <a href="http://zenz.ourcafe.mobi/files/android/APKTool.zip" target="_blank">APKTool.zip</a>(Windows下使用)。</p>
<p>确保你的电脑已经安装了JDK1.6（JRE1.6也可以），而且安装了一个优秀的编辑软件（推荐UltraEdit），把APKTool解压到随便哪个你认为操作起来方便的目录。如果都好了，我们动手吧：</p>
<p><img class="alignnone size-full wp-image-218" title="APKTOOL01" src="http://zenz.ourcafe.mobi/wp-content/uploads/2010/04/Clipboard01.jpg" alt="" height="278" width="433" /></p>
<p>第一步，把需要汉化的文件（以汉化ColorNote为例）放到APKTool所在目录，然后命令行进入APKTool目录，执行下面的命令：</p>
<p>apktool &nbsp;d &nbsp;ColorNote.apk &nbsp;ColorNote</p>
<p>这句命令的意思是，对ColorNote.apk这个程序进行反编译，获得的文件放在当前目录下的ColorNote目录中。正常反编译的话，能看到下面的提示：</p>
<div id="_mcePaste">I: Baksmaling&#8230;</div>
<div id="_mcePaste">I: Decoding resource table&#8230;</div>
<div id="_mcePaste">I: Decoding resources&#8230;</div>
<div id="_mcePaste">I: Copying assets and libs&#8230;</div>
<p>反编译完成，会在APKTool的目录下面，出现一个名叫ColorNote的目录，进去看看，是这个样子的！</p>
<p><img class="alignnone size-full wp-image-219" title="APKTOOL02" src="http://zenz.ourcafe.mobi/wp-content/uploads/2010/04/Clipboard02.jpg" alt="" height="278" width="433" /></p>
<p>用UltraEdit打开这个AndroidManifest.xml看看？哈哈，是纯文本文件呀！在打开res目录中的values中随便一个文
件看看？也是纯文本文件啊！也就是说，只要一个UltraEdit，我们就可以轻轻松松进行汉化了（就把需要的字符串转换成中文就可以了，也不用考虑长度
了！）至于要汉化哪些内容，这个大家自己研究吧，不用我详细说，也没有办法详细说的吧？（事实上，除了XML的文本资源文件外，老外写的很多程序，字符串
都是hard
coding在执行代码里面的，APKTool反编译会得到smali伪代码，有些在XML资源里面找不到的字符串，去看看smali的代码吧。）</p>
<p>中间的翻译过程我们跳过去，例如我们已经翻译好了，就在APKTool目录下执行下面的命令行：</p>
<p>apktool b ColorNote</p>
<p>这条命令是告诉APKTool，把这个ColorNote目录里的东西编译打包成APK程序</p>
<p>I: Checking whether sources has changed&#8230;</p>
<p>I: Smaling&#8230;</p>
<p>I: Checking whether resources has changed&#8230;</p>
<p>I: Building resources&#8230;</p>
<p>I: Building apk file&#8230;</p>
<p>生成的APK程序在哪里呢？在ColorNote\Dist目录里面，名字是out.apk</p>
<p>我们把这个out.apk文件签名之后安装看看？哈哈！完美中文汉化的俺拽程序来了！(当然，这要看汉化者的功力了。）</p>
<script></script>
<p class="akpc_pop">Popularity: 76%</p>
</div>
</div>
<img src ="http://www.blogjava.net/caizh2009/aggbug/338448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-11-19 09:51 <a href="http://www.blogjava.net/caizh2009/archive/2010/11/19/338448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android Activity和Intent机制学习笔记</title><link>http://www.blogjava.net/caizh2009/archive/2010/11/15/338089.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Mon, 15 Nov 2010 06:13:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/11/15/338089.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/338089.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/11/15/338089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/338089.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/338089.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ActivityAndroid中，Activity是所有程序的根本，所有程序的流程都运行在Activity之中，Activity具有自己的生命周期（见http://www.cnblogs.com/feisky/archive/2010/01/01/1637427.html，由系统控制生命周期，程序无法改变，但可以用onSaveInstanceState保存其状态）。对于Activity，关...&nbsp;&nbsp;<a href='http://www.blogjava.net/caizh2009/archive/2010/11/15/338089.html'>阅读全文</a><img src ="http://www.blogjava.net/caizh2009/aggbug/338089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-11-15 14:13 <a href="http://www.blogjava.net/caizh2009/archive/2010/11/15/338089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android 参考别人的UI设计</title><link>http://www.blogjava.net/caizh2009/archive/2010/11/15/338081.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Mon, 15 Nov 2010 05:31:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/11/15/338081.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/338081.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/11/15/338081.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/338081.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/338081.html</trackback:ping><description><![CDATA[手机上的应用程序，别人的界面设计的很漂亮，很想知道别人的怎么设计的，我应该怎么做呢？
<br />
在没有遇到这个工具前 我是通过破解别人的程序去查看他的设计的。
<br />
那天无意中在 tools这个文件夹下发现这个文件 hierarchyviewer.bat，Google一下发现帮你分析应用程序UI布局。
<br />
现在我们开始使用它吧：
<br />
第一步，双击（废话），出现一个灰色的界面，大家不要急，这是因为它没有发现运行的android程序呢
<br />
第二步：启动android程序，（或者连接android手机），你会发现在 Hierarchy Viewer 的 Devices里有 emulator-5554(这个是我的模拟器)，然后选择 start servier
<br />
如图
<br />
<br />
<img class="magplus" title="点击查看原始大小图片" src="http://dl.javaeye.com/upload/attachment/342034/3c9855eb-7277-39c6-a620-1d9a4f65aca3.jpg" height="144" width="650" alt="" />
<br />
选择 MainActivity，点击Load view Hierarchy
<br />
如图
<br />
<br />
<img class="magplus" title="点击查看原始大小图片" src="http://dl.javaeye.com/upload/attachment/342036/02e3ef90-e448-39e0-bf87-d058503d51bf.jpg" height="574" width="650" alt="" />
<br />
你还可以通过左下角的按钮交换到界面视图
<br />
<br />
<img class="magplus" title="点击查看原始大小图片" src="http://dl.javaeye.com/upload/attachment/342044/ec18e7d3-6d53-3bae-a6fb-17acd720e7c8.jpg" height="560" width="650" alt="" />
<br />
<br />
这就是你手机上看到的效果，看到蓝色的细线没有？你可以拖动他，右边会显示他的颜色的坐标
<br />
你也可以把这些东西导出来，怎么样 好用吧
<img src ="http://www.blogjava.net/caizh2009/aggbug/338081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-11-15 13:31 <a href="http://www.blogjava.net/caizh2009/archive/2010/11/15/338081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android ListView详解</title><link>http://www.blogjava.net/caizh2009/archive/2010/11/14/338033.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Sun, 14 Nov 2010 08:28:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/11/14/338033.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/338033.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/11/14/338033.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/338033.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/338033.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转载自：http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html在android开发中ListView是比较常用的组件，它以列表的形式展示具体内容，并且能够根据数据的长度自适应显示。抽空把对ListView的使用做了整理，并写了个小例子，如下图。&nbsp;&nbsp;列表的显示需要三个元素：1．ListVeiw ...&nbsp;&nbsp;<a href='http://www.blogjava.net/caizh2009/archive/2010/11/14/338033.html'>阅读全文</a><img src ="http://www.blogjava.net/caizh2009/aggbug/338033.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-11-14 16:28 <a href="http://www.blogjava.net/caizh2009/archive/2010/11/14/338033.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从零开始学Android</title><link>http://www.blogjava.net/caizh2009/archive/2010/07/07/325426.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Wed, 07 Jul 2010 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/07/07/325426.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/325426.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/07/07/325426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/325426.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/325426.html</trackback:ping><description><![CDATA[<p><span style="font-size: small;">从零开始。 <br />
<br />
&gt;1 下载Android SDK
,然后带着不求甚解的态度去阅读 SDK 里的官方文档。 <br />
&nbsp;&nbsp; 没有手机软件开发经验、Java 以及 eclipse
使用经验的朋友不必担心，我也是一样。 <br />
&nbsp;&nbsp; 刚开始接触不可能一下就看明白，先大体扫一下官方文档，了解一下基本概念，不需要完全理解， <br />
&nbsp;&nbsp;
有点印象就行了。 <br />
<br />
&gt;2 去
http://www.eoeandroid.com/viewthread.php?tid=772&amp;extra=page%3D1 <br />
&nbsp;&nbsp;
下载 eoe 特刊~ 写的很不错，你首先需要看完第一期，就可以把开发环境搭建好了。 <br />
&nbsp;&nbsp; 其他几期可以稍后再看。 <br />
&nbsp; <br />
&gt;3
查阅官方文档，按照里边的 hello world 教程一步一步做，很快你的第一个 android 项目就可以 <br />
&nbsp;&nbsp; 成功运行了！ <br />
<br />
&gt;4
接下来你应该学习官方文档里的记事本了，这个要稍微花点时间，做的过程可能有一些疑问，没关系， <br />
&nbsp;&nbsp; 大胆忽略，只要可以成功运行即可。 <br />
<br />
&gt;5
看了一大堆英文的东西，也有不少疑问了，应该看一些中文的文档来加深理解了。 <br />
&nbsp;&nbsp; 强烈推荐&nbsp; 深入淺出 Android --
Google 手持設備應用程式設計入門&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;
http://code.google.com/p/androidbmi/wiki/DiveIntoAndroid <br />
&nbsp;&nbsp;
虽然是繁体的，但是文章的质量相当高，看完之后基本上就可以算是入门了！ <br />
<br />
&gt;6 接下来，建议把 eoe
特刊的其它几期都看完，相信你对一些常见的开发需求就很有把握了。 <br />
<br />
&gt;7 请加入hong老大建的群，这里有很多对android
感兴趣 的兄弟，大家可以一起探讨。 <br />
&nbsp;&nbsp;&nbsp;
http://groups.google.com/group/china-android-dev <br />
&nbsp; <br />
&gt;8
推荐几个不错的博客， <br />
&nbsp;&nbsp; http://haric.javaeye.com/&nbsp; <br />
&nbsp;&nbsp;
http://rayleung.javaeye.com/ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&gt;9 可以经常去
http://www.eoeandroid.com/forumdisplay.php?fid=27 这里逛逛。 <br />
<br />
&gt;10
想开始做app赚钱了？ 呵呵，把 javaeye 里移动编程板块的精华良好贴都翻一遍吧~ 祝福你！ <br />
</span></p>
<p><span style="font-size: x-small;"><span style="font-size: small;">转自：</span><a href="http://www.javaeye.com/topic/473980"><span style="font-size: small;">http://www.javaeye.com/topic/473980</span></a></span></p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/325426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-07-07 11:00 <a href="http://www.blogjava.net/caizh2009/archive/2010/07/07/325426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>史上最全的android开发资料大集合</title><link>http://www.blogjava.net/caizh2009/archive/2010/06/11/323342.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Fri, 11 Jun 2010 05:29:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/06/11/323342.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/323342.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/06/11/323342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/323342.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/323342.html</trackback:ping><description><![CDATA[这个可是我从各处搜集来的资料，上传到了我的资源里，供大家下载学习，希望大家支持一下<br />
1、【eoeAndroid特刊】第一期 Andriod
1.5 SDK简介  <a href="http://download.csdn.net/source/2399809" target="_blank">http://download.csdn.net/source/2399809</a><br />
<br />
2、
【eoeAndroid特刊】第二期 图像处理篇（1）  <a href="http://download.csdn.net/source/2399814" target="_blank">http://download.csdn.net/source/2399814</a><br />
<br />
3、
【eoeAndroid特刊】第三期 Android Market及应用发布  <a href="http://download.csdn.net/source/2399818" target="_blank">http://download.csdn.net/source/2399818</a><br />
<br />
4、
【eoeAndroid特刊】第五期 Android widget  <a href="http://download.csdn.net/source/2399825" target="_blank">http://download.csdn.net/source/2399825</a><br />
<br />
5、
【eoeAndroid特刊】第六期 数据通信-成为Android数据流大师 <a href="http://download.csdn.net/source/2399830" target="_blank">http://download.csdn.net/source/2399830</a><br />
<br />
6、
【eoeAndroid特刊】第七期 NDK  <a href="http://download.csdn.net/source/2400070" target="_blank">http://download.csdn.net/source/2400070</a><br />
<br />
7、
【eoeAndroid特刊】第八期 数据存储操作  <a href="http://download.csdn.net/source/2399834" target="_blank">http://download.csdn.net/source/2399834</a><br />
<br />
8、
【eoeAndroid特刊】第八期+ 开发技巧  <a href="http://download.csdn.net/source/2399841" target="_blank">http://download.csdn.net/source/2399841</a><br />
<br />
9、
【eoeAndroid特刊】第九期  <a href="http://download.csdn.net/source/2400075" target="_blank">http://download.csdn.net/source/2400075</a><br />
<br />
10、
android开发教程  <a href="http://download.csdn.net/source/2400084" target="_blank">http://download.csdn.net/source/2400084</a><br />
<br />
11、
android基础教程  <a href="http://download.csdn.net/source/2425923" target="_blank">http://download.csdn.net/source/2425923</a><br />
<br />
12、
Google手机开发《Android.A.Programmers.Guide》  <a href="http://download.csdn.net/source/2425883" target="_blank">http://download.csdn.net/source/2425883</a><br />
<br />
13、
Professional.Android.Application.Development.2009  <a href="http://download.csdn.net/source/2425899" target="_blank">http://download.csdn.net/source/2425899</a><br />
<br />
14、
Apress.Android.Essentials.Jul.2008  <a href="http://download.csdn.net/source/2425905" target="_blank">http://download.csdn.net/source/2425905</a><br />
<br />
15、
android开发入门与实践  <a href="http://download.csdn.net/source/2425931" target="_blank">http://download.csdn.net/source/2425931</a><br />
<br />
16、
android开发入门与实践源代码  <a href="http://download.csdn.net/source/2425935" target="_blank">http://download.csdn.net/source/2425935</a><br />
<br />
17、
Android应用框架原理和程序设计  <a href="http://download.csdn.net/source/2399790" target="_blank">http://download.csdn.net/source/2399790</a><br />
<br />
18、
android JNI 简介与实现  <a href="http://download.csdn.net/source/2425864" target="_blank">http://download.csdn.net/source/2425864</a><br />
<br />
19、
19、Android开发指南中文版 添加此链接：http://download.csdn.net/source/2426094<br />
20、android ADT-0.9.6  <a href="http://download.csdn.net/source/2399804" target="_blank">http://download.csdn.net/source/2399804</a><br />
<br />
21、
android-sdk2.2 <a href="http://developer.android.com/sdk/android-2.2.html" target="_blank">http://developer.android.com/sdk/android-2.2.html</a>&nbsp;
<br />
<br />
<br />
另外附视频资源网址<br />
《Google Android开发入门与实战随书视频》WMV[压缩包]  <a href="http://www.verycd.com/topics/2779532/" target="_blank">http://www.verycd.com/topics/2779532/</a><br />
上传最新资源：android中文帮助文档 http://download.csdn.net/source/2447570<br />
<img src ="http://www.blogjava.net/caizh2009/aggbug/323342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-06-11 13:29 <a href="http://www.blogjava.net/caizh2009/archive/2010/06/11/323342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>