﻿<?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-Enjoy yourself,and don't care about others' thinking!-随笔分类-Android</title><link>http://www.blogjava.net/TiGERTiAN/category/35704.html</link><description>----TiGERTiAN</description><language>zh-cn</language><lastBuildDate>Sun, 21 Aug 2016 22:27:20 GMT</lastBuildDate><pubDate>Sun, 21 Aug 2016 22:27:20 GMT</pubDate><ttl>60</ttl><item><title>Volley+Gson+MQTT实现一套接派单系统</title><link>http://www.blogjava.net/TiGERTiAN/archive/2016/08/20/431647.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Sat, 20 Aug 2016 04:23:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2016/08/20/431647.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/431647.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2016/08/20/431647.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/431647.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/431647.html</trackback:ping><description><![CDATA[Volley降低网络交互复杂度；<br />Gson简化了Json的处理，使得对象和Json报文之间的互相转换变得很容易，代码更简洁；<br />MQTT实现消息的推送还是很不错的；<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/431647.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2016-08-20 12:23 <a href="http://www.blogjava.net/TiGERTiAN/archive/2016/08/20/431647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android传感器介绍</title><link>http://www.blogjava.net/TiGERTiAN/archive/2015/11/18/428265.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Wed, 18 Nov 2015 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2015/11/18/428265.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/428265.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2015/11/18/428265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/428265.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/428265.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 大多数Android设备有内置的传感器，来测量运动，方向和各种环境条件。这些传感器能提供高精度和准确度的原始数据，如果你想监控设备三维运动或者位置，或者你想监控设备周围的环境变化，是非常有用的。例如，游戏可能跟踪设备重力传感器的数据，来推断复杂的用户首饰和动作，例如倾斜，震动，旋转，或者振幅。同样的，天气应用可能使用设备的温度传感器和湿度传感器的数据来计算和报告结露点，或者旅行应用可能使用磁场传感...&nbsp;&nbsp;<a href='http://www.blogjava.net/TiGERTiAN/archive/2015/11/18/428265.html'>阅读全文</a><img src ="http://www.blogjava.net/TiGERTiAN/aggbug/428265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2015-11-18 15:33 <a href="http://www.blogjava.net/TiGERTiAN/archive/2015/11/18/428265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>坑爹的Android新ADT</title><link>http://www.blogjava.net/TiGERTiAN/archive/2013/05/13/399233.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Mon, 13 May 2013 13:18:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2013/05/13/399233.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/399233.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2013/05/13/399233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/399233.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/399233.html</trackback:ping><description><![CDATA[Android Dependencies不能删除，libs下面不能有子目录，否则里面的jar包不会自动添加到Dependencies中，导致编译出来的包运行报错。<br /><br /><img src ="http://www.blogjava.net/TiGERTiAN/aggbug/399233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2013-05-13 21:18 <a href="http://www.blogjava.net/TiGERTiAN/archive/2013/05/13/399233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android应用内外签名比较</title><link>http://www.blogjava.net/TiGERTiAN/archive/2012/07/04/382227.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Wed, 04 Jul 2012 13:18:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2012/07/04/382227.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/382227.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2012/07/04/382227.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/382227.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/382227.html</trackback:ping><description><![CDATA[之前写了一片文章介绍了应用内外的签名比较（<a id="homepage1_HomePageDays_DaysList_ctl02_DayItem_DayList_ctl00_TitleUrl" href="http://www.blogjava.net/TiGERTiAN/archive/2012/05/27/379322.html" style="text-decoration: none; color: #1a8bc8; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 15px; font-weight: bold; line-height: 19px; background-color: #ffffff; ">在Android系统外部和内部读取Android应用的签名</a>），发现在某些机器上，读取安装包的签名有的时候为空，所以找了其他办法。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;String&nbsp;getPathWithPackageName(Context&nbsp;paramContext,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;paramString)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PackageManager&nbsp;pm&nbsp;=&nbsp;paramContext.getPackageManager();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PackageInfo&nbsp;pi&nbsp;=&nbsp;pm.getPackageInfo(paramString,&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(pi.applicationInfo.publicSourceDir);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;pi.applicationInfo.publicSourceDir;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(PackageManager.NameNotFoundException&nbsp;localNameNotFoundException)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;String&nbsp;getFileSignatureMd5(String&nbsp;filePath)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JarFile&nbsp;jarFile&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JarFile(filePath);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JarEntry&nbsp;jarEntry&nbsp;=&nbsp;jarFile.getJarEntry("AndroidManifest.xml");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(jarEntry&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Certificate[]&nbsp;certs&nbsp;=&nbsp;jarEntry.getCertificates();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;certBytes&nbsp;=&nbsp;certs[0].getEncoded();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;main&nbsp;=&nbsp;StringUtilities<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;.bytesToHexString(CryptoUtilities<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.encryptByMD5(certBytes));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("new&nbsp;to&nbsp;Char&nbsp;"&nbsp;+&nbsp;main.length()&nbsp;+&nbsp;"&nbsp;apk:"<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;main);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;main;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(CertificateEncodingException&nbsp;localCertificateEncodingException)&nbsp;{<br /><br />&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;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IOException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Handler&nbsp;handler3;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;Called&nbsp;when&nbsp;the&nbsp;activity&nbsp;is&nbsp;first&nbsp;created.&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;onCreate(Bundle&nbsp;savedInstanceState)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">super</span>.onCreate(savedInstanceState);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setContentView(R.layout.main);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;installedPath&nbsp;=&nbsp;getPathWithPackageName(<span style="color: #0000FF; ">this</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"cn.emagsoftware.gamehall");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("installedPath="&nbsp;+&nbsp;installedPath);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;installedSig&nbsp;=&nbsp;getFileSignatureMd5(installedPath);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("installedSig="&nbsp;+&nbsp;installedSig);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;apk&nbsp;=&nbsp;"/sdcard/1.apk";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;remoteSig&nbsp;=&nbsp;getFileSignatureMd5(apk);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("remoteSig="&nbsp;+&nbsp;remoteSig);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(installedSig.equals(remoteSig));<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/TiGERTiAN/aggbug/382227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2012-07-04 21:18 <a href="http://www.blogjava.net/TiGERTiAN/archive/2012/07/04/382227.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2012年第一季度移动互联网应用以及开发者现状报告</title><link>http://www.blogjava.net/TiGERTiAN/archive/2012/06/03/379840.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Sun, 03 Jun 2012 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2012/06/03/379840.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/379840.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2012/06/03/379840.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/379840.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/379840.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; text-indent: 2em; line-height: 23px; color: #333333; font-family: Tahoma, 宋体; background-color: #ffffff; "><span style="margin: 0px; padding: 0px; color: #696969; ">2012年，中国移动互联网相比此前，发展将更迅速，终端设备将更普及，那么，我们能从过去的第一季度，看出今年中国移动互联网会呈现怎样的发展趋势呢？</span></p><p style="margin: 0px; padding: 0px; text-indent: 2em; line-height: 23px; color: #333333; font-family: Tahoma, 宋体; background-color: #ffffff; "><span style="margin: 0px; padding: 0px; color: #696969; ">近期，我们根据友盟移动统计分析平台的部分数据，对中国移动应用发展现状进行了研究和分析，并且通过对广大移动应用开发者的调查透视了国内APP开发者的现状。希望能够为移动互联网创业者提供最有价值的参考！</span></p><p style="margin: 0px; padding: 0px; text-indent: 2em; line-height: 23px; color: #333333; font-family: Tahoma, 宋体; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; text-indent: 2em; line-height: 23px; color: #333333; font-family: Tahoma, 宋体; background-color: #ffffff; "><span style="margin: 0px; padding: 0px; font-size: 16px; "><span style="margin: 0px; padding: 0px; color: #696969; "><strong style="margin: 0px; padding: 0px; ">2011年3月&#8212;&#8212;2012年3月 TOP100应用增长趋势</strong></span></span></p><p style="margin: 0px; padding: 0px; text-indent: 2em; line-height: 23px; color: #333333; font-family: Tahoma, 宋体; background-color: #ffffff; "><a href="http://blog.umeng.com/wp-content/uploads/2012/06/1.jpg" rel="" target="" title="" style="margin: 0px; padding: 0px; text-decoration: none; color: #3f6dcc; cursor: url(http://blog.umeng.com/wp-content/plugins/auto-highslide/highslide/graphics/zoomin.cur), pointer; outline: none; "><img alt="" size-full=""  wp-image-1714"="" data-pinit="registered" height="465" src="http://blog.umeng.com/wp-content/uploads/2012/06/1.jpg" title="1" width="574" style="margin: 0px; padding: 0px 0px 18px; border: 0px; max-width: 100%; " /></a></p><p style="margin: 0px; padding: 0px; text-indent: 2em; line-height: 23px; color: #333333; font-family: Tahoma, 宋体; background-color: #ffffff; "><span style="margin: 0px; padding: 0px; color: #696969; ">&nbsp;&nbsp; &nbsp;&nbsp;从2011年的3月份到今年的3月份，移动应用无论是活跃用户还是日启动次数都有了十足的增长。我们按照应用的累计安装量作为排序标准，选取了TOP100的应用作为统计样本，研究后发现活跃用户和日启动均比去年的3月份增长了5倍之多。可见越来越多的用户开始接受并享用移动互联网为人们生活带来的便利。</span></p><p style="margin: 0px; padding: 0px; text-indent: 2em; line-height: 23px; color: #333333; font-family: Tahoma, 宋体; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; text-indent: 2em; line-height: 23px; color: #333333; font-family: Tahoma, 宋体; background-color: #ffffff; "><span style="margin: 0px; padding: 0px; font-size: 16px; "><span style="margin: 0px; padding: 0px; color: #696969; "><strong style="margin: 0px; padding: 0px; ">用户地理分布&amp;联网方式&amp;运营商分布</strong></span></span></p><p style="margin: 0px; padding: 0px; text-indent: 2em; line-height: 23px; color: #333333; font-family: Tahoma, 宋体; background-color: #ffffff; "><a href="http://blog.umeng.com/wp-content/uploads/2012/06/2.jpg" rel="" target="" title="" style="margin: 0px; padding: 0px; text-decoration: none; color: #3f6dcc; cursor: url(http://blog.umeng.com/wp-content/plugins/auto-highslide/highslide/graphics/zoomin.cur), pointer; outline: none; "><img alt="" size-full=""  wp-image-1715"="" data-pinit="registered" height="437" src="http://blog.umeng.com/wp-content/uploads/2012/06/2.jpg" title="2" width="576" style="margin: 0px; padding: 0px 0px 18px; border: 0px; max-width: 100%; " /></a></p><p align="left" style="margin: 0px; padding: 0px; text-indent: 2em; line-height: 23px; color: #333333; font-family: Tahoma, 宋体; background-color: #ffffff; "><span style="margin: 0px; padding: 0px; color: #696969; ">关于中国移动互联网用户的地理分布，广东、江苏、北京、浙江和福建五省或者直辖市排在了前五名的位置，占据了全国用户份额的40.7%。在2011年第三季度的时候，我们也发布一份数据报告,显示用户份额前五的省份或者直辖市是广东、江苏、浙江、北京和上海，占据全国用户份额的44.6%。另外，2011年第二季度前五名省份或直辖市所占总份额是49.4%。不难看出，移动互联网向二线城市蔓延的趋势依然是持续并且不可逆转的。</span></p><p style="margin: 0px; padding: 0px; text-indent: 2em; line-height: 23px; color: #333333; font-family: Tahoma, 宋体; background-color: #ffffff; "></p><p align="left" style="margin: 0px; padding: 0px; text-indent: 2em; line-height: 23px; color: #333333; font-family: Tahoma, 宋体; background-color: #ffffff; "><span style="margin: 0px; padding: 0px; color: #696969; ">关于联网方式和运营商，2G上网依然是一半上网用户的选择，占比51.2%。使用3G和WIFI的用户占比分别为14.6%和34.2%。联通和电信凭借其3G套餐和优惠购机业务，市场份额已经分别占据了20%和9.5%。</span></p><p align="left" style="margin: 0px; padding: 0px; text-indent: 2em; line-height: 23px; color: #333333; font-family: Tahoma, 宋体; background-color: #ffffff; ">&nbsp;</p><p align="left" style="margin: 0px; padding: 0px; text-indent: 2em; line-height: 23px; color: #333333; font-family: Tahoma, 宋体; background-color: #ffffff; "><span style="margin: 0px; padding: 0px; font-size: 16px; "><span style="margin: 0px; padding: 0px; color: #696969; "><strong style="margin: 0px; padding: 0px; ">国内移动应用开发者现状</strong></span></span></p><p style="margin: 0px; padding: 0px; text-indent: 2em; line-height: 23px; color: #333333; font-family: Tahoma, 宋体; background-color: #ffffff; "><a href="http://blog.umeng.com/wp-content/uploads/2012/06/3.jpg" rel="" target="" title="" style="margin: 0px; padding: 0px; text-decoration: none; color: #3f6dcc; cursor: url(http://blog.umeng.com/wp-content/plugins/auto-highslide/highslide/graphics/zoomin.cur), pointer; outline: none; "><img alt="" size-full=""  wp-image-1716"="" data-pinit="registered" height="397" src="http://blog.umeng.com/wp-content/uploads/2012/06/3.jpg" title="3" width="573" style="margin: 0px; padding: 0px 0px 18px; border: 0px; max-width: 100%; " /></a></p><p style="margin: 0px; padding: 0px; text-indent: 2em; line-height: 23px; color: #333333; font-family: Tahoma, 宋体; background-color: #ffffff; "><span style="margin: 0px; padding: 0px; color: #696969; ">友盟一直致力于为国内移动开发者提供最专业的服务，现在已经服务超过20000名开发者和开发团队，为他们提供专业的统计分析、应用联盟和开发组件产品。为了更好的服务移动互联网创业，我们在2012年第一季度邀请了广大移动开发者进行了一次全面的问卷调查。调查的几个重要结论如下：</span></p><ol style="margin: 0px; padding: 0px; color: #333333; font-family: Tahoma, 宋体; font-size: 12px; line-height: normal; background-color: #ffffff; "><li style="margin: 0px 0px 0px 63.55pt; padding: 0px; "><span style="margin: 0px; padding: 0px; color: #696969; "><span style="margin: 0px; padding: 0px; font-size: 14px; ">&nbsp;移动互联网个人开发者占比27%，其余为公司或者工作室</span></span></li><li style="margin: 0px 0px 0px 63.55pt; padding: 0px; "><span style="margin: 0px; padding: 0px; color: #696969; "><span style="margin: 0px; padding: 0px; font-size: 14px; ">&nbsp;团队人数小于5人的超过65%</span></span></li><li style="margin: 0px 0px 0px 63.55pt; padding: 0px; "><span style="margin: 0px; padding: 0px; color: #696969; "><span style="margin: 0px; padding: 0px; font-size: 14px; ">&nbsp;超过85%的开发者&amp;团队选择了Android平台</span></span></li><li style="margin: 0px 0px 0px 63.55pt; padding: 0px; "><span style="margin: 0px; padding: 0px; color: #696969; "><span style="margin: 0px; padding: 0px; font-size: 14px; ">72%以上的开发者开发的应用数量少于5款</span></span></li></ol><img src ="http://www.blogjava.net/TiGERTiAN/aggbug/379840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2012-06-03 10:16 <a href="http://www.blogjava.net/TiGERTiAN/archive/2012/06/03/379840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android中短信拦截解决方案</title><link>http://www.blogjava.net/TiGERTiAN/archive/2012/05/28/379348.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Mon, 28 May 2012 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2012/05/28/379348.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/379348.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2012/05/28/379348.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/379348.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/379348.html</trackback:ping><description><![CDATA[个人备份使用，有些垃圾数据，请自行删除。<br />配置文件：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span style="color: #0000FF; ">?&gt;</span><br /><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">manifest&nbsp;</span><span style="color: #FF0000; ">xmlns:android</span><span style="color: #0000FF; ">="http://schemas.android.com/apk/res/android"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;package</span><span style="color: #0000FF; ">="cn.a"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;android:versionCode</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;android:versionName</span><span style="color: #0000FF; ">="1.0"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-sdk&nbsp;</span><span style="color: #FF0000; ">android:minSdkVersion</span><span style="color: #0000FF; ">="7"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">application<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF0000; ">android:alwaysRetainTaskState</span><span style="color: #0000FF; ">="true"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:icon</span><span style="color: #0000FF; ">="@drawable/ic_launcher"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:label</span><span style="color: #0000FF; ">="@string/app_name"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">activity<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF0000; ">android:label</span><span style="color: #0000FF; ">="@string/app_name"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:name</span><span style="color: #0000FF; ">=".SMSReceiverActivity"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">intent-filter&nbsp;</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">action&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.intent.action.MAIN"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">category&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.intent.category.LAUNCHER"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">intent-filter</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">activity</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">receiver&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">=".SMSReceiver"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">intent-filter&nbsp;</span><span style="color: #FF0000; ">android:priority</span><span style="color: #0000FF; ">="2147483647"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">action&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.provider.Telephony.SMS_RECEIVED"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">category&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.intent.category.DEFAULT"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">intent-filter</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">intent-filter&nbsp;</span><span style="color: #FF0000; ">android:priority</span><span style="color: #0000FF; ">="2147483647"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">action&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.intent.action.BOOT_COMPLETED"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">intent-filter</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">receiver</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">service<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF0000; ">android:enabled</span><span style="color: #0000FF; ">="true"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:name</span><span style="color: #0000FF; ">=".MyService"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">service</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">application</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.INTERNET"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.ACCESS_NETWORK_STATE"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.INTERNET"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.SEND_SMS"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.READ_SMS"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.WRITE_SMS"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.RECEIVE_SMS"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.CALL_PHONE"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.READ_PHONE_STATE"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.READ_CONTACTS"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.PROCESS_OUTGOING_CALLS"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.CAMERA"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.RECORD_AUDIO"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.WRITE_CONTACTS"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.WAKE_LOCK"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.VIBRATE"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.DEVICE_POWER"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.WRITE_SETTINGS"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.WRITE_APN_SETTINGS"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.CHANGE_NETWORK_STATE"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.READ_OWNER_DATA"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.READ_PHONE_STATE"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.CHANGE_WIFI_STATE"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.ACCESS_NETWORK_STATE"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="com.android.launcher.permission.WRITE_SETTINGS"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="com.android.launcher.permission.INSTALL_SHORTCUT"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="com.android.launcher.permission.READ_SETTINGS"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.WRITE_EXTERNAL_STORAGE"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.ACCESS_WIFI_STATE"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.READ_SMS"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.RECEIVE_BOOT_COMPLETED"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">manifest</span><span style="color: #0000FF; ">&gt;</span></div>后台自动启动服务：<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;cn.a;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;android.app.Service;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.content.Intent;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.content.IntentFilter;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.os.IBinder;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MyService&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;Service&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IBinder&nbsp;onBind(Intent&nbsp;arg0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;onCreate(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("onCreate&nbsp;MyService");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntentFilter&nbsp;localIntentFilter&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IntentFilter("android.provider.Telephony.SMS_RECEIVED");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;localIntentFilter.setPriority(2147483647);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SMSReceiver&nbsp;localMessageReceiver&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SMSReceiver();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;registerReceiver(localMessageReceiver,&nbsp;localIntentFilter);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div>短信接收监听器：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;cn.a;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;android.content.BroadcastReceiver;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.content.Context;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.content.Intent;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.os.Bundle;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.telephony.SmsMessage;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;SMSReceiver&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;BroadcastReceiver&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;onReceive(Context&nbsp;context,&nbsp;Intent&nbsp;intent)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Boot&nbsp;system&nbsp;ing<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Intent&nbsp;service&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Intent(context,&nbsp;MyService.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.startService(service);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span style="color: #0000FF; ">else</span>{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("SMSReceiver,&nbsp;isOrderedBroadcast()="<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;isOrderedBroadcast());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bundle&nbsp;bundle&nbsp;=&nbsp;intent.getExtras();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;messages[]&nbsp;=&nbsp;(Object[])&nbsp;bundle.get("pdus");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SmsMessage&nbsp;smsMessage[]&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SmsMessage[messages.length];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;n&nbsp;=&nbsp;0;&nbsp;n&nbsp;&lt;&nbsp;messages.length;&nbsp;n++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;smsMessage[n]&nbsp;=&nbsp;SmsMessage.createFromPdu((<span style="color: #0000FF; ">byte</span>[])&nbsp;messages[n]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(smsMessage[n].getMessageBody().contains("hahaha"))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.abortBroadcast();<br />&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;System.out.println(smsMessage[n].getOriginatingAddress()&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;smsMessage[n].getMessageBody()&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;smsMessage[n].getIndexOnIcc());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.abortBroadcast();<br />&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;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><img src ="http://www.blogjava.net/TiGERTiAN/aggbug/379348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2012-05-28 11:07 <a href="http://www.blogjava.net/TiGERTiAN/archive/2012/05/28/379348.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Android系统外部和内部读取Android应用的签名</title><link>http://www.blogjava.net/TiGERTiAN/archive/2012/05/27/379322.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Sun, 27 May 2012 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2012/05/27/379322.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/379322.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2012/05/27/379322.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/379322.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/379322.html</trackback:ping><description><![CDATA[Android系统外读取签名（J2SE）：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;java.io.IOException;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.InputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.lang.ref.WeakReference;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.security.Signature;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.security.cert.*;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Enumeration;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.jar.JarEntry;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.jar.JarFile;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.logging.Level;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.logging.Logger;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Main&nbsp;{<br /><br /><span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Object&nbsp;mSync&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Object();<br /><span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;WeakReference&lt;<span style="color: #0000FF; ">byte</span>[]&gt;&nbsp;mReadBuffer;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;if&nbsp;(args.length&nbsp;&lt;&nbsp;1)&nbsp;{<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;System.out.println("Usage:&nbsp;java&nbsp;-jar&nbsp;GetAndroidSig.jar&nbsp;&lt;apk/jar&gt;");<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;System.exit(-1);<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; "><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;System.out.println(args[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">To&nbsp;char:&nbsp;3082023f308201a8a00302010202044c984ccc300d06092a864886f70d01010505003064310b300906035504061302434e3110300e060355040813074a69616e6773753110300e060355040713074e616e6a696e6731153013060355040a130c456d6167736f667477617265310d300b060355040b13045469616e310b3009060355040313024c75301e170d3130303932313036313232385a170d3338303230363036313232385a3064310b300906035504061302434e3110300e060355040813074a69616e6773753110300e060355040713074e616e6a696e6731153013060355040a130c456d6167736f667477617265310d300b060355040b13045469616e310b3009060355040313024c7530819f300d06092a864886f70d010101050003818d0030818902818100835c192e7385ff63ab7bc8469df0224caac1eeea054e6a9bca9d7f3915db090b2bc3cde0f587da732fe45ce55dba30fe3cda5dfbb9797d7b05d59794916d61d5678b3a40722eb09ede89f1e4135a289a8a8464de19d6aab2f2bd8a702e6f53107ef51f25985bdca1a8572eed13827aaf96f8fcfaefe00d31881058134964fd970203010001300d06092a864886f70d01010505000381810072881563e0b07637bf03a6862e3dd9e7dd7186a3355639937748a686119ad59a612a95c6eb8b87b05d0353fc69eefe1b195eafaa08c08f1bf4d20659821ed67fd93d387912af03589d42551affbb6bdfdf81c4e702b32df611a9fcc8ad309edc02d694c948690258245e429bfd0049fd65e284c35d86e046a8abb0a4ee218eff</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;args&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String[1];<br />&nbsp;&nbsp;args[0]&nbsp;=&nbsp;"WheresMyWater-12-16-11-PCL989699-signed.apk";<br /><br />&nbsp;&nbsp;String&nbsp;mArchiveSourcePath&nbsp;=&nbsp;args[0];<br /><br />&nbsp;&nbsp;WeakReference&lt;<span style="color: #0000FF; ">byte</span>[]&gt;&nbsp;readBufferRef;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;readBuffer&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">synchronized</span>&nbsp;(mSync)&nbsp;{<br />&nbsp;&nbsp;&nbsp;readBufferRef&nbsp;=&nbsp;mReadBuffer;<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(readBufferRef&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;mReadBuffer&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;readBuffer&nbsp;=&nbsp;readBufferRef.get();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(readBuffer&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;readBuffer&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">byte</span>[8192];<br />&nbsp;&nbsp;&nbsp;&nbsp;readBufferRef&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;WeakReference&lt;<span style="color: #0000FF; ">byte</span>[]&gt;(readBuffer);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;JarFile&nbsp;jarFile&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JarFile(mArchiveSourcePath);<br />&nbsp;&nbsp;&nbsp;java.security.cert.Certificate[]&nbsp;certs&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br /><br />&nbsp;&nbsp;&nbsp;Enumeration&nbsp;entries&nbsp;=&nbsp;jarFile.entries();<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(entries.hasMoreElements())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;JarEntry&nbsp;je&nbsp;=&nbsp;(JarEntry)&nbsp;entries.nextElement();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(je.isDirectory())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">continue</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(je.getName().startsWith("META-INF/"))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">continue</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;java.security.cert.Certificate[]&nbsp;localCerts&nbsp;=&nbsp;loadCertificates(jarFile,&nbsp;je,&nbsp;readBuffer);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(<span style="color: #0000FF; ">true</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("File&nbsp;"&nbsp;+&nbsp;mArchiveSourcePath&nbsp;+&nbsp;"&nbsp;entry&nbsp;"&nbsp;+&nbsp;je.getName()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;":&nbsp;certs="&nbsp;+&nbsp;certs&nbsp;+&nbsp;"&nbsp;("<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;(certs&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;?&nbsp;certs.length&nbsp;:&nbsp;0)&nbsp;+&nbsp;")");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(localCerts&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println("Package&nbsp;has&nbsp;no&nbsp;certificates&nbsp;at&nbsp;entry&nbsp;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;je.getName()&nbsp;+&nbsp;";&nbsp;ignoring!");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jarFile.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(certs&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;certs&nbsp;=&nbsp;localCerts;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Ensure&nbsp;all&nbsp;certificates&nbsp;match.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;certs.length;&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;found&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;localCerts.length;&nbsp;j++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(certs[i]&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;certs[i].equals(localCerts[j]))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;found&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!found&nbsp;||&nbsp;certs.length&nbsp;!=&nbsp;localCerts.length)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println("Package&nbsp;has&nbsp;mismatched&nbsp;certificates&nbsp;at&nbsp;entry&nbsp;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;je.getName()&nbsp;+&nbsp;";&nbsp;ignoring!");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jarFile.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;false</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;jarFile.close();<br /><br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">synchronized</span>&nbsp;(mSync)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;mReadBuffer&nbsp;=&nbsp;readBufferRef;<br />&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(certs&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;&amp;&amp;&nbsp;certs.length&nbsp;&gt;&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;N&nbsp;=&nbsp;certs.length;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;N;&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;charSig&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String(toChars(certs[i].getEncoded()));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Cert#:&nbsp;"&nbsp;+&nbsp;i&nbsp;+&nbsp;"&nbsp;&nbsp;Type:"&nbsp;+&nbsp;certs[i].getType()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"\nPublic&nbsp;key:&nbsp;"&nbsp;+&nbsp;certs[i].getPublicKey()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"\nHash&nbsp;code:&nbsp;"&nbsp;+&nbsp;certs[i].hashCode()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"&nbsp;/&nbsp;0x"&nbsp;+&nbsp;Integer.toHexString(certs[i].hashCode())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"\nTo&nbsp;char:&nbsp;"&nbsp;+&nbsp;charSig);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;System.err.println("Package&nbsp;has&nbsp;no&nbsp;certificates;&nbsp;ignoring!");<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(CertificateEncodingException&nbsp;ex)&nbsp;{<br />&nbsp;&nbsp;&nbsp;Logger.getLogger(Main.<span style="color: #0000FF; ">class</span>.getName()).log(Level.SEVERE,&nbsp;<span style="color: #0000FF; ">null</span>,&nbsp;ex);<br />&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IOException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;System.err.println("Exception&nbsp;reading&nbsp;"&nbsp;+&nbsp;mArchiveSourcePath&nbsp;+&nbsp;"\n"&nbsp;+&nbsp;e);<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(RuntimeException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;System.err.println("Exception&nbsp;reading&nbsp;"&nbsp;+&nbsp;mArchiveSourcePath&nbsp;+&nbsp;"\n"&nbsp;+&nbsp;e);<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;toChars(<span style="color: #0000FF; ">byte</span>[]&nbsp;mSignature)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;sig&nbsp;=&nbsp;mSignature;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;N&nbsp;=&nbsp;sig.length;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;N2&nbsp;=&nbsp;N*2;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;text&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">char</span>[N2];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j=0;&nbsp;j&lt;N;&nbsp;j++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>&nbsp;v&nbsp;=&nbsp;sig[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;d&nbsp;=&nbsp;(v&gt;&gt;4)&amp;0xf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text[j*2]&nbsp;=&nbsp;(<span style="color: #0000FF; ">char</span>)(d&nbsp;&gt;=&nbsp;10&nbsp;?&nbsp;('a'&nbsp;+&nbsp;d&nbsp;-&nbsp;10)&nbsp;:&nbsp;('0'&nbsp;+&nbsp;d));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;=&nbsp;v&amp;0xf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text[j*2+1]&nbsp;=&nbsp;(<span style="color: #0000FF; ">char</span>)(d&nbsp;&gt;=&nbsp;10&nbsp;?&nbsp;('a'&nbsp;+&nbsp;d&nbsp;-&nbsp;10)&nbsp;:&nbsp;('0'&nbsp;+&nbsp;d));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;text;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;java.security.cert.Certificate[]&nbsp;loadCertificates(JarFile&nbsp;jarFile,&nbsp;JarEntry&nbsp;je,&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;readBuffer)&nbsp;{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;We&nbsp;must&nbsp;read&nbsp;the&nbsp;stream&nbsp;for&nbsp;the&nbsp;JarEntry&nbsp;to&nbsp;retrieve<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;its&nbsp;certificates.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;InputStream&nbsp;is&nbsp;=&nbsp;jarFile.getInputStream(je);<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(is.read(readBuffer,&nbsp;0,&nbsp;readBuffer.length)&nbsp;!=&nbsp;-1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;not&nbsp;using</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;is.close();<br /><br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(java.security.cert.Certificate[])&nbsp;(je&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;?&nbsp;je.getCertificates()&nbsp;:&nbsp;<span style="color: #0000FF; ">null</span>);<br />&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IOException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;System.err.println("Exception&nbsp;reading&nbsp;"&nbsp;+&nbsp;je.getName()&nbsp;+&nbsp;"&nbsp;in&nbsp;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;jarFile.getName()&nbsp;+&nbsp;":&nbsp;"&nbsp;+&nbsp;e);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">null</span>;<br />}<br />}</div><br /><br />Android系统内读取签名：<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;cn.emagsoftware.test;<br /><br /><font color="#0000ff"><br /></font><span style="color: #0000FF; ">import</span>&nbsp;android.app.Activity;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.app.ProgressDialog;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.content.pm.PackageInfo;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.content.pm.PackageManager;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.content.pm.Signature;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.content.pm.PackageManager.NameNotFoundException;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.os.Bundle;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.os.Handler;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.os.Looper;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.os.Message;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.os.Process;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.webkit.WebView;<br /><span style="color: #0000FF; ">import</span>&nbsp;android.widget.TextView;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Test&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;Activity&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;toChars(<span style="color: #0000FF; ">byte</span>[]&nbsp;mSignature)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;sig&nbsp;=&nbsp;mSignature;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;N&nbsp;=&nbsp;sig.length;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;N2&nbsp;=&nbsp;N*2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;text&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">char</span>[N2];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j=0;&nbsp;j&lt;N;&nbsp;j++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>&nbsp;v&nbsp;=&nbsp;sig[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;d&nbsp;=&nbsp;(v&gt;&gt;4)&amp;0xf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text[j*2]&nbsp;=&nbsp;(<span style="color: #0000FF; ">char</span>)(d&nbsp;&gt;=&nbsp;10&nbsp;?&nbsp;('a'&nbsp;+&nbsp;d&nbsp;-&nbsp;10)&nbsp;:&nbsp;('0'&nbsp;+&nbsp;d));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;=&nbsp;v&amp;0xf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text[j*2+1]&nbsp;=&nbsp;(<span style="color: #0000FF; ">char</span>)(d&nbsp;&gt;=&nbsp;10&nbsp;?&nbsp;('a'&nbsp;+&nbsp;d&nbsp;-&nbsp;10)&nbsp;:&nbsp;('0'&nbsp;+&nbsp;d));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;text;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;Called&nbsp;when&nbsp;the&nbsp;activity&nbsp;is&nbsp;first&nbsp;created.&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;onCreate(Bundle&nbsp;savedInstanceState)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">super</span>.onCreate(savedInstanceState);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setContentView(R.layout.main);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">01-30&nbsp;21:11:07.507:&nbsp;I/System.out(23733):&nbsp;177496438&nbsp;/&nbsp;0xa946176<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">01-30&nbsp;21:39:36.702:&nbsp;I/System.out(26332):&nbsp;3082023f308201a8a00302010202044c984ccc300d06092a864886f70d01010505003064310b300906035504061302434e3110300e060355040813074a69616e6773753110300e060355040713074e616e6a696e6731153013060355040a130c456d6167736f667477617265310d300b060355040b13045469616e310b3009060355040313024c75301e170d3130303932313036313232385a170d3338303230363036313232385a3064310b300906035504061302434e3110300e060355040813074a69616e6773753110300e060355040713074e616e6a696e6731153013060355040a130c456d6167736f667477617265310d300b060355040b13045469616e310b3009060355040313024c7530819f300d06092a864886f70d010101050003818d0030818902818100835c192e7385ff63ab7bc8469df0224caac1eeea054e6a9bca9d7f3915db090b2bc3cde0f587da732fe45ce55dba30fe3cda5dfbb9797d7b05d59794916d61d5678b3a40722eb09ede89f1e4135a289a8a8464de19d6aab2f2bd8a702e6f53107ef51f25985bdca1a8572eed13827aaf96f8fcfaefe00d31881058134964fd970203010001300d06092a864886f70d01010505000381810072881563e0b07637bf03a6862e3dd9e7dd7186a3355639937748a686119ad59a612a95c6eb8b87b05d0353fc69eefe1b195eafaa08c08f1bf4d20659821ed67fd93d387912af03589d42551affbb6bdfdf81c4e702b32df611a9fcc8ad309edc02d694c948690258245e429bfd0049fd65e284c35d86e046a8abb0a4ee218eff</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PackageInfo&nbsp;pis&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.getPackageManager().getPackageInfo("com.xx.xx",&nbsp;PackageManager.GET_SIGNATURES);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Signature[]&nbsp;sigs&nbsp;=&nbsp;pis.signatures;<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;&nbsp;System.out.println("version&nbsp;code="&nbsp;+&nbsp;pis.versionCode);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(sigs[0].hashCode()+&nbsp;"&nbsp;/&nbsp;0x"&nbsp;+&nbsp;Integer.toHexString(sigs[0].hashCode()));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sig&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String(sigs[0].toChars());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("to&nbsp;Char&nbsp;"+sig.length()+"&nbsp;length:&nbsp;"&nbsp;+&nbsp;sig);<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;&nbsp;String&nbsp;apk&nbsp;=&nbsp;"/sdcard/xx.apk";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PackageInfo&nbsp;pi&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.getPackageManager().getPackageArchiveInfo(apk,&nbsp;PackageManager.GET_SIGNATURES);<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;&nbsp;String&nbsp;main&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String(pi.signatures[0].toChars());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("to&nbsp;Char&nbsp;"+main.length()+"&nbsp;apk:"&nbsp;+&nbsp;main);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(main.equals(sig));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(NameNotFoundException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;<br />}</div><br /><br /><img src ="http://www.blogjava.net/TiGERTiAN/aggbug/379322.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2012-05-27 17:28 <a href="http://www.blogjava.net/TiGERTiAN/archive/2012/05/27/379322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android 3.0 honeycomb TextView onDraw()方法无效</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/09/01/357772.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Thu, 01 Sep 2011 15:56:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/09/01/357772.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/357772.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/09/01/357772.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/357772.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/357772.html</trackback:ping><description><![CDATA[我在3.0中实现了一个自定义类，继承自TextView，实现了他的onDraw()方法，然而调用的时候发现始终不会触发onDraw方法，后来发现要在控件属性里面设置下android:text="1"等字符串才会调用onDraw方法，然而在2.X版本中没有这个问题，大Bug 啊<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/357772.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-09-01 23:56 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/09/01/357772.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android ListView item中有按钮(Button)不能点击或者条目不能点击的问题</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/03/19/346602.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Sat, 19 Mar 2011 09:03:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/03/19/346602.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/346602.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/03/19/346602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/346602.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/346602.html</trackback:ping><description><![CDATA[<span style="color: #ff00ff; "><span style="color: #ff00ff; border-collapse: collapse; font-size: 12px;"><font face="NSimsun"><span style="border-collapse: separate; color: #000000; font-family: Simsun; font-size: medium; ">增加了按钮之后，列表条目不能点击的原因是：需要把Button的相关属性设置成这样<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">android:focusable="false"</span></div>
不过在开发过程中，我有个动态获取图片并刷新列表的机制，发现每次调用完notifyDataSetChanged()方法之后Button都不能点击了，后来发现如果有图片动态加载那么每次都要重新inflate整个列表的条目，所以我干脆重载了notifyDataSetChanged()方法。<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">&nbsp;&nbsp; &nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Recycle&nbsp;bitmap&nbsp;resources<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;recycleBitmapRes()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(mConvertViews&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!</span><span style="color: #000000; ">mConvertViews.isEmpty())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collection</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">View</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;views&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;mConvertViews.values();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mConvertViews.clear();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(View&nbsp;view&nbsp;:&nbsp;views)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImageView&nbsp;icon&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(ImageView)&nbsp;view.findViewById(R.id.imgIcon);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(icon&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(icon.getDrawable()&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;icon.getDrawable()&nbsp;</span><span style="color: #0000FF; ">instanceof</span><span style="color: #000000; ">&nbsp;BitmapDrawable)&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;Bitmap&nbsp;bitmap&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;((BitmapDrawable)&nbsp;icon.getDrawable()).getBitmap();<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;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(bitmap&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!</span><span style="color: #000000; ">bitmap.isRecycled())&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;bitmap.recycle();<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;}<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;}<br />
&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;}</span></div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">&nbsp;&nbsp; &nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;notifyDataSetChanged(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">Avoiding&nbsp;that&nbsp;buttons&nbsp;cannot&nbsp;be&nbsp;pressed</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Utils.LogI(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">GameListAdapter</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">notifyDataSetChanged</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recycleBitmapRes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">super</span><span style="color: #000000; ">.notifyDataSetChanged();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
</span></font></span></span>
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/346602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-03-19 17:03 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/03/19/346602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[译]关于Activity和Task的设计思路和方法</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/02/26/345239.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Sat, 26 Feb 2011 07:59:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/02/26/345239.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/345239.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/02/26/345239.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/345239.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/345239.html</trackback:ping><description><![CDATA[<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">Activity和Task是Android Application Framework架构中最基础的应用，开发者必须清楚它们的用法和一些开发技巧。本文用大量的篇幅并通过引用实例的方式一步步深入全面讲解它们的基础原 理(underlying principles)和架构(mechanisms)，例如：Navigation、Multitasking、activity re-use、intents和activity stack等&#8230;大部分与其相关的应用模块。重点讲解开发过程中如何更准确的体现用户交互性的便捷和高效，同时也帮助分析Designers和 Developers在开发期间所要面对的问题。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">文中涉及到的实例有一部分是属于平台自带的application（例如：拨号程序等），另 外也有Google产品线中的一些有代表性的应用（例如：Google Map等）。建议大家亲自利用Emulator或者Android-powered device测试实例中的效果，这样可以帮助更加清晰的理解一些模块的含义。（注意：可能会因为硬件对于某些功能无法提供支持，所以有一些实例可能无法在 你的测试机中正常浏览）</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><img class="aligncenter size-full wp-image-491" title="Space" src="http://www.androidres.com/wp-content/uploads/2009/06/post_space.gif" alt="Space" width="1" height="10" /></p>
<h3 style="font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">首先需要清楚一些基础模块:</h3>
<ul style="font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">
    <li><a href="http://developer.android.com/guide/topics/fundamentals.html" target="_blank" style="text-decoration: underline; color: #0044b6; ">Applications</a></li>
    <li><a href="http://developer.android.com/reference/android/app/Activity.html" target="_blank" style="text-decoration: underline; color: #0044b6; ">Acitivities</a></li>
    <li><a href="http://developer.android.com/reference/java/util/Stack.html" target="_blank" style="text-decoration: underline; color: #0044b6; ">Activity Stack</a></li>
    <li><a href="http://developer.android.com/guide/topics/fundamentals.html" target="_blank" style="text-decoration: underline; color: #0044b6; ">Tasks</a></li>
</ul>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">以上这四个模块对于理解这篇文章非常重要，下边就来逐一的简单介绍其具体的含义和用法（也可以通过其链接直接查看官方文档）。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><strong><span style="color: #800000; ">Applications</span></strong></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">任何一个Android Application基本上是由一些<a href="http://www.androidres.com/?p=129" target="_blank" style="text-decoration: underline; color: #0044b6; ">Activities</a>组 成，当用户与应用程序交互时其所包含的部分Activities具有紧密的逻辑关系，或者各自独立处理不同的响应。这些Activities捆绑在一起成 为了一个处理特定需求的Application, 并且以&#8220;.apk&#8221;作为后缀名存在于文件系统中。Android平台默认下的应用程序 例如：Email、Calendar、Browser、Maps、Text Message、Contacts、Camera和Dialer等都是一个个独立的Apps。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><strong><span style="color: #800000; ">Activities</span></strong></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">上边已经提到Activities是构成Applications的主要组成部分，其实可以 更为具体的理解为Application仅仅是一个抽象的标签，它将系统内一部分Activities关联在一起，协同完成用户的特定需求。安装 Application的过程也可以简单理解为将其所包裹的Activities导入到当前的系统中，如果系统中已经存在了相同的Activities， 那么将会自动将其关联，而不会重复安装相同的Activities，避免资源的浪费。Application卸载的过程也会检查当前所关联的 Activities是否有被其它Application标签所关联，如果仅仅是提供当前的Application使用，那么将会彻底被移除，相反则不做 任何操作。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">用户与Application的交互行为大部分都是通过GUI来完成，在Android平台 可以有两种方式定义GUI，其中可以利用XML来预置静态的GUI元素，或者在Activity类的内部动态定义GUI元素。这两种不同的方法都是由 Activity作为驱动和响应用户交互事件的主体。当启动Application之后，至少需要一个包含有GUI信息的<a href="http://www.androidres.com/?p=129" target="_blank" style="text-decoration: underline; color: #0044b6; ">Activity</a>实例被创建。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">Activity的主体包括两个主要部分，其中一个是Content(data)，另外一个是响应用户交互事件的行为。列举一个Dialer例子的截图，其中包括四个部分：Dialer主界面、通讯录、查看联系人信息和添加新联系人。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><a href="http://www.androidres.com/wp-content/uploads/2009/06/contactsdialer.png" rel="lightbox[478]" style="text-decoration: underline; color: #0044b6; "><img class="size-medium wp-image-479 alignnone" title="Dialer Activity" src="http://www.androidres.com/wp-content/uploads/2009/06/contactsdialer-99x150.png" alt="Dialer Activity" width="99" height="150" /></a>&nbsp;<a href="http://www.androidres.com/wp-content/uploads/2009/06/contactslist.png" rel="lightbox[478]" style="text-decoration: underline; color: #0044b6; "><img class="size-medium wp-image-480 alignnone" title="Contacts list" src="http://www.androidres.com/wp-content/uploads/2009/06/contactslist-99x150.png" alt="Contacts list" width="99" height="150" /></a>&nbsp;<a href="http://www.androidres.com/wp-content/uploads/2009/06/contactview.png" rel="lightbox[478]" style="text-decoration: underline; color: #0044b6; "><img class="alignnone size-medium wp-image-481" title="Contact View" src="http://www.androidres.com/wp-content/uploads/2009/06/contactview-99x150.png" alt="Contact View" width="99" height="150" /></a>&nbsp;<a href="http://www.androidres.com/wp-content/uploads/2009/06/contactnew.png" rel="lightbox[478]" style="text-decoration: underline; color: #0044b6; "><img class="alignnone size-medium wp-image-482" title="Add New Contact" src="http://www.androidres.com/wp-content/uploads/2009/06/contactnew-99x150.png" alt="Add New Contact" width="99" height="150" /></a></p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">下面列举了更多比较有代表性的Applications和其所包含的Activities：</p>
<ul style="font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">
    <li>Email - activities to view folders, view list of messages, view a message, compose a message, and set up an account</li>
    <li>Calendar - activities to view day, view week, view month, view agenda, edit an event, edit preferences, and view an alert</li>
    <li>Camera - activities for running the camera, viewing the list of pictures, viewing a picture, cropping a picture, running the camcorder, viewing the list of movies, and viewing a movie</li>
    <li>Game - one activity to play the game, typically another for setup</li>
    <li>Maps - one activity to view a location on a map, a second for lists (such as turn list or friend list), and a third for details (friend location, status, photo)</li>
</ul>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">Application基本上是由四个模块组成：Activity、Service、Content Provider 和 Broadcast Receiver，其中<a href="http://www.androidres.com/?p=129" target="_blank" style="text-decoration: underline; color: #0044b6; ">Activity</a>是实现应用的主体。</p>
<h3 style="font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><span style="color: #800000; ">Activity Stack</span></h3>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">操作应用程序时，有时需要调用多个Activities来完成需求，例如：发送邮件程序，首 先是进入邮件主界面，然后启动一个新的Activity用于填写新邮件内容，同时可以调出联系人列表用于插入收件人信息等等。在这个操作过程中 Android平台有一个专门用于管理Activities堆栈的机制，其可以方便的线性记录Activities实例，当完成某个操作时，可以通过这个 导航功能返回之前的Activity（通过按操作台的&#8220;Back&#8221;）。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">每次启动新的Activity都将被添加到Activity Stack。用户可以方便的返回上一个Activity直到Home Screen，到达Home Screen后，将无法再继续查看堆栈记录（俗话说：到头了- Androidres.com）。如果当前Task被中止(Interrupting the task)，返回到系统主界面后启动了其它操作，当希望返回到前一个Task继续执行时，只需要再次通过主界面的Application launcher或者快捷方式启动这个Task的Root Activity便可返回其中止时的状态继续执行。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">相对于Views、Windows、Menus和Dialogs而言，Activity是唯 一可被记录在History stack中的数据，所以当你所设计的应用程序需要用户由A界面进入到次一级界面B，当完成操作后需要再次返回A,那么必须考虑将A看作为 Activity，否则将无法从历史堆栈中返回。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><strong><span style="color: #800000; ">Tasks</span></strong></p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">在Android平台上可以将Task简单的理解为由多个Activities共同协作完成某一项应用，而不管Activities具体属于哪个 Application。通过下边的图示可以更清晰的理解Applications、Tasks、Activities三者之间的关系<span style="color: #888888; ">&nbsp;（Androidres.com提供）</span>:</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: center; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><img class="aligncenter size-full wp-image-486" title="Activities tasks guideline 001" src="http://www.androidres.com/wp-content/uploads/2009/06/activities_tasks_guideline.jpg" alt="activities_tasks_guideline" width="529" height="391" /></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">Activities可以被看作为是独立存在于系统资源中，而且是作为实现具体应用的主体，Task将一些Activity关联起来实现一个更复杂的应用,单独或者多个Tasks可以被定义为一个Application。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">通常实现一个Task都会存在一个Root Activity，但并不是所有情况都如此，通过Application launcher、Home screen 的快捷方式或者 由 &#8220;Recent Tasks&#8221;（长时间按住Home键） 最近使用过的Task记录中启动。当从一个Activity中启动另外一个Activity时，Back键将作用于返回前一个Activity,与此同时 新开启的Activity将被添加到Activity Stack中。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">这里有两个被表示为Task的例子：</p>
<ul style="font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">
    <li>发送带有附件的邮件</li>
    <li>查看YouTube视频，并且通过Email的方式共享给其他联系人。</li>
</ul>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><strong>-&nbsp;</strong><strong><span style="color: #808080; ">Interrupting the Task</span></strong></p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">这是Task一个非常重要的特性，用户可以实时中止当前为完成的Task，新开启一个不同的Task，当新Task完成操作后，依然可以返回当上一 次中止的Task继续完成余下操作。这个特性大大方便了同时运行多个Tasks，并且可以方便的在他们之间切换。这里有两种方式可以从当前Task跳转为 其它Task（应用这两种方式切换Task，都允许返回到Task最初中止前的状态）。</p>
<ul style="font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">
    <li>系统抛出一个Notification，当前Task会被终止，跳转为Notification的Task。</li>
    <li>用户强制中止</li>
</ul>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">当然，除了这两种方式以外，还有另外一个特殊情况，算作为第三种方式来启动一个新的Task：Activity本身被定义为一个Task。例如： Maps和Browser就是属于第三种情况的Application，通过邮件中的一个地址来启动Maps Activity作为一个新的Task，或者通过邮件中的链接启动Browser来启动一个新的Task。当处在这种情况下，Back按键被触发后，将返 回到上一个Task(邮件），因为这些新的Tasks并不是通过Home Screen中的Application launcher或者快捷方式来启动。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><img class="aligncenter size-full wp-image-491" title="Space" src="http://www.androidres.com/wp-content/uploads/2009/06/post_space.gif" alt="Space" width="1" height="10" /></p>
<h3 style="font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">了解Activities和Tasks的基本原理</h3>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">请大家一定首先理解之前所提及的内容，如果对某些概念依然含混不清，请及时查阅更多资料（<a href="http://developer.android.com/" target="_blank" style="text-decoration: underline; color: #0044b6; ">官方文档</a>是最好的学习资料），否则无法快速理解接下来将要讲述的例子，甚至丧失阅读兴趣。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">接下来，将通过一些有代表性的实例了解关于Applications、Activities、Activities stack、Tasks和Intent等一些模块的最基本原理。从各个角度分析系统对于用户在不同模式下操作的反应原理。<span style="color: #800000; "><strong></strong></span></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><span style="color: #800000; "><strong>从Home启动一个Activity</strong></span></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">绝大部分的Application都由此启动（也有一些Application是通过其它 Application启动）。具体的方式有两种，其一是从系统的Application Launcher启动，另一种是直接由Home Screen的快捷方式。启动Application后，Root Activity会显示在当前窗口，并可直接供用户操作界面元素。官方给出了一个有关这个过程的图示，其实我感觉这个描述的还不够直观，凑合着用吧。大体 的过程是由Home下启动Email Application，在这个应用程序中可以直接提供给用户操作的是List Messages Activity，Home Activity切换为后台运行。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: center; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><img class="aligncenter size-full wp-image-488" title="hometaskbasics1a" src="http://www.androidres.com/wp-content/uploads/2009/06/hometaskbasics1a.jpg" alt="hometaskbasics1a" width="334" height="201" /></p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><span style="color: #800000; "><strong>应用Back或Home键离开当前Activity的区别</strong></span></p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">应用Back或者Home都可以离开当前Activity（基于Application的Root Activity），Home activity重新切换到foreground，然而二者最根本的区别在于用户是否还需要保留当前Activity的state。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><strong>- Back:</strong></p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">将会终止（Destroy）当前正在运行的Activity，返回到之前的Activity（如果是 Root Activity，那么将会直接返回到Home Activity）。官方给出了一个相关过程的图示，当用户正在操作List Messages Activity时，下拉邮件列表（改变了Scrolling状态），通过Back键返回到Home Activity之后，当再次通过Email Icon启动 List Messages Activity时，将会看到列表处在初始位置。通过这个演示可以了解到通过Back键离开当前Activity时，无法暂时保留住其State数据，当 再次启动时相当于重新创建了一个实例。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: center; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><img class="aligncenter size-full wp-image-489" title="hometaskbasics1b" src="http://www.androidres.com/wp-content/uploads/2009/06/hometaskbasics1b.jpg" alt="hometaskbasics1b" width="346" height="204" /></p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><strong>-Home:</strong></p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">利用Home取代Back返回的方式，当前Activity将被切换到Background，而不是被Destroied。这样的好吃是可以暂时保 留这个Activity的State信息，当再次通过Application launcher或者快捷方式启动时，可以返回到最后离开的状态。对比在Back中引用的例子，当再次由Home返回到Activity时，将会看到最后 一次操作所记录的Scroll状态，而不是默认的初始位置。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: center; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><img class="aligncenter size-full wp-image-490" title="hometaskbasics1c" src="http://www.androidres.com/wp-content/uploads/2009/06/hometaskbasics1c.jpg" alt="hometaskbasics1c" width="346" height="204" /></p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><strong>Exception(例外情况）</strong></p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">前边列举了两种典型的情况，同时还存在一些例外的情况，某些Activity从Background被&#8220;召唤&#8221;到foreground之后依然是相 当于重新创建了新实例，其有区别于前边所论述的结果。即便是暂时保存在Background模式下（没有被Destroied），其State数据也将丢 失。例如：Contacts 和 Gallery 等。当用户启动了Contact应用程序，并点选某个条目查看详细信息，如果通过Home键返回后，再次重复启动Contact应用程序时，看到的并不是 之前所打开的特定条目的详细信息，而是初始的默认界面。这个例子说明不是所有情况下通过Home键返回后都可以保存当前Activity的State信 息。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">另外一种是与Back键有关的特殊情况。前边提及到大部分的Activity通过Back键返回到Home Activity时，其自身将被彻底销毁，默认情况下Activity响应Back按键的方法被定义了Destroy行为。但对于某些特别情况，开发者可 以根据需求将相应Back按键事件的行为重新&#8220;override&#8221;，撤消默认的Destroy行为。音乐播放器是与其相关的一个典型应用，当用户在播放器 的Root Activity中触发Back按键后，转为Background模式下继续播放当前的音乐，同时Home Activity转为Foreground。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><strong>Activity的复用</strong></p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">在多个不同的Applications中，当遇到有相同目的应用时，会涉及到Activity的复用性问题，这在开发过程中是一个非常普遍的情况。 复用性一直被众多开发机构强调为节约成本，优化资源的最有效的机制。对于移动应用平台更加看重资源的最优化利用，复用性的应用在Android平台上无处 不在，通过两个比较基础的例子来具体的说明。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><span style="color: #808080; "><strong>- Contacts利用Gallery获得图像资源</strong></span></p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">众所周知Contacts是手机中最常用的应用程序，主要用于存储当前用户的联系人信息，其中需要包含联系人的头像信息。在Android平台中的图像信息是由Gallery管理，所以Contacts必然需要复用Gallery Activity来获取相应的图像信息。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">针对于Android或者其它平台开发应用程序都需要有良好的复用性意识，这个需要贯穿于项目的整个开发过程。包括如何利用当前系统的现有资源，或 者考虑到将来可能会被其它应用程序用于完成特定的需求。当用户正在调用的Intent filter不唯一时，系统将弹出一个供用户选择的对话框，这的确是一个完美的解决方法。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: center; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><img class="aligncenter size-full wp-image-499" title="reusinganactivity1" src="http://www.androidres.com/wp-content/uploads/2009/06/reusinganactivity1.jpg" alt="reusinganactivity1" width="298" height="339" /></p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">-&nbsp;<span style="color: #808080; "><strong>利用Messaging扩展Gallery共享功能</strong></span></p>
<p style="font: normal normal normal 12px/normal song, Verdana; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">用户通过Gallery查看当前系统中的图像资源，每次单独打开一幅图像资源都可以通过Menu -&gt; Share将当前的资源以附件形式插入新创建的Messaging中，并且以正常发送信息的方式将其共享给收件人。如果取消当前的共享行为，只需要通过 Back按键返回到Gallery Activity。相比较前一个例子的区别在于，Message Activity完成发送或者被取消操作，其不会返回任何信息。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: center; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><img class="aligncenter size-full wp-image-500" title="reusinganactivity2" src="http://www.androidres.com/wp-content/uploads/2009/06/reusinganactivity2.jpg" alt="reusinganactivity2" width="300" height="294" /></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">以上两个例子分别讲解了利用一系列的Activities来完成某一项需求，并且它们都调用了外部的Application资源。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><strong>Replacing an Activity</strong></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">目前要介绍的内容是关于在不同的Applications中，有相同Intent filter属性的Activities可相互间替换，这对于习惯Windows等操作系统的用户比较不容易理解。其实如果您足够细心，就可以发现之前的例子中有关于这里所提及情况。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">通常遇到这种情况发生时，一般都是因为外部具有相同功能的Activity A 在处理问题的能力方面要优于当前Application中默认的操作行为Activity B，系统会抛出一个可供选择的对话框，用户根据主观判断来选择最优的方式处理当前任务。通过一个比较容易理解的实例来说明整个过程，建议&#8220;动手能力强&#8221;的 同学可以通过模拟器亲自尝试。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">例如：用户在当前系统下加载了最新的Phone Ringtone Activity，取名为Rings Extended。如果用户通过Setting -&gt; Sounds&amp;Display -&gt; Phone Ringtone 来设置当前的铃音属性时，将会弹出一个包含有系统默认的Phone Ringtone Activity 和最新加载的Rings Extended两种可供选择的操作应用，同时在对话框中还提供了一种可以直接启动系统默认的操作方式选项。如果用户选择了Rings Extended，那么其将会被载入当前的线程中替代原有的默认操作行为，可以根据下面的图示来增强理解。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: center; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><img class="aligncenter size-full wp-image-501" title="replacinganactivity" src="http://www.androidres.com/wp-content/uploads/2009/06/replacinganactivity.png" alt="replacinganactivity" width="385" height="294" /></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><span style="color: #000000; "><strong>多任务同时运行（Multitasking）</strong></span></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">在之前的板块有专门提到关于Home和Back两种切换到Home Screen的方法和它们之间的差异性，这个章节将会重点涉及到系统可以同时处理多个实时运行的任务。如果用户正处于某个Application A开启状态时，通过Home按键切换回Home Activity的同时保留了此前Application A运行的状态信息，可以开启新程序的同时，也可以再次将Application A切换回Foreground。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">接下来通过一个有关Map应用的实例更加具体的了解其所涵盖的过程。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">首先的起始阶段分为三个步骤，</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">第一步，由Application Launcher启动Map应用程序，并且搜索一个具体的地理位置。假设当前的网络环境非常不理想，需要花费一定的时间Download地图数据。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">第二步，当系统需要花费较长时间加载当前地图信息数据时，保持当前Activity的状态，返回Home Activity启动其它的Applicaton，地图Activity切换到Background，而并不会中断加载进度（依然保持网络连接）。</p>
<blockquote style="font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; "><span style="color: #888888; ">注意：以上是Activity在默认条件下的<a href="http://developer.android.com/guide/topics/fundamentals.html#actlife" target="_blank" style="text-decoration: underline; color: #0044b6; ">反应行为</a>，其切换为Background状态后直接触发onStop()事件，开发者可以重新定义其方法。例如：强制Activity在转为Background状态下，终止网络连接。</span></p>
</blockquote>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">第三步，当前Map activity已经切换到Background状态下运行，Home Activity切换到Foreground。这时用户启动Calender activity，其将自动转为Foreground状态，同时获得操作焦点。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">将以上三个步骤用图示的方式表述：</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: center; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><img class="aligncenter size-full wp-image-502" title="hometaskbasics1d" src="http://www.androidres.com/wp-content/uploads/2009/06/hometaskbasics1d.jpg" alt="hometaskbasics1d" width="405" height="444" /></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">最后，退出当前Calender activity返回到Home，再次通过Maps图标将其处在Background状态的实例切换到Foreground。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: center; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><img class="size-full wp-image-506 aligncenter" title="hometaskbasics1e" src="http://www.androidres.com/wp-content/uploads/2009/06/hometaskbasics1e.jpg" alt="hometaskbasics1e" width="303" height="204" /></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">通过上边的例子看出用户通过Application Launcher同时运行多个<a href="http://developer.android.com/guide/practices/ui_guidelines/activity_task_design.html#tasks" target="_blank" style="text-decoration: underline; color: #0044b6; ">Tasks</a>，代表系统具备多任务处理机制 - Running multiple tasks。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><strong>启动Application的两种不同方式</strong></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">每个App都需要提供至少一个Entry point（翻译成&#8220;入口点&#8221;有点别扭，干脆保留原样）供用户或者系统调用其所关联的Activities，Application launcher中的小图标就是每个单独App的Entry Point。另外App也可以相互间通过Activity作为Entry Point来启动，可以将App所包含的每个Activity看作为潜在的Entry point。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">系统中的Phone Application同样具有两个Entry Points：Contacts和Dialer。下边的图示中可以了解到用户通过Application launcher启动Contacts Activity，选择其中某一个联系人之后，调用Dialer Activity拨打其所提供的电话号码。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: center; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><img class="aligncenter size-full wp-image-507" title="phoneactivitiesdiagram" src="http://www.androidres.com/wp-content/uploads/2009/06/phoneactivitiesdiagram.jpg" alt="phoneactivitiesdiagram" width="249" height="345" /></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><strong>Intents</strong></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">在现实世界中大家每时每刻都会与周围的环境发生互动，这个互动的过程首先要确定一种意识，例 如：感觉到口渴，需要水分补充。这种意识会引导自己以习惯的方式解决口渴问题，采用的方式可以多种多样，吃冰淇淋、喝水、嚼树叶等。类似于口渴的意识形态 被抽象为Intent，并将其看作是一种对象，这就是Android响应&#8220;意识&#8221;的方式。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">在Android平台上，用户的操作行为是由各种不同的事件组成，系统会将每个事件都抽象为 Intent对象，寻找解决这项需求的具体方法。抽象的Intent对象有两种形式，第一种是&#8220;明确&#8221;的Intent（Explicit Intent），在初始化的时候已经为这个Intent关联了特定的Activity。第二种是&#8220;不明确&#8221;的Intent（Implicit Intent），代表这个Intent没有明确关联Activity，当它被抛出后，系统在众多Activities中根据Intent filter来寻找与其匹配的处理方法。如果存在多个结果，用户可以根据需要选择合适的处理方法。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">引用一个具体的例子，单击一个mailto:info@androidres.com链接后，这个被抛出的Intent属于 Implicit Intent ，系统抓取了解决这个Intent的结果，将所有的结果供用户选择（Gmail或者Email）：</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: center; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><img class="aligncenter size-full wp-image-508" title="intentsdiagram" src="http://www.androidres.com/wp-content/uploads/2009/06/intentsdiagram.jpg" alt="intentsdiagram" width="393" height="301" /></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">下边给出更多系统默认的Intent关联列表：</p>
<ul style="font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">
    <li>View the list of contacts - resolves to a contact list viewer activity</li>
    <li>View a particular contact - resolves to a contact viewer activity</li>
    <li>Edit a particular contact - resolves to a contact editor activity</li>
    <li>Send to a particular email - resolves to an email activity</li>
    <li>Dial a phone number - resolves to a phone dialer activity</li>
    <li>View the list of images - resolves to an image list viewer activity</li>
    <li>View a particular image - resolves to an image viewer activity</li>
    <li>Crop a particular image - resolves to an image cropper activity</li>
</ul>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">Intent对象包含两个元素：</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">1）Action ：例如 查看、编辑、拨打电话、查看图像资源等等。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">2）Data：提供给某种行为的具体数据。加工果汁饮料，需要提供水果（黑心店除外）。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">参照官网的解释：<a href="http://developer.android.com/reference/android/content/Intent.html" target="_blank" style="text-decoration: underline; color: #0044b6; ">Intent Class</a>&nbsp;和&nbsp;<a href="http://developer.android.com/guide/topics/fundamentals.html#ifilters" target="_blank" style="text-decoration: underline; color: #0044b6; ">Intent Filters</a>。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><strong>Tasks相互间切换</strong></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">依然是应用实例来说明这个切换的过程。在这个例子中，用户编辑一个短消息，并且插入图像附件，但是在发送之前启动Calendar，随后切换回短消息编辑界面，最后发送信息。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">1）启动第一个Task：Messaging App，Home &gt; Messaging &gt; New Message &gt; Menu &gt; Attach &gt; Picture。插入图片的步骤需要调用Gallery Activity，它是一个独立的外部程序。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: center; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><img class="aligncenter size-full wp-image-509" title="hometaskswitching1a" src="http://www.androidres.com/wp-content/uploads/2009/06/hometaskswitching1a.png" alt="hometaskswitching1a" width="230" height="164" /></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: center; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><img class="aligncenter size-full wp-image-510" title="hometaskswitching1b" src="http://www.androidres.com/wp-content/uploads/2009/06/hometaskswitching1b.png" alt="hometaskswitching1b" width="230" height="210" /></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: center; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><img class="aligncenter size-full wp-image-511" title="hometaskswitching1c" src="http://www.androidres.com/wp-content/uploads/2009/06/hometaskswitching1c.png" alt="hometaskswitching1c" width="291" height="266" /></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">接下来启动另外一个Task，由于没有直接从当前的Activity运行Calendar，所以需要切换到Home。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">2）启动另外一个Application（Calendar）：Home &gt; Calendar</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: center; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><img class="aligncenter size-full wp-image-512" title="hometaskswitching2" src="http://www.androidres.com/wp-content/uploads/2009/06/hometaskswitching2.png" alt="hometaskswitching2" width="522" height="303" /></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">3）查看Calendar完成后，将Messaging由Background切换到Foreground模式，其中还包括了添加附件，并最终发送消息。</p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: center; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "><img class="aligncenter size-full wp-image-513" title="hometaskswitching3" src="http://www.androidres.com/wp-content/uploads/2009/06/hometaskswitching3.jpg" alt="hometaskswitching3" width="490" height="555" /></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; "></p>
<p style="font: normal normal normal 12px/normal song, Verdana; text-align: left; font-weight: bold; border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">至此，对于Android平台中两个比较核心元素： Activities和Tasks 的介绍基本告一段落，以后也许会有更多关于这方面的讨论，希望得到您的关注。另外，有些朋友或许已经看过官方的原文，而本站也再次有幸得到了您的通读，如 果在某些概念或者论述内容上存在遗漏或者误解，那么真诚的希望能够获得指正和帮助。</p>
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/345239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-02-26 15:59 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/02/26/345239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android键盘和触摸事件处理</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/02/22/344870.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Tue, 22 Feb 2011 11:41:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/02/22/344870.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/344870.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/02/22/344870.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/344870.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/344870.html</trackback:ping><description><![CDATA[<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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">activity和VIEW都能接收触摸和按键，如果响应事件只需要在继承类里复写事件函数即可</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">但是对于VIEW来说，我们如果不改变DRAW，不需要继承，所以如果想响应事件，则需要</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><span style="line-height: 19px; font-size: 10pt; color: #333333; font-family: 宋体; ">当一个视图（如一个按钮）被触摸时，该对象上的</span>&nbsp;<span lang="EN-US" style="line-height: 24px; font-size: 12pt; color: #007000; font-family: 宋体; ">onTouchEvent()</span>&nbsp;<span style="line-height: 19px; font-size: 10pt; color: #333333; font-family: 宋体; ">方法会被调用。不过，为了侦听这个事件，你必须扩展这个类并重写该方法。很明显，扩展每个你想使用的视图对象（只是处理一个事件）是荒唐的。这就是为什么视图类也包含了一个嵌套接口的集合，这些接口含有实现起来简单得多的回调函数。这些接口叫做事件侦听器</span>&nbsp;<span lang="EN-US" style="line-height: 19px; font-size: 10pt; color: #333333; font-family: Arial, sans-serif; "><a href="file:///D:/android-sdk-windows-1.5_r2/docs/guide/topics/ui/ui-events.html#EventListeners" style="text-decoration: none; color: #006bad; "><span style="line-height: 19px; color: blue; ">event listeners</span>&nbsp;</a></span><span style="line-height: 19px; font-size: 10pt; color: #333333; font-family: 宋体; ">，是用来截获用户和你的界面交互动作的&#8220;门票&#8221;。</span></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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">&nbsp;1.只有一个ACTIVITY得情况：</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">&nbsp;&nbsp;&nbsp;<strong>&nbsp;当鼠标键按下时（即触摸）</strong></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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">&nbsp;&nbsp; 首先触发dispatchTouchEvent</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">&nbsp;&nbsp; 然后触发onUserInteraction</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">&nbsp;&nbsp; 再次onTouchEvent</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">&nbsp;&nbsp; 如果是点击的话，紧跟着下列事件（点击分俩步，ACTION_DOWN,ACTION_up)</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">&nbsp; 触发dispatchTouchEvent</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">&nbsp; 再次onTouchEvent</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">&nbsp; 当ACTION_up事件时不会触发onUserInteraction（可查看源代码）</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">&nbsp;&nbsp;<strong>当键盘按下时</strong></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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">&nbsp;首先触发dispatchKeyEvent</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">&nbsp;然后触发onUserInteraction</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">&nbsp;再次onKeyDown</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">&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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">&nbsp;紧跟着触发dispatchKeyEvent</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">&nbsp;然后触发onUserInteraction</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">&nbsp;再次onKeyUp</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">&nbsp;注意与触摸不同，当松开按键时onUserInteraction也会触发。</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><span lang="EN-US" style="line-height: 18px; font-size: 7pt; color: #333333; font-family: 'Times New Roman', serif; ">&nbsp;&nbsp;&nbsp;</span><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; "><a href="file:///D:/android-sdk-windows-1.5_r2/docs/reference/android/app/Activity.html#dispatchTouchEvent%28android.view.MotionEvent%29" style="text-decoration: none; color: #006bad; "><span style="line-height: 22px; font-size: 11pt; color: blue; ">Activity.dispatchTouchEvent(MotionEvent)</span>&nbsp;</a></span><span lang="EN-US" style="line-height: 19px; font-size: 10pt; color: #333333; font-family: Arial, sans-serif; ">- 这允许你的活动可以在分发给窗口之前捕获所有的触摸事件。</span></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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><span lang="EN-US" style="line-height: 19px; font-size: 10pt; color: #333333; font-family: Arial, sans-serif; ">（同理</span>&nbsp;dispatchKeyEvent）</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">onUserInteraction ：Called whenever a key, touch, or trackball event is dispatched to the<br />
&nbsp;&nbsp;&nbsp;&nbsp; * activity.</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">2.activity里有一个LAYOUT,在布局里有个按钮。</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">如果在按钮上触发一个CLICK事件</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">首先触发ACTIVITY的dispatchTouchEvent</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">然后触发ACTIVITY的onUserInteraction</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">然后触发LAYOUT的dispatchTouchEvent</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">然后触发LAYOUT的onInterceptTouchEvent</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">然后触发BUTTON的onTouch（这是一个ACTION_DOWN事件）</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">紧跟着是一个ACTION_UP事件</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">触发ACTIVITY的dispatchTouchEvent</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">注意不再触发ACTIVITY的onUserInteraction，因为他对ACTION_UP不起作用。</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">然后触发LAYOUT的dispatchTouchEvent</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">然后触发LAYOUT的onInterceptTouchEvent</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">然后触发BUTTON的onTouch</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">最后触发BUTTON的onClick.</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">如果你在ONTOUCH事件里返回true,消费了此事件，那么ONCLICK将不会被响应</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">但是如果你不写ONCLICK事件，而ONTOUCH事件返回FLASE</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">那么最终事件序列：</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">11-23 17:19:44.313: INFO/activity(803): dispatchTouchEvent<br />
11-23 17:19:44.313: INFO/activity(803): onUserInteraction<br />
11-23 17:19:44.322: INFO/LinearLayout(803): dispatchTouchEvent<br />
11-23 17:19:44.333: INFO/LinearLayout(803): onInterceptTouchEvent<br />
11-23 17:19:44.341: INFO/button(803): onTouch&nbsp;<br />
11-23 17:19:44.441: INFO/activity(803): dispatchTouchEvent<br />
11-23 17:19:44.451: INFO/LinearLayout(803): dispatchTouchEvent<br />
11-23 17:19:44.451: INFO/LinearLayout(803): onInterceptTouchEvent<br />
11-23 17:19:44.461: INFO/button(803): onTouch</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">即事件不会再向上传递，估计是ONCLICK有默认响应不处理，而ONCLICK不会有返回值。</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">但是如果是继承了一个VIEW而且又覆写了onTouchEvent，他返回FALSE</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">当触摸事件发生时</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">11-23 17:25:59.691: INFO/activity(831): dispatchTouchEvent<br />
11-23 17:25:59.691: INFO/activity(831): onUserInteraction<br />
11-23 17:25:59.701: INFO/LinearLayout(831): dispatchTouchEvent<br />
11-23 17:25:59.701: INFO/LinearLayout(831): onInterceptTouchEvent<br />
11-23 17:25:59.701: INFO/button(831): onTouch&nbsp;<br />
11-23 17:25:59.701: INFO/Button(831): onTouchEvent<br />
11-23 17:25:59.701: INFO/LinearLayout(831): onTouchEvent<br />
11-23 17:25:59.701: INFO/activity(831): onTouchEvent<br />
11-23 17:25:59.822: INFO/activity(831): dispatchTouchEvent<br />
11-23 17:25:59.822: INFO/activity(831): onTouchEvent</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">奇怪的是，ONCLICK事件不再发生。</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">VIEW和ACTIVITY本身都有相应键盘事件的ONKEYUP和ONKEYDOWN</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">对于VIEW来说，你可以setOnKeyListener(new OnKeyListener(){<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; @Override<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public boolean onKey(</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">来响应键盘事件，如果你既对VIEW写了这个侦听，又覆写了ONKEYUP,DOWN事件，那么首先</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">进入ONKEY</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">比如用反向键把焦点切换到按钮上</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">事件序列：</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">11-23 17:23:14.392: INFO/activity(803): dispatchKeyEvent<br />
11-23 17:23:14.404: INFO/activity(803): onUserInteraction<br />
11-23 17:23:14.412: INFO/LinearLayout(803): dispatchKeyEvent<br />
11-23 17:23:14.412: INFO/button(803): onKey<br />
11-23 17:23:14.422: INFO/activity(803): onKeyUp</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">当按回车时</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">11-23 17:35:55.692: INFO/activity(831): dispatchKeyEvent<br />
11-23 17:35:55.713: INFO/activity(831): onUserInteraction<br />
11-23 17:35:55.722: INFO/LinearLayout(831): dispatchKeyEvent<br />
11-23 17:35:55.732: INFO/button(831): onKey<br />
11-23 17:35:55.813: INFO/activity(831): dispatchKeyEvent<br />
11-23 17:35:55.824: INFO/activity(831): onUserInteraction<br />
11-23 17:35:55.831: INFO/LinearLayout(831): dispatchKeyEvent<br />
11-23 17:35:55.831: INFO/button(831): onKey<br />
11-23 17:35:55.953: INFO/button(831): onClick</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">最后补充下：不需要那么复杂，如果对于控件想响应他的触摸事件，如果继承</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">则覆写ONTOUCHEVENT，如果不覆写则侦听ONTOUCH</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">如果覆写了ONTOUCHEVENT，则不再响应ONCLICK事件</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">如果写了ONCLICK，则不要再搞ONTOUCHEVENT了</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">所以ONCLICK和ONTOUCHEVENT二取一，另外如果有ONTOUCH侦听，那么此函数要先于其他函数执行</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">对于ONCLICK来说，要从头走俩便ONTOUCH，一次是DOWN,一次是UP</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">同样的对于ONKEY,以及ONKEYUP和DOWN</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">如果既覆写了ONKEYUODOWN，又SET了侦听ONKEY,那么ONKEY要优先执行，对于一个回车按键触发时</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; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">11-24 09:55:18.601: INFO/activity(951): dispatchKeyEvent<br />
11-24 09:55:18.611: INFO/activity(951): onUserInteraction<br />
11-24 09:55:18.621: INFO/LinearLayout(951): dispatchKeyEvent<br />
11-24 09:55:18.641: INFO/button(951): onKey<br />
11-24 09:55:18.711: INFO/activity(951): dispatchKeyEvent<br />
11-24 09:55:18.756: INFO/activity(951): onUserInteraction<br />
11-24 09:55:18.775: INFO/LinearLayout(951): dispatchKeyEvent<br />
11-24 09:55:18.791: INFO/button(951): onKey<br />
11-24 09:55:18.822: INFO/button(951): onClick</p>
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/344870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-02-22 19:41 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/02/22/344870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>onInterceptTouchEvent和onTouchEvent调用时序</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/02/22/344869.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Tue, 22 Feb 2011 11:33:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/02/22/344869.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/344869.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/02/22/344869.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/344869.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/344869.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: onInterceptTouchEvent()是ViewGroup的一个方法，目的是在系统向该ViewGroup及其各个childView触发onTouchEvent()之前对相关事件进行一次拦截，Android这么设计的想法也很好理解，由于ViewGroup会包含若干childView,因此需要能够统一监控各种touch事件的机会，因此纯粹的不能包含子view的控件是没有这个方法的，如Linea...&nbsp;&nbsp;<a href='http://www.blogjava.net/TiGERTiAN/archive/2011/02/22/344869.html'>阅读全文</a><img src ="http://www.blogjava.net/TiGERTiAN/aggbug/344869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-02-22 19:33 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/02/22/344869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mobile Web Best Practice</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/02/04/343900.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Fri, 04 Feb 2011 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/02/04/343900.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/343900.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/02/04/343900.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/343900.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/343900.html</trackback:ping><description><![CDATA[http://www.w3.org/TR/mobile-bp/<br />
http://developer.yahoo.com/performance/index.html<br />
http://code.google.com/speed/articles/
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/343900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-02-04 16:29 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/02/04/343900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>南京招聘Android/OPhone开发人员，待遇优</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/01/31/343815.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Mon, 31 Jan 2011 08:53:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/01/31/343815.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/343815.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/01/31/343815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/343815.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/343815.html</trackback:ping><description><![CDATA[公司:北京幻方朗睿软件科技有限公司南京分公司（中国移动游戏基地支撑公司）<br />
工作地点：南京<br />
岗位职责:<br />
Android平台应用软件开发<br />
Android平台应用界面定制<br />
岗位需求:<br />
1. 计算机或相关专业本科以上学历；<br />
2. 具备扎实的c/c++/java编程基础；<br />
3. 有1年以上OPhone/Android开发经验，熟悉Android SDK，并且开发过1~2款成熟产品； 熟悉图形的绘制流程，熟悉内存优化，熟悉线程的使用；<br />
4. 熟悉Android下电话、信息、数据库等运行原理，对JNI/NDK有研究者优先；<br />
5. 熟悉Android下网络通信机制，对Socket通信、TCP/IP和HTTP有较深刻的理解和经验，有网络编程经验；<br />
6. 有单元测试程序编写经验者优先；<br />
7. 具备良好的沟通能力和优秀的团队协作能力。<br />
<br />
环境好，待遇优。有意者请联系我：tigertian#gmail.com
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/343815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-01-31 16:53 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/01/31/343815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>google-common_intermediates等两个包missing的解决办法</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/01/26/343608.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Wed, 26 Jan 2011 15:38:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/01/26/343608.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/343608.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/01/26/343608.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/343608.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/343608.html</trackback:ping><description><![CDATA[将源代码目录下/frameworks/ex/common/java目录作为Java Build Path/Source包含进去即可。
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/343608.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-01-26 23:38 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/01/26/343608.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android弹出拨号界面和拨打电话实现</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/01/25/343499.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Tue, 25 Jan 2011 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/01/25/343499.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/343499.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/01/25/343499.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/343499.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/343499.html</trackback:ping><description><![CDATA[需要使用反射机制将ITelephony反射出来进行操作。<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;dial(String&nbsp;number)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">TelephonyManager</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;c&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;TelephonyManager.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;getITelephonyMethod&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getITelephonyMethod&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;c.getDeclaredMethod(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">getITelephony</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Class[])&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getITelephonyMethod.setAccessible(</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(SecurityException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(NoSuchMethodException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TelephonyManager&nbsp;tManager&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(TelephonyManager)&nbsp;getSystemService(Context.TELEPHONY_SERVICE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;iTelephony;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iTelephony&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(Object)&nbsp;getITelephonyMethod.invoke(tManager,(Object[])&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;dial&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;iTelephony.getClass().getDeclaredMethod(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">dial</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;String.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dial.invoke(iTelephony,&nbsp;number);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(IllegalArgumentException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(IllegalAccessException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(SecurityException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(NoSuchMethodException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(InvocationTargetException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;call(String&nbsp;number)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">TelephonyManager</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;c&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;TelephonyManager.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;getITelephonyMethod&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getITelephonyMethod&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;c.getDeclaredMethod(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">getITelephony</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Class[])&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getITelephonyMethod.setAccessible(</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(SecurityException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(NoSuchMethodException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TelephonyManager&nbsp;tManager&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(TelephonyManager)&nbsp;getSystemService(Context.TELEPHONY_SERVICE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;iTelephony;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iTelephony&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(Object)&nbsp;getITelephonyMethod.invoke(tManager,(Object[])&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;dial&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;iTelephony.getClass().getDeclaredMethod(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">call</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;String.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dial.invoke(iTelephony,&nbsp;number);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(IllegalArgumentException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(IllegalAccessException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(SecurityException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(NoSuchMethodException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(InvocationTargetException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/343499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-01-25 14:38 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/01/25/343499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>64位Ubuntu 10.10编译Android 2.3.1源代码</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/01/23/343404.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Sun, 23 Jan 2011 10:13:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/01/23/343404.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/343404.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/01/23/343404.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/343404.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/343404.html</trackback:ping><description><![CDATA[<meta charset="utf-8" />1、在虚拟机上安装64位Ubuntu 10.10，安装完成后进行系统升级。<br />
2、将源代码拷贝进去或者下载下来。<br />
3、sudo apt-get install&nbsp;git-core gnupg flex bison gperf build-essential zip curl sun-java6-jdk zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z1-dev<br />
4、所有都安装完成后进行编译。<br />
. build/envsetup.sh<br />
make -j4 PRODUCT-generic-eng
<br />
<br />
不要
<meta charset="utf-8" />choosecombo，否则会有很多莫名其妙的问题。
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/343404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-01-23 18:13 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/01/23/343404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android中短信拦截解决方案</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/01/23/343399.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Sun, 23 Jan 2011 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/01/23/343399.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/343399.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/01/23/343399.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/343399.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/343399.html</trackback:ping><description><![CDATA[经过测试，Android中是可以拦截短信的，解决方案如下：<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.tigertian.sms;<br />
<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;android.content.BroadcastReceiver;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;android.content.Context;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;android.content.Intent;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;android.os.Bundle;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;android.telephony.SmsMessage;<br />
<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;SMSReceiver&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;BroadcastReceiver&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;onReceive(Context&nbsp;context,&nbsp;Intent&nbsp;intent)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">SMSReceiver,&nbsp;isOrderedBroadcast()=</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;isOrderedBroadcast());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bundle&nbsp;bundle&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;intent.getExtras();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;messages[]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(Object[])&nbsp;bundle.get(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">pdus</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SmsMessage&nbsp;smsMessage[]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;SmsMessage[messages.length];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;n&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;messages.length;&nbsp;n</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;smsMessage[n]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;SmsMessage.createFromPdu((</span><span style="color: #0000FF; ">byte</span><span style="color: #000000; ">[])&nbsp;messages[n]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(smsMessage[n].getMessageBody().contains(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">hahaha</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.abortBroadcast();<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;&nbsp;System.out.println(smsMessage[n].getOriginatingAddress()</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">smsMessage[n].getMessageBody()</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">smsMessage[n].getIndexOnIcc());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</span></div>
<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">receiver&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">=".SMSReceiver"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">intent-filter&nbsp;</span><span style="color: #FF0000; ">android:priority</span><span style="color: #0000FF; ">="10000"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">action&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.provider.Telephony.SMS_RECEIVED"</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">action</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">category&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.intent.category.DEFAULT"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">intent-filter</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">receiver</span><span style="color: #0000FF; ">&gt;</span></div>
上面的代码是一个消息监听，监听接收短信的消息。我们可以从控制台打印信息里面看到，他是一个OrderedBroadcast，根据这一点我们就可以对短信机制进行拦截。如何拦截呢？<br />
<br />
首先要声明一个消息监听器，同时根据上面的配置文件需要在AndroidManifest.xml中配置好，注意它的优先级是10000，这一点很关键，因为OrderedBroadcast是根据优先级来传递消息的，优先级越高越先获取到消息，待处理完后才会传递给下一个监听器，如果当前监听器退出广播，那么后面的所有监听器都将无法收到消息。<br />
<br />
其次我们需要实现onReceive方法，根据上面的代码，我们可以从bundle中拿到短信内容并还原成SmsMessage，这样我们可以根据特定条件来判断哪些是需要我们拦截并且不要让用户知道的，哪些是我们可以放行的。需要我们拦截的短信，我们可以在收到后直接abortBroadcast()（上面的代码中是判断当短信内容包含hahaha的时候直接拦截），这样系统收件箱将无法接收到该条短信，继而也就不会有notification去通知用户。<br />
<br />
至此，应用编写好之后，短信拦截功能就完成了，当然基于此还可以做一些其他功能，这方面就看需求了。注意，优先级相同，则根据包名依次传递广播。<br />
<br />
想删除收件箱中已存在的短信，请参考Android源码SmsProvider类，可以在你的应用中使用ContentProvider机制进行操作。
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/343399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-01-23 15:52 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/01/23/343399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android  开发环境建立-gcc 的问题</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/01/22/343372.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Sat, 22 Jan 2011 05:19:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/01/22/343372.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/343372.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/01/22/343372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/343372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/343372.html</trackback:ping><description><![CDATA[<meta charset="utf-8" /><span style="font-size: 14px; line-height: 22px; ">
<p>漫长的编译开始了，当然成功不会一蹴而就的，不出所料，错误出现了</p>
<p>ost C: adb &lt;= system/core/adb/fdevent.c</p>
<p>&nbsp;</p>
<p>host Executable: adb (out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb)</p>
<p>&nbsp;</p>
<p>out/host/linux-x86/obj/STATIC_LIBRARIES/libzipfile_intermediates/libzipfile.a(centraldir.o): In function `memset':</p>
<p>&nbsp;</p>
<p>/usr/include/bits/string3.h:82: warning: memset used with constant zero length parameter; this could be due to transposed parameters</p>
<p>&nbsp;</p>
<p>true</p>
<p>&nbsp;</p>
<p>Install: out/host/linux-x86/bin/adb</p>
<p>&nbsp;</p>
<p>host C++: atree &lt;= build/tools/atree/atree.cpp</p>
<p>&nbsp;</p>
<p>host C++: atree &lt;= build/tools/atree/files.cpp</p>
<p>&nbsp;</p>
<p>host C++: atree &lt;= build/tools/atree/fs.cpp</p>
<p>&nbsp;</p>
<p>host Executable: atree (out/host/linux-x86/obj/EXECUTABLES/atree_intermediates/atree)</p>
<p>&nbsp;</p>
<p>true</p>
<p>&nbsp;</p>
<p>Install: out/host/linux-x86/bin/atree</p>
<p>&nbsp;</p>
<p>host C++: bb2sym &lt;= development/emulator/qtools/bb2sym.cpp</p>
<p>&nbsp;</p>
<p>host C++: bb2sym &lt;= development/emulator/qtools/trace_reader.cpp</p>
<p>&nbsp;</p>
<p>development/emulator/qtools/trace_reader.cpp: In function &#8216;char* ExtractDexPathFromMmap(const char*)&#8217;:</p>
<p>&nbsp;</p>
<p>development/emulator/qtools/trace_reader.cpp:1012: error: invalid conversion from &#8216;const char*&#8217; to &#8216;char*&#8217;</p>
<p>&nbsp;</p>
<p>development/emulator/qtools/trace_reader.cpp:1015: error: invalid conversion from &#8216;const char*&#8217; to &#8216;char*&#8217;</p>
<p>&nbsp;</p>
<p>make: *** [out/host/linux-x86/obj/EXECUTABLES/bb2sym_intermediates/trace_reader.o] 错误 1</p>
<p>继续求教于，Google和百度吧，原来是gcc版本的问题</p>
<p>$gcc --version</p>
<p>&nbsp;</p>
<p>gcc (Ubuntu 4.4.1-4ubuntu9) 4.4.1</p>
<p>&nbsp;</p>
<p>Copyright (C) 2009 Free Software Foundation, Inc.</p>
<p>&nbsp;</p>
<p>This is free software; see the source for copying conditions.&nbsp; There is NO</p>
<p>&nbsp;</p>
<p>warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>研究了一下发现问题主要出在Ubuntu10.4预置了gcc的版本是4.4，该版本编译时对语法要求比较高，因此无法编译源代码，解决方法就是将gcc-4.4降级成gcc-4.3</p>
<p>&nbsp;</p>
<p>具体操作：<br />
<meta charset="utf-8" />
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; ">sudo apt-get remove gcc-4.4（卸载gcc-4.4）</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; ">sudo apt-get remove g++-4.4（
<meta charset="utf-8" />卸载g++-4.4）</p>
sudo apt-get install gcc-4.3（安装gcc-4.3）</p>
<p>sudo apt-get install g++-4.3（安装g++-4.3）</p>
<p>&nbsp;</p>
<p>安装完4.3版本后，执行gcc --version后会发现版本仍然是4.4，因为gcc已经和4.4版本进行了链接，因此需要对gcc重新进行链接</p>
<p>&nbsp;</p>
<p>具体操作：sudo ln -f /usr/bin/gcc-4.3 gcc</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sudo ln -f/usr/bin/g++-4.3 g++</p>
<p>&nbsp;</p>
<p>这样就可以用4.3版本的gcc和g++将原来的覆盖掉，重新进入android源码目录执行make就可以正常编译～～</p>
</span>
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/343372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-01-22 13:19 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/01/22/343372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>64bit Linux下error: gnu/stubs-32.h: No such file or directory错误解决办法</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/01/22/343370.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Sat, 22 Jan 2011 04:36:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/01/22/343370.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/343370.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/01/22/343370.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/343370.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/343370.html</trackback:ping><description><![CDATA[<meta charset="utf-8" /><span style="color: #111111; font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; font-size: 14px; line-height: 22px; ">
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "><span style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #ff0000; ">Q.</span>&nbsp;I'm getting the following error while compiling application under CentOS / RHEL / Fedora Linux 64 bit edition:</p>
<blockquote style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0.786em; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0.786em; border-left-width: 1px; border-left-style: solid; border-left-color: #dddddd; color: #666666; ">
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">/usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h:</strong></p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; ">No such file or directory</p>
</blockquote>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; ">How do I fix this error?<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
<span style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #009900; ">A.&nbsp;</span>You need to install the glibc-devel package. It contains the object files necessary for developing programs which use the standard C libraries (which are used by nearly all programs). If you are developing programs which will use the standard C libraries, your system needs to have these standard object files available in order to create the executables.</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; ">Install glibc-devel if you are going to develop programs which will use the standard C libraries.<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
<code style="padding-top: 0.667em; padding-right: 0.917em; padding-bottom: 0.667em; padding-left: 0.917em; margin-top: 0px; margin-right: 0px; margin-bottom: 1.833em; margin-left: 0px; line-height: 1.5em; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: #eeeeee; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.857em; overflow-x: auto; overflow-y: auto; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; display: block; background-position: 0px 0px; background-repeat: repeat repeat; ">#&nbsp;<span  style="color: #000000; font-family: 微软雅黑; line-height: 20px; font-size: 14px; ">apt-get install g++-multilib</span></code>
<meta charset="utf-8" />
</p>
<div><br />
</div>
<p>&nbsp;</p>
</span>
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/343370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-01-22 12:36 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/01/22/343370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Application保存全局变量</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/01/21/343326.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Fri, 21 Jan 2011 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/01/21/343326.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/343326.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/01/21/343326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/343326.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/343326.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;MyApp&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;Application&nbsp;{<br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;String&nbsp;myState;<br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;String&nbsp;getState(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;myState;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setState(String&nbsp;s){<br />
&nbsp;&nbsp;&nbsp;&nbsp;myState&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;s;<br />
&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Blah&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;Activity&nbsp;{<br />
<br />
&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;onCreate(Bundle&nbsp;b){<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;MyApp&nbsp;appState&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;((MyApp)getApplicationContext());<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;state&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;appState.getState();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
&nbsp;&nbsp;}<br />
}</span></div>
<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">application&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">=".MyApp"</span><span style="color: #FF0000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:icon</span><span style="color: #0000FF; ">="@drawable/icon"</span><span style="color: #FF0000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:label</span><span style="color: #0000FF; ">="@string/app_name"</span><span style="color: #0000FF; ">&gt;</span></div>
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/343326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-01-21 14:12 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/01/21/343326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[解决办法]development/simulator/app/DeviceManager.cpp:8: fatal error: wx/wxprec.h: No such file or directory (wx/setup.h: No such file or directory)</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/01/20/343287.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Thu, 20 Jan 2011 15:19:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/01/20/343287.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/343287.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/01/20/343287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/343287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/343287.html</trackback:ping><description><![CDATA[<div>development/simulator/app/DeviceManager.cpp:8: fatal error: wx/wxprec.h: No such file or directory</div>
<div>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<title></title>
<meta name="Generator" content="Cocoa HTML Writer" />
<meta name="CocoaVersion" content="1038.35" />
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
</style>
<p class="p1">1.tigertian@ubuntu:~/Developer/android_src$ apt-file search wxprec.h</p>
<p class="p1">wx2.4-headers: /usr/include/wx/wxprec.h</p>
<p class="p1">wx2.6-headers: /usr/include/wx-2.6/wx/wxprec.h</p>
<p class="p1">wx2.8-headers: /usr/include/wx-2.8/wx/wxprec.h<br />
<br />
</p>
<p class="p1">2.sudo apt-get install wx2.4<br />
wx-config --cflags</p>
</div>
<div><br />
</div>
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/343287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-01-20 23:19 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/01/20/343287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编译Android 2.3源码</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/01/20/343283.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Thu, 20 Jan 2011 14:24:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/01/20/343283.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/343283.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/01/20/343283.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/343283.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/343283.html</trackback:ping><description><![CDATA[<meta charset="utf-8" /><span style="font-family: Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; font-size: 12px; line-height: 20px; ">
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; ">前几天下载了Android 2.3.1的源代码并在Ubuntu 10.04(32位)上编译通过。这篇文章简要记录了下载、编译的过程。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; ">关于搭建Android开发环境的文章已经有很多，本文只简要介绍一下，做为备忘。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; "><span class="bold"><strong>[ 编译前的准备 ]</strong></span></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; ">这一步安装获取源代码以及编译所需要的软件，使用如下命令：</p>
<pre class="programlisting" style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f4f5f7; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-top: 8px; padding-right: 12px; padding-bottom: 8px; padding-left: 12px; margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; overflow-x: auto; color: #333333; "> $ sudo aptitude install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev</pre>
<pre class="programlisting" style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f4f5f7; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-top: 8px; padding-right: 12px; padding-bottom: 8px; padding-left: 12px; margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; overflow-x: auto; color: #333333; ">
<meta charset="utf-8" /><span style="color: #000000; font-family: Arial; line-height: 21px; white-space: normal; font-size: 14px; ">sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev java-common unixodbc</span> </pre>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; "><font color="#333333">另外，参考别人编译Android 2.3的经验，安装了下列软件包：</font></p>
<pre class="programlisting" style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f4f5f7; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-top: 8px; padding-right: 12px; padding-bottom: 8px; padding-left: 12px; margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; overflow-x: auto; color: #333333; ">$ sudo apt-get install lib64z1-dev libc6-dev-amd64 g++-multilib lib64stdc++6 </pre>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; ">
<meta charset="utf-8" /><span style="color: #000000; font-family: Arial, sans-serif, Helvetica, Tahoma; line-height: 18px; ">
</span></p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; "><span style="color: #ff6600; ">注意：32 bit&nbsp;</span>Required Packages 为</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; ">&nbsp;git-core gnupg&nbsp;sun-java5-jdk&nbsp;flex bison gperf&nbsp;<span style="color: #000000; ">build-essential zip&nbsp;curl&nbsp;<span style="color: #ff6600; "><span style="color: #000000; ">zlib1g-dev&nbsp;</span></span>&nbsp;<span style="color: #ff0000; ">libsdl-dev libesd0-dev&nbsp;libwxgtk2.6-dev&nbsp;libncurses5-dev&nbsp;</span></span><span style="color: #ff0000; ">&nbsp;</span></p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; "><span style="color: #ff6600; "><span style="color: #ff0000; "><strong style="font-weight: bold; ">而64 bit 下的</strong>&nbsp;&nbsp;<span style="color: #000000; ">Required Packages 为 git-core gnupg flex bison gperf build-essential zip curl sun-java6-jdk&nbsp;zlib1g-dev&nbsp;<span style="color: #ff0000; "><strong style="font-weight: bold; ">gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z1-dev<br />
<br />
</strong></span></span></span></span></p>
</span>虽然Android官方网站上讲不支持Java 6，不过我使用Java 6也可以编译通过，所以在这里<a class="ulink" href="http://easwy.com/" target="_top" style="color: #44a1d0; text-decoration: none; ">Easwy</a>安装的是Java 6。首先去掉<span class="emphasis"><em>/etc/apt/sources.list</em></span>中这两行的注释，使能Java 6源：
<p>&nbsp;</p>
<pre class="programlisting" style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f4f5f7; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-top: 8px; padding-right: 12px; padding-bottom: 8px; padding-left: 12px; margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; overflow-x: auto; color: #333333; ">deb http://archive.canonical.com/ubuntu lucid partner
deb-src http://archive.canonical.com/ubuntu lucid partner </pre>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; ">然后安装Java 6 JDK：</p>
<pre class="programlisting" style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f4f5f7; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-top: 8px; padding-right: 12px; padding-bottom: 8px; padding-left: 12px; margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; overflow-x: auto; color: #333333; ">$ sudo aptitude install sun-java6-jdk </pre>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; ">接下来下载<span class="command"><strong>repo</strong></span>工具，这是Google提供的一个Python脚本，方便管理多个Git版本库：</p>
<pre class="programlisting" style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f4f5f7; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-top: 8px; padding-right: 12px; padding-bottom: 8px; padding-left: 12px; margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; overflow-x: auto; color: #333333; ">$ cd ~
$ mkdir bin
$ curl http://android.git.kernel.org/repo &gt;~/bin/repo
$ chmod a+x ~/bin/repo </pre>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; ">记得把<span class="command"><strong>repo</strong></span>加到你的路径中，方便以后使用。编辑<span class="emphasis"><em>~/.bashrc</em></span>，加入下面一行：</p>
<pre class="programlisting" style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f4f5f7; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-top: 8px; padding-right: 12px; padding-bottom: 8px; padding-left: 12px; margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; overflow-x: auto; color: #333333; ">PATH=$PATH:~/bin
export PATH </pre>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; ">然后用命令<span class="command"><strong>. ~/.bashrc</strong></span>，以后就可以直接使用<span class="command"><strong>repo</strong></span>命令了。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; ">接下来获取<a class="ulink" href="http://easwy.com/blog/archives/tag/android/" target="_top" style="color: #44a1d0; text-decoration: none; ">Android</a>&nbsp;2.3.1的源代码：</p>
<pre class="programlisting" style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f4f5f7; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-top: 8px; padding-right: 12px; padding-bottom: 8px; padding-left: 12px; margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; overflow-x: auto; color: #333333; ">$ mkdir mydroid
$ cd mydroid
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.3.1_r1
$ repo sync </pre>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; "><span class="bold"><strong>[ 编译Android ]</strong></span></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; ">接下来开始编译：</p>
<pre class="programlisting" style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f4f5f7; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-top: 8px; padding-right: 12px; padding-bottom: 8px; padding-left: 12px; margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; overflow-x: auto; color: #333333; ">$ make -j`grep '^processor' /proc/cpuinfo | wc -l` </pre>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; ">上面的命令中，<span class="emphasis"><em>-j</em></span>参数告诉make启动多个并行任务进行编译，在支持多核的CPU上能加快编译速度。如果你知道你CPU是几核的，可以直接把这部分替换成<span class="emphasis"><em>-j2</em></span>(双核)。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; ">我在编译的过程中遇到下面的错误：</p>
<div class="blockquote" style="color: #333333; "><blockquote class="blockquote" style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f4f5f7; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-top: 8px; padding-right: 12px; padding-bottom: 8px; padding-left: 12px; margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; overflow-x: auto; background-position: initial initial; background-repeat: initial initial; ">
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; ">************************************************************</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; ">You are attempting to build on a 32-bit system.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; ">Only 64-bit build environments are supported beyond froyo/2.2.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; ">************************************************************</p>
</blockquote></div>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; ">这是因为在Makefile中检测了CPU的字长。我直接把<span class="emphasis"><em>build/core/main.mk</em></span>中下面的话注释掉：</p>
<pre class="programlisting" style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f4f5f7; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-top: 8px; padding-right: 12px; padding-bottom: 8px; padding-left: 12px; margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; overflow-x: auto; color: #333333; ">#ifneq (64,$(findstring 64,$(build_arch)))
#$(warning ************************************************************)
#$(warning You are attempting to build on a 32-bit system.)
#$(warning Only 64-bit build environments are supported beyond froyo/2.2.)
#$(warning ************************************************************)
#$(error stop)
#endif </pre>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; ">接下来又遇到下面的错误：</p>
<div class="blockquote" style="color: #333333; "><blockquote class="blockquote" style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f4f5f7; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-top: 8px; padding-right: 12px; padding-bottom: 8px; padding-left: 12px; margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; overflow-x: auto; background-position: initial initial; background-repeat: initial initial; ">
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; ">Docs droiddoc: out/target/common/docs/api-stubs</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; ">Could not load &#8216;clearsilver-jni&#8217;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; ">java.library.path = out/host/linux-x86/lib</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; ">make: *** [out/target/common/docs/api-stubs-timestamp] Error 45</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; ">make: *** Waiting for unfinished jobs&#8230;.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; ">Could not load &#8216;clearsilver-jni&#8217;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; ">java.library.path = out/host/linux-x86/lib</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; ">make: *** [out/target/common/docs/doc-comment-check-timestamp] Error 45</p>
</blockquote></div>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; ">这是由于clearsilver在编译时如果检测到使用Java JDK 6，就使用64位编译。要避开此错误，需要修改下面四个文件：</p>
<div class="itemizedlist" style="color: #333333; ">
<ul class="itemizedlist" type="disc" style="margin-top: 5px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-left: 20px; ">
    <li class="listitem" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">external/clearsilver/cgi/Android.mk</li>
    <li class="listitem" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">external/clearsilver/java-jni/Android.mk</li>
    <li class="listitem" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">external/clearsilver/util/Android.mk</li>
    <li class="listitem" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">external/clearsilver/cs/Android.mk</li>
</ul>
</div>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; ">把这四个Makefile中的下列语句注掉即可：</p>
<pre class="programlisting" style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f4f5f7; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-top: 8px; padding-right: 12px; padding-bottom: 8px; padding-left: 12px; margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; overflow-x: auto; color: #333333; "># This forces a 64-bit build for Java6
# Comment by Easwy
# LOCAL_CFLAGS += -m64
# LOCAL_LDFLAGS += -m64 </pre>
<meta charset="utf-8" />
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; color: #333333; font-family: Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; font-size: 12px; line-height: 20px; ">然后在<span class="emphasis"><em>external/clearsilver</em></span>目录中执行一下<span class="command"><strong>make clean</strong></span>，然后回到项目根目录，继续make即可。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; "><font color="#333333" face="Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif"><span style="font-size: 12px; line-height: 20px;">当编译完成时，生成的image文件放在</span></font><span class="emphasis" style="color: #333333; font-family: Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; font-size: 12px; line-height: 20px; "><em>out/target/product/generic</em></span><font color="#333333" face="Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif"><span style="font-size: 12px; line-height: 20px;">目录中。</span></font><br />
<br />
<font color="#333333" face="Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif"><span style="font-size: 12px; line-height: 20px;">需要将gcc编译环境设置为4.3版本，否则会出现const char* 到 &nbsp;char*无法转换的问题。</span></font><br />
<font color="#333333" face="Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif"><span style="font-size: 12px; line-height: 20px;">http://www.blogjava.net/TiGERTiAN/archive/2011/01/22/343372.html</span></font></p>
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/343283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-01-20 22:24 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/01/20/343283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android源代码编译发生错误fatal error: alsa/asoundlib.h: No such file or directory解决办法</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/01/12/342810.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Tue, 11 Jan 2011 23:59:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/01/12/342810.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/342810.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/01/12/342810.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/342810.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/342810.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<title></title>
<meta name="Generator" content="Cocoa HTML Writer" />
<meta name="CocoaVersion" content="1038.35" />
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
</style>
<p class="p1"><span style="font-size: 12pt; ">错误：</span><br />
<br />
development/simulator/wrapsim/DevAudio.c:11: fatal error: alsa/asoundlib.h: No such file or directory</p>
<p class="p1">compilation terminated.</p>
<p class="p1">make: *** [out/debug/host/linux-x86/pr/sim/obj/SHARED_LIBRARIES/libwrapsim_intermediates/DevAudio.o] Error 1<br />
<br />
<span style="font-size: 12pt; ">解决办法：</span><br />
<br />
<meta charset="utf-8" /><span style="font-family: Georgia, 'Bitstream Charter', 'Times New Roman', serif; font-size: medium; color: #333333; ">
</span></p>
<div class="syhi_block" style="margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; overflow-x: auto; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; font-family: 'Andale Mono', Lucidatypewriter, Courier, monospace; font-size: 12px; font-style: normal; font-weight: normal; text-align: left; white-space: nowrap; width: 475px; ">$&nbsp;<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #c20cb9; font-weight: bold; ">apt-file</span>&nbsp;search alsa<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; font-weight: bold; ">/</span>asoundlib.h<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />
libasound2-dev:&nbsp;<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; font-weight: bold; ">/</span>usr<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; font-weight: bold; ">/</span>include<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; font-weight: bold; ">/</span>alsa<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; font-weight: bold; ">/</span>asoundlib.h</code></div>
<p style="margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; ">So that&#8217;s it,&nbsp;<strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">asoundlib.h is in the package libasound2-dev</strong>.</p>
<p style="margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; "><span style="font-size: 12pt; ">apt-file需要使用apt-get install apt-file安装一下。</span></p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/342810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-01-12 07:59 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/01/12/342810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Froyo build error (libGLES_android_intermediates/egl.o)</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/01/11/342792.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Tue, 11 Jan 2011 12:38:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/01/11/342792.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/342792.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/01/11/342792.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/342792.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/342792.html</trackback:ping><description><![CDATA[Error:<br />
<meta charset="utf-8" /><span  style="color: #222222; font-family: palatino, georgia, verdana, arial, sans-serif; line-height: 19px; font-size: small; ">make: *** [out/debug/host/linux-x86/pr/sim/obj/SHARED_LIBRARIES/<br />
libGLES_android_intermediates/egl.o] Error 1<br />
<br />
Solution:<br />
<meta charset="utf-8" />
<pre>in egl.cpp, at the line 554 :
const Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion));
just remove the 'const' and retry.</pre>
</span>
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/342792.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-01-11 20:38 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/01/11/342792.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android Froyo基于32 bit Ubuntu 10.10编译问题</title><link>http://www.blogjava.net/TiGERTiAN/archive/2011/01/10/342732.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Mon, 10 Jan 2011 13:32:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2011/01/10/342732.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/342732.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2011/01/10/342732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/342732.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/342732.html</trackback:ping><description><![CDATA[<meta charset="utf-8" />
<div>
<h1 class="aTitle"><font color="#333333" face="宋体, Arial"><span style="font-size: 14px; font-weight: normal; line-height: 19px;">
<meta charset="utf-8" />
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; ">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<title></title>
<meta name="Generator" content="Cocoa HTML Writer" />
<meta name="CocoaVersion" content="1038.35" />
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; font: 14.0px 'Heiti SC Light'; color: #333233}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; font: 14.0px Arial; color: #333233}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; font: 14.0px 'Hiragino Kaku Gothic ProN'; color: #333233}
span.s1 {font: 14.0px Arial}
span.s2 {font: 14.0px 'Hiragino Kaku Gothic ProN'}
span.s3 {font: 14.0px 'Heiti SC Light'}
span.s4 {font: 14.0px 'Lucida Grande'}
span.s5 {text-decoration: underline ; color: #2c2cfb}
</style>
</p>
<p class="p1"><span class="s1">&nbsp;</span>查找资料，确定下面的修改步骤（<span class="s1">-</span><span class="s2">表示</span>删除行，<span class="s1">+</span><span class="s2">表示添加行）：</span></p>
<p class="p2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<span class="s2">、修改</span>build/core<span class="s2">目</span><span class="s3">录下的</span>main.mk<span class="s2">文件，修改策略</span><span class="s3">为：</span><span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifeq ($(BUILD_OS),linux)&nbsp;<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; build_arch := $(shell uname -m)&nbsp;<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -ifneq (64,$(findstring 64,$(build_arch)))&nbsp;<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +ifneq (i686,$(findstring i686,$(build_arch)))&nbsp;<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(warning ************************************************************)&nbsp;<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(warning You are attempting to build on a 32-bit system.)&nbsp;<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(warning Only 64-bit build environments are supported beyond froyo/2.2.)</p>
<p class="p2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<span class="s2">、修改下列文件：</span><span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /external/clearsilver/cgi/<a href="http://www.linuxidc.com/topicnews.aspx?tid=11"><span class="s5">Android</span></a>.mk<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /external/clearsilver/cs/<a href="http://www.linuxidc.com/topicnews.aspx?tid=11"><span class="s5">Android</span></a>.mk<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /external/clearsilver/java-jni/<a href="http://www.linuxidc.com/topicnews.aspx?tid=11"><span class="s5">Android</span></a>.mk<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /external/clearsilver/util/<a href="http://www.linuxidc.com/topicnews.aspx?tid=11"><span class="s5">Android</span></a>.mk<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4<span class="s2">个文件的修改策略相同，</span><span class="s3">为：</span><span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # This forces a 64-bit build for Java6&nbsp;<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -LOCAL_CFLAGS += -m64&nbsp;<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -LOCAL_LDFLAGS += -m64&nbsp;<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +LOCAL_CFLAGS += -m32&nbsp;<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +LOCAL_LDFLAGS += -m32</p>
<p class="p1"><span class="s1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="s2">接下来的</span>编译可能会遇到很多因为缺少相应模块而产生的错误，请首先安装下列软件模块：</p>
<p class="p2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bison<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sun-java6-jdk<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g++ (build-essential)<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zlib1g-dev<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flex<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; libncurses-dev<span class="s4"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gperf</p>
<p class="p3">然后，就是<span class="s1">make</span>之后漫<span class="s3">长的等待</span><span class="s1">...</span></p>
<p>&nbsp;</p>
</span></font></h1>
</div>
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/342732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2011-01-10 21:32 <a href="http://www.blogjava.net/TiGERTiAN/archive/2011/01/10/342732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android各版本区别总结</title><link>http://www.blogjava.net/TiGERTiAN/archive/2010/12/29/341860.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Wed, 29 Dec 2010 03:02:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2010/12/29/341860.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/341860.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2010/12/29/341860.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/341860.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/341860.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Android 1.0 第一版商用操作系统Android 1.1 更新了部分API，新增一些功能，修正了一些错误，同时增加com.google.android.maps包                        Android 1.5                                        智能虚拟键盘          ...&nbsp;&nbsp;<a href='http://www.blogjava.net/TiGERTiAN/archive/2010/12/29/341860.html'>阅读全文</a><img src ="http://www.blogjava.net/TiGERTiAN/aggbug/341860.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2010-12-29 11:02 <a href="http://www.blogjava.net/TiGERTiAN/archive/2010/12/29/341860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android APN切换</title><link>http://www.blogjava.net/TiGERTiAN/archive/2010/11/16/338153.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Tue, 16 Nov 2010 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2010/11/16/338153.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/338153.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2010/11/16/338153.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/338153.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/338153.html</trackback:ping><description><![CDATA[<div style="font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;ApnUtil&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;Uri&nbsp;PREFERRED_APN_URI&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Uri<br />
&nbsp;&nbsp;&nbsp;&nbsp;.parse(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">content://telephony/carriers/preferapn</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;String&nbsp;APN_ID&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">apn_id</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;ID_INDEX&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;get&nbsp;apntype<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;context<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;String&nbsp;getApnType(Context&nbsp;context){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;apntype</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">nomatch</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cursor&nbsp;c&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;context.getContentResolver().query(PREFERRED_APN_URI,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(c&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;c.getCount()&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.moveToFirst();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;user</span><span style="color: #000000; ">=</span><span style="color: #000000; ">c.getString(c.getColumnIndex(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">user</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(user.startsWith(APNNET.CTNET)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;apntype</span><span style="color: #000000; ">=</span><span style="color: #000000; ">APNNET.CTNET;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(user.startsWith(APNNET.CTWAP)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;apntype</span><span style="color: #000000; ">=</span><span style="color: #000000; ">APNNET.CTWAP;<br />
&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;&nbsp;c.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;apntype;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setSelectedApnKey(Context&nbsp;context,String&nbsp;key)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ContentResolver&nbsp;resolver&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;context.getContentResolver();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ContentValues&nbsp;values&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ContentValues();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;values.put(APN_ID,&nbsp;key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resolver.update(PREFERRED_APN_URI,&nbsp;values,&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
}</span></div>
还需要加个APN设置权限<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">uses-permission&nbsp;</span><span style="color: #FF0000; ">android:name</span><span style="color: #0000FF; ">="android.permission.WRITE_APN_SETTINGS"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span></div>
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/338153.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2010-11-16 09:54 <a href="http://www.blogjava.net/TiGERTiAN/archive/2010/11/16/338153.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android/OPhone ListView中如何使用Button，让onClick和onItemClick事件共存</title><link>http://www.blogjava.net/TiGERTiAN/archive/2010/10/13/335066.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Wed, 13 Oct 2010 13:16:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2010/10/13/335066.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/335066.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2010/10/13/335066.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/335066.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/335066.html</trackback:ping><description><![CDATA[将具有点击事件控件的android:focusable属性置成false就可以了。如下例子是可以既捕捉onItemClick事件（在非checkbox和非button区域），又可以捕捉onClick等事件。看到网上还有很多人不会，特意共享一下。<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span style="color: #0000FF; ">?&gt;</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">LinearLayout&nbsp;</span><span style="color: #FF0000; ">xmlns:android</span><span style="color: #0000FF; ">="http://schemas.android.com/apk/res/android"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;android:orientation</span><span style="color: #0000FF; ">="horizontal"</span><span style="color: #FF0000; ">&nbsp;android:layout_height</span><span style="color: #0000FF; ">="fill_parent"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;android:id</span><span style="color: #0000FF; ">="@+id/LinearLayoutGameListItem"</span><span style="color: #FF0000; ">&nbsp;android:layout_width</span><span style="color: #0000FF; ">="fill_parent"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;android:gravity</span><span style="color: #0000FF; ">="center_vertical"</span><span style="color: #FF0000; ">&nbsp;android:layout_marginLeft</span><span style="color: #0000FF; ">="@dimen/mygamecenter_common_margin"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;android:layout_marginRight</span><span style="color: #0000FF; ">="@dimen/mygamecenter_common_margin"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">CheckBox&nbsp;</span><span style="color: #FF0000; ">android:id</span><span style="color: #0000FF; ">="@+id/CheckBoxGameListItem"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:focusable</span><span style="color: #0000FF; ">="false"</span><span style="color: #FF0000; ">&nbsp;android:layout_width</span><span style="color: #0000FF; ">="wrap_content"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:layout_height</span><span style="color: #0000FF; ">="wrap_content"</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">CheckBox</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">Button&nbsp;</span><span style="color: #FF0000; ">android:text</span><span style="color: #0000FF; ">="@string/top"</span><span style="color: #FF0000; ">&nbsp;android:id</span><span style="color: #0000FF; ">="@+id/ButtonTop"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:textColor</span><span style="color: #0000FF; ">="#FFFFFF"</span><span style="color: #FF0000; ">&nbsp;android:focusable</span><span style="color: #0000FF; ">="false"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:layout_width</span><span style="color: #0000FF; ">="wrap_content"</span><span style="color: #FF0000; ">&nbsp;android:layout_height</span><span style="color: #0000FF; ">="@dimen/game_list_item_button_height"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:layout_marginRight</span><span style="color: #0000FF; ">="@dimen/game_list_item_button_margin_right"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:paddingLeft</span><span style="color: #0000FF; ">="@dimen/game_list_item_button_padding_left"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:paddingRight</span><span style="color: #0000FF; ">="@dimen/game_list_item_button_padding_right"</span><span style="color: #FF0000; "><br />
android:background</span><span style="color: #0000FF; ">="@drawable/button_cool_small_selector"</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">Button</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">LinearLayout</span><span style="color: #0000FF; ">&gt;</span></div>
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/335066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2010-10-13 21:16 <a href="http://www.blogjava.net/TiGERTiAN/archive/2010/10/13/335066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Building, running, and debugging Android source</title><link>http://www.blogjava.net/TiGERTiAN/archive/2010/09/28/333206.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Tue, 28 Sep 2010 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2010/09/28/333206.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/333206.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2010/09/28/333206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/333206.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/333206.html</trackback:ping><description><![CDATA[<meta charset="utf-8" /><span  style="border-collapse: collapse; font-family: song, Verdana; font-size: 12px; ">
<p style="font: normal normal normal 12px/normal song, Verdana; ">There is a lot of confusion surrounding the work flow in the Android source tree, so allow me to simplify:</p>
<ol>
    <li>Follow the initial instructions for downloading the source at:
    <p style="font: normal normal normal 12px/normal song, Verdana; "><a href="http://source.android.com/download" style="text-decoration: underline; color: #0044b6; ">http://source.android.com/download</a></p>
    </li>
    <li>Set up your environment to build the engineering build for the generic device and generic product. This is similar to the SDK, but with a few pieces missing.<br style="font: normal normal normal 12px/normal song, Verdana; " />
    <code><br style="font: normal normal normal 12px/normal song, Verdana; " />
    $ source build/envsetup.sh<br style="font: normal normal normal 12px/normal song, Verdana; " />
    $ lunch 1</code>
    <p style="font: normal normal normal 12px/normal song, Verdana; "></p>
    </li>
    <li>To build for the first time:<code></code>
    <p style="font: normal normal normal 12px/normal song, Verdana; ">$ make<br style="font: normal normal normal 12px/normal song, Verdana; " />
    <br style="font: normal normal normal 12px/normal song, Verdana; " />
    If you have a multi-core system, you can build with&nbsp;<code>make -jN</code>&nbsp;where N is twice the number of cores on your machine. This should speed up the first build considerably.</p>
    </li>
    <li>To launch the emulator from your build:<code></code>
    <p style="font: normal normal normal 12px/normal song, Verdana; ">$ ./out/host/&lt;your-machine-type&gt;/bin/emulator<br style="font: normal normal normal 12px/normal song, Verdana; " />
    <br style="font: normal normal normal 12px/normal song, Verdana; " />
    On my system&nbsp;<code>&lt;your-machine-type&gt;</code>&nbsp;is&nbsp;<code>linux-x86</code>.</p>
    <p style="font: normal normal normal 12px/normal song, Verdana; ">NOTE:&nbsp;The emulator knows where to find system and data images as a result of running&nbsp;<code>lunch 1</code>&nbsp;above. This sets the environment variable&nbsp;<code>ANDROID_PRODUCT_OUT</code>&nbsp;to point to the target directory. For this example, it should be&nbsp;<code>out/target/product/generic/</code>.</p>
    </li>
    <li>If you wish to make changes to the source code, there are handy utilities that have been exposed to your environment by&nbsp;<code>source build/envsetup.sh</code>&nbsp;above. For example, if you modify the Email app and just want to rebuild it:
    <p style="font: normal normal normal 12px/normal song, Verdana; "><code>$ mmm packages/apps/Email</code></p>
    </li>
    <li>To see your changes in the emulator you can run:
    <p style="font: normal normal normal 12px/normal song, Verdana; "><code>$ adb remount<br style="font: normal normal normal 12px/normal song, Verdana; " />
    $ adb sync</code></p>
    <p style="font: normal normal normal 12px/normal song, Verdana; ">Which will copy the regenerated&nbsp;<code>Email.apk</code>&nbsp;file into the emulator&#8217;s&nbsp;<code>/system/app</code>&nbsp;folder, triggering the&nbsp;<code>PackageManager</code>&nbsp;to automatically reinstall it.</p>
    </li>
    <li>Or if you change framework resources in&nbsp;<code>frameworks/base/core/res/res/</code>&nbsp;you could regenerate&nbsp;<code>framework-res.apk</code>&nbsp;with:
    <p style="font: normal normal normal 12px/normal song, Verdana; "><code>$ mmm frameworks/base/core/res</code></p>
    <p style="font: normal normal normal 12px/normal song, Verdana; ">Or if you modified even the framework itself you could run:</p>
    <p style="font: normal normal normal 12px/normal song, Verdana; "><code>$ ONE_SHOT_MAKEFILE="frameworks/base/Android.mk" make framework</code></p>
    <p style="font: normal normal normal 12px/normal song, Verdana; ">This is a special variation of&nbsp;<code>mmm</code>&nbsp;which is used to build&nbsp;<code>frameworks/base/core/java</code>.</p>
    <p style="font: normal normal normal 12px/normal song, Verdana; ">To sync these changes you must restart the running framework and sync, as with this handy sequence:</p>
    <p style="font: normal normal normal 12px/normal song, Verdana; "><code>$ adb remount<br style="font: normal normal normal 12px/normal song, Verdana; " />
    $ adb shell stop<br style="font: normal normal normal 12px/normal song, Verdana; " />
    $ adb sync<br style="font: normal normal normal 12px/normal song, Verdana; " />
    $ adb shell start</code></p>
    <p style="font: normal normal normal 12px/normal song, Verdana; "></p>
    </li>
    <li>Finally, to debug your changes you can use the DDMS tool to select a process for debug and then attach Eclipse to it. If you have the Eclipse Android Development plugin installed, there is a special DDMS perspective which you can use to choose the process for debug. To attach Eclipse to it, see these instructions:
    <p style="font: normal normal normal 12px/normal song, Verdana; "><a href="http://source.android.com/using-eclipse" style="text-decoration: underline; color: #0044b6; ">http://source.android.com/using-eclipse</a></p>
    <p style="font: normal normal normal 12px/normal song, Verdana; ">This document also describes how to use Eclipse for development. Any IDE should work with the proper finagling though. Just note that the IDE won&#8217;t really by an integrated environment, the final output of APKs,&nbsp;<code>system.img</code>, and even the generation of&nbsp;<code>R.java</code>&nbsp;files will have to be done by&nbsp;<code>make</code>!</p>
    <p style="font: normal normal normal 12px/normal song, Verdana; ">A note about the processes in Android:</p>
    <ul>
        <li><code>system_process</code>&nbsp;houses all things under&nbsp;<code>frameworks/base/services</code>. This includes the PackageManagerService, StatusBarService, etc. It has many, many threads (one for each service, and then one main UI thread), so be wary when debugging.</li>
        <li><code>com.android.acore</code>&nbsp;hosts Launcher (home), Contacts, etc. You can determine the apps/providers that run here by looking for<code>android:process="android.process.acore"</code>&nbsp;in the various&nbsp;<code>AndroidManifest.xml</code>&nbsp;files in packages/.</li>
    </ul>
    <p style="font: normal normal normal 12px/normal song, Verdana; ">Also remember that the &#8220;framework&#8221; (under&nbsp;<code>frameworks/base/core/java</code>) is not hosted by any one process. It is a library used by most processes, so to debug code there you can usually use a simple demo app that takes advantage of whatever you changed and debug that app&#8217;s process. A useful trick for setting up your debug connection is to call&nbsp;<code>Debug.waitForDebugger()</code>&nbsp;during some startup part of an application or system service.</p>
    </li>
</ol>
</span>
<img src ="http://www.blogjava.net/TiGERTiAN/aggbug/333206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2010-09-28 11:25 <a href="http://www.blogjava.net/TiGERTiAN/archive/2010/09/28/333206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>