﻿<?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!</title><link>http://www.blogjava.net/TiGERTiAN/</link><description>----TiGERTiAN</description><language>zh-cn</language><lastBuildDate>Sun, 08 Mar 2026 04:56:14 GMT</lastBuildDate><pubDate>Sun, 08 Mar 2026 04:56:14 GMT</pubDate><ttl>60</ttl><item><title>MVC/MVP/MVVM</title><link>http://www.blogjava.net/TiGERTiAN/archive/2017/05/10/432509.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Wed, 10 May 2017 03:03:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2017/05/10/432509.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/432509.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2017/05/10/432509.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/432509.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/432509.html</trackback:ping><description><![CDATA[<h2>同</h2><p style="box-sizing: border-box; margin: 0px 0px 10px; color: #333333; font-family: &quot;Helvetica Neue&quot;, Arial, &quot;Hiragino Sans GB&quot;, &quot;Microsoft Yahei&quot;; background-color: #ffffff; outline: 0px !important;">如果把这三者放在一起比较，先说一下三者的共同点，也就是Model和View：</p><ul style="box-sizing: border-box; margin-top: 0px; margin-bottom: 10px; padding: 0px 0px 0px 2em; color: #333333; font-family: &quot;Helvetica Neue&quot;, Arial, &quot;Hiragino Sans GB&quot;, &quot;Microsoft Yahei&quot;; background-color: #ffffff; outline: 0px !important;"><li style="box-sizing: border-box; outline: 0px !important;"><p style="box-sizing: border-box; outline: 0px !important; margin: 16px 0px 10px;">Model：数据对象，同时，提供本应用外部对应用程序数据的操作的接口，也可能在数据变化时发出变更通知。<span style="box-sizing: border-box; outline: 0px !important; font-weight: 700;">Model不依赖于View的实现</span>，只要外部程序调用Model的接口就能够实现对数据的增删改查。</p></li><li style="box-sizing: border-box; outline: 0px !important;"><p style="box-sizing: border-box; outline: 0px !important; margin: 16px 0px 10px;">View：UI层，提供对最终用户的交互操作功能，包括UI展现代码及一些相关的界面逻辑代码。</p></li></ul><h2>异</h2><p style="box-sizing: border-box; margin: 0px 0px 10px; color: #333333; font-family: &quot;Helvetica Neue&quot;, Arial, &quot;Hiragino Sans GB&quot;, &quot;Microsoft Yahei&quot;; background-color: #ffffff; outline: 0px !important;">三者的差异在于如何粘合View和Model，实现用户的交互操作以及变更通知</p><ul style="box-sizing: border-box; margin-top: 0px; margin-bottom: 10px; padding: 0px 0px 0px 2em; color: #333333; font-family: &quot;Helvetica Neue&quot;, Arial, &quot;Hiragino Sans GB&quot;, &quot;Microsoft Yahei&quot;; background-color: #ffffff; outline: 0px !important;"><li style="box-sizing: border-box; outline: 0px !important;">Controller</li></ul><p style="box-sizing: border-box; margin: 0px 0px 10px; color: #333333; font-family: &quot;Helvetica Neue&quot;, Arial, &quot;Hiragino Sans GB&quot;, &quot;Microsoft Yahei&quot;; background-color: #ffffff; outline: 0px !important;">Controller接收View的操作事件，根据事件不同，或者调用Model的接口进行数据操作，或者进行View的跳转，从而也意味着一个Controller可以对应多个View。Controller对View的实现不太关心，只会被动地接收，Model的数据变更不通过Controller直接通知View，通常View采用观察者模式监听Model的变化。</p><ul style="box-sizing: border-box; margin-top: 0px; margin-bottom: 10px; padding: 0px 0px 0px 2em; color: #333333; font-family: &quot;Helvetica Neue&quot;, Arial, &quot;Hiragino Sans GB&quot;, &quot;Microsoft Yahei&quot;; background-color: #ffffff; outline: 0px !important;"><li style="box-sizing: border-box; outline: 0px !important;">Presenter</li></ul><p style="box-sizing: border-box; margin: 0px 0px 10px; color: #333333; font-family: &quot;Helvetica Neue&quot;, Arial, &quot;Hiragino Sans GB&quot;, &quot;Microsoft Yahei&quot;; background-color: #ffffff; outline: 0px !important;">Presenter与Controller一样，接收View的命令，对Model进行操作；与Controller不同的是Presenter会反作用于View，Model的变更通知首先被Presenter获得，然后Presenter再去更新View。一个Presenter只对应于一个View。根据Presenter和View对逻辑代码分担的程度不同，这种模式又有两种情况：Passive View和Supervisor Controller。</p><ul style="box-sizing: border-box; margin-top: 0px; margin-bottom: 10px; padding: 0px 0px 0px 2em; color: #333333; font-family: &quot;Helvetica Neue&quot;, Arial, &quot;Hiragino Sans GB&quot;, &quot;Microsoft Yahei&quot;; background-color: #ffffff; outline: 0px !important;"><li style="box-sizing: border-box; outline: 0px !important;">ViewModel</li></ul><p style="box-sizing: border-box; margin: 0px 0px 10px; color: #333333; font-family: &quot;Helvetica Neue&quot;, Arial, &quot;Hiragino Sans GB&quot;, &quot;Microsoft Yahei&quot;; background-color: #ffffff; outline: 0px !important;">注意这里的&#8220;Model&#8221;指的是View的Model，跟MVVM中的一个Model不是一回事。所谓View的Model就是包含View的一些数据属性和操作的这么一个东东，这种模式的关键技术就是数据绑定（data binding），View的变化会直接影响ViewModel，ViewModel的变化或者内容也会直接体现在View上。这种模式实际上是框架替应用开发者做了一些工作，开发者只需要较少的代码就能实现比较复杂的交互。</p><img src ="http://www.blogjava.net/TiGERTiAN/aggbug/432509.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> 2017-05-10 11:03 <a href="http://www.blogjava.net/TiGERTiAN/archive/2017/05/10/432509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><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>OSGi and Hadoop and Node.js</title><link>http://www.blogjava.net/TiGERTiAN/archive/2015/02/23/422997.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Mon, 23 Feb 2015 02:12:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2015/02/23/422997.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/422997.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2015/02/23/422997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/422997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/422997.html</trackback:ping><description><![CDATA[OSGi--<span style="font-weight: bold; color: #545454; font-family: arial, sans-serif; font-size: small; line-height: 18.2000007629395px; background-color: #ffffff;">Open Service Gateway initiative(</span>开放服务网关协议<span style="color: #545454; font-family: arial, sans-serif; font-size: small; font-weight: bold; line-height: 18.2000007629395px; background-color: #ffffff;">)</span><br /><div>http://www.osgi.org/Technology/HomePage<br /><br />Hadoop<br /><div>http://hadoop.apache.org/<br /><br />Node.js<br /><div>https://cnodejs.org/<br /><div>http://nodejs.org/</div></div></div></div><img src ="http://www.blogjava.net/TiGERTiAN/aggbug/422997.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-02-23 10:12 <a href="http://www.blogjava.net/TiGERTiAN/archive/2015/02/23/422997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javacc工具小记</title><link>http://www.blogjava.net/TiGERTiAN/archive/2015/01/31/422602.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Sat, 31 Jan 2015 05:12:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2015/01/31/422602.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/422602.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2015/01/31/422602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/422602.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/422602.html</trackback:ping><description><![CDATA[<div>https://javacc.java.net/<br /><p style="font-family: STHeiti; font-size: medium; line-height: normal;">Java Compiler Compiler&nbsp;<sup>tm</sup>&nbsp;(JavaCC&nbsp;<sup>tm</sup>) is the most popular parser generator for use with Java&nbsp;<sup>tm</sup>&nbsp;applications. A parser generator is a tool that reads a grammar specification and converts it to a Java program that can recognize matches to the grammar. In addition to the parser generator itself, JavaCC provides other standard capabilities related to parser generation such as tree building (via a tool called JJTree included with JavaCC), actions, debugging, etc.</p><div></div>下载后的使用方式（Mac&amp;Linux）：<br /><p>echo 'java -cp /path/to/javacc.jar $(basename $0) "$@"' &gt; javacc</p> <p>chmod 755 javacc</p> <p>ln -s javacc jjtree</p> <p>ln -s javacc jjdoc</p><br /><br /></div><img src ="http://www.blogjava.net/TiGERTiAN/aggbug/422602.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-01-31 13:12 <a href="http://www.blogjava.net/TiGERTiAN/archive/2015/01/31/422602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>还是这里比较安静</title><link>http://www.blogjava.net/TiGERTiAN/archive/2013/12/10/407419.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Tue, 10 Dec 2013 13:46:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2013/12/10/407419.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/407419.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2013/12/10/407419.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/407419.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/407419.html</trackback:ping><description><![CDATA[校内--已经丢弃<br />微博--很少上了<br />朋友圈--人太多<br />虽感觉社交体系越来越向私密化发展，但还是这里好，没人知，没人识，也不会有那么多人评论我发的东西，或者无聊的点&#8220;赞&#8221;。<br />前两年的迷茫，到现在的重获方向，书本而不是人让我感觉更安心，喜欢做一个爱学习的人。前途再迷茫，也不能迷失自己；道路再舒服，也不能忘记自己。<br />希望自己不要浑浑噩噩就这样走了。<br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/TiGERTiAN/aggbug/407419.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-12-10 21:46 <a href="http://www.blogjava.net/TiGERTiAN/archive/2013/12/10/407419.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/2013/04/09/397602.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Tue, 09 Apr 2013 12:48:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2013/04/09/397602.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/397602.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2013/04/09/397602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/397602.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/397602.html</trackback:ping><description><![CDATA[<span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff;">在 /system/etc/init.d 这个目录下，有很多脚本，把它们全部导出（方便查找）,无意中在 99snakes 这个文件找到了一句</span><div style="word-wrap: break-word; overflow: hidden; margin: 10px 0px; padding-top: 10px; padding-bottom: 5px; padding-left: 10px; background-image: url(http://bbs.gfan.com/static/image/gfan/codebg.gif); background-color: #f7f7f7; color: #666666; zoom: 1; border: 1px solid #cccccc; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-position: 0px 0px; background-repeat: no-repeat repeat;"><div id="code_5ew" style="word-wrap: break-word;"><ol style="word-wrap: break-word; margin: 0px 0px 0px 10px !important; padding: 0px !important;"><li style="word-wrap: break-word; margin: 0px 0px 0px 2em; padding: 0px 0px 0px 10px; list-style-type: decimal-leading-zero; font-family: Monaco, Consolas, 'Lucida Console', 'Courier New', serif; font-size: 12px; line-height: 1.8em;"># disable logger - (comment and reboot for logcat)<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; margin: 0px 0px 0px 2em; padding: 0px 0px 0px 10px; list-style-type: decimal-leading-zero; font-family: Monaco, Consolas, 'Lucida Console', 'Courier New', serif; font-size: 12px; line-height: 1.8em;">rm /dev/log/main</li></ol></div><em style="word-wrap: break-word; font-style: normal; color: #336699 !important; margin-left: 43px; font-size: 12px; cursor: pointer;">复制代码</em></div><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff;">感动中。。。把rm /dev/log/main 这句去掉就行了~重启后就可以调试了，这下不用刷回原生的内核了，哈哈，爽~</span><img src ="http://www.blogjava.net/TiGERTiAN/aggbug/397602.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-04-09 20:48 <a href="http://www.blogjava.net/TiGERTiAN/archive/2013/04/09/397602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WindowsPhone中资源国际化的开发</title><link>http://www.blogjava.net/TiGERTiAN/archive/2012/09/14/387708.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Fri, 14 Sep 2012 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2012/09/14/387708.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/387708.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2012/09/14/387708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/387708.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/387708.html</trackback:ping><description><![CDATA[1、对于应用名称(App Title)和开始屏幕的快捷方式(Tile)名称，需要参照<a href="http://msdn.microsoft.com/en-us/library/windowsphone/develop/ff967550%28v=vs.92%29.aspx">http://msdn.microsoft.com/en-us/library/windowsphone/develop/ff967550%28v=vs.92%29.aspx</a>&nbsp;来开发，这里提供一个快捷的生成工具<a href="/Files/TiGERTiAN/WP7AppResLib.zip">/Files/TiGERTiAN/WP7AppResLib.zip<br /></a>在WMAppManifest.xml中的调用方式Title="@AppResLib.dll,-100" &nbsp; &nbsp;&nbsp;&lt;Title&gt;@AppResLib.dll,-200&lt;/Title&gt;，100和200分别对应了App Title和Tile。<br /><br />2、在程序内的国际化，在开发工程中，新建一个Resource目录，下面新建AppResource.resx资源，针对不同语言可以建立不同的资源AppResource.en-US.resx等。在程序中直接使用以下函数就可以调用已经配置好的国际化资源：<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; &nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">readonly</span>&nbsp;ResourceManager&nbsp;ResourceManager&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ResourceManager("XXXX.Resource.AppResource",&nbsp;Assembly.GetExecutingAssembly());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;GetString(<span style="color: #0000FF; ">string</span>&nbsp;keyName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Utilities.ResourceManager.GetString(keyName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div><br />3、对于需要支持的语言，还要修改csproj文件，修改如下：<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; ">&lt;</span><span style="color: #800000; ">SilverlightApplication</span><span style="color: #0000FF; ">&gt;</span>true<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">SilverlightApplication</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: red; ">SupportedCultures</span><span style="color: #0000FF; ">&gt;</span>zh-CN;en-US;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: red; ">SupportedCultures</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">XapOutputs</span><span style="color: #0000FF; ">&gt;</span>true<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">XapOutputs</span><span style="color: #0000FF; ">&gt;</span></div><img src ="http://www.blogjava.net/TiGERTiAN/aggbug/387708.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-09-14 11:28 <a href="http://www.blogjava.net/TiGERTiAN/archive/2012/09/14/387708.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>我的近况</title><link>http://www.blogjava.net/TiGERTiAN/archive/2012/04/04/373325.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Wed, 04 Apr 2012 10:38:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2012/04/04/373325.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/373325.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2012/04/04/373325.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/373325.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/373325.html</trackback:ping><description><![CDATA[1、距离上一篇博客还有1小时15分钟就整两个月了。--没时间<br />2、当前工作已经干了2年3个月缺7天。--有史以来最长的<br />3、我的婚姻生活已经进行了5个月缺7天。--很幸福<br />4、我的压力比进这家公司之前增加了约10倍（当前处于晚上12点前及节假日无休状态），比我大学时期增加8倍（上一家公司还是比较舒服的）。--鸭梨山大<br />5、已经出现重度焦虑症2个月零4天。--等待升级为抑郁症<br />6、领导团队的人数从2个人增加到25个人。--预计还要double一下<br /><br />我的生活是否需要改变一下？ <embed id="embed_npwlo" type="application/npwlo" height="0"><img src ="http://www.blogjava.net/TiGERTiAN/aggbug/373325.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-04-04 18:38 <a href="http://www.blogjava.net/TiGERTiAN/archive/2012/04/04/373325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows Phone 7中的Background Agent</title><link>http://www.blogjava.net/TiGERTiAN/archive/2012/02/05/369413.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Sun, 05 Feb 2012 11:43:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2012/02/05/369413.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/369413.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2012/02/05/369413.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/369413.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/369413.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #333333; font-family: Verdana, Arial, Tahoma; line-height: 25px; background-color: #ffffff; "><p 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; ">在WP7.1中针对Background Agent的新API增加了蛮多非常强大的部分，以下将介绍Scheduled Multi Tasking的部分。</p><p 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; ">　　Scheduled Multi Tasking主要是让Application支援多工模式来执行任务，让Application不在前景模式下也可以继续在背景执行某些特定的任务，例如：背景下载、背景更新资料、背景唿叫服务&#8230;等。</p><p 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; ">　　然而，WP7.1提供Agent的模式，让开发Application时将要背景执行的逻辑，独立放置于Agent之中透过排程来完成任务。</p><p 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; ">　　但要注意的是，Agent与Application必竟还是属于不同的专案，因为IsolatedStorage中的IsolatedStorageSettings无法共用，要交换资料需透过IsolatedStorage档案或其他方式来交换。</p><p 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; ">　　因此，在设计一个支援Background Agent(ScheduledTaskAgent)的Application时，我个人会有几个考量：</p><p 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; ">　　1. 将背景执行的逻辑独立成一个类别或模组，由该模组完成所有背景的任务;</p><p 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; ">　　2. 使用设定档(config)的方式，将参数或执行结果独立于档案，提供Application与Agent均可以取得;</p><p 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; ">　　3. Agent是背景的任务，在背景发生Exception的容错机制需要特别设计，尽量透过通知告知用户;</p><p 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; ">　　接下来，将细部去讨论Scueduled Tasking由那些重要的元素组成：</p><p 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; ">　　〉Microsoft.Phone.Scheduler - Scheduled Multi Tasking：</p><p 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; ">　　WP7.1允许Schedule Task与Background Agent在背景执行它们的任务，然而Schedule Task与Background Agent使用上却有所不同：</p><p 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; ">　　&#8231;Schedule Task：重点在于指定「週期性/延迟性」执行任务，透过设定Schedule的时间频率重覆地去执行任务;</p><p 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; ">　　&#8231;Background Agent：根据不同的Agent可在细分使用重点，但较属性一次性任务或接收外部事件所触发的任务;</p><p 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; ">　　在Microsoft.Phone.Scheculer针对Scheulde提供了Task与Notification的使用，其用法上Schedule Task又是另一种用途，针对Schedule Notification会在另一篇&lt;&gt;进行说明。</p><p 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; ">　　然而，在Scheulde Task的使用上有几个重要元系一定要去了解的，以下将详细说明：</p><p 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; ">　　A. ScheduledActionService：</p><p 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; ">　　专用于管理该设备所有的Scheduled Actions。Scheduled Actions包括了可用于通知的Alarm、Reminder，更包括下方介绍的二个运行于Background Agent的Periodic Task与Resource-Intensive Task。其重要的方法如下：</p><table border="1" cellspacing="0" cellpadding="2" width="95%" align="center" 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; "><tbody 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; "><tr 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; "><td valign="top" width="186" 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; "><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; ">名称</strong></td><td valign="top" width="579" 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; "><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; ">说明</strong></td></tr><tr 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; "><td valign="top" width="186" 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; ">Add</td><td valign="top" width="579" 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; ">向作业系统註册一个Scheduled Action。主要透过Scheduled Action的Name做为识别值。</td></tr><tr 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; "><td valign="top" width="186" 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; ">Find</td><td valign="top" width="579" 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; ">透过特定的Name找出Scheduled Action。</td></tr><tr 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; "><td valign="top" width="186" 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; ">GetActions(Of T)</td><td valign="top" width="579" 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; ">回传系统中所有特定类型的Scheduled Actions。</td></tr><tr 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; "><td valign="top" width="186" 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; ">LaunchForTest</td><td valign="top" width="579" 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; ">指定特定的延迟时间与ScheduledTask后，要求Background Agent执行该ScheduledTask。</td></tr><tr 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; "><td valign="top" width="186" 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; ">Remove</td><td valign="top" width="579" 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; ">从Scheduled Action Service将指定的名称的Scheduled Action移除。</td></tr><tr 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; "><td valign="top" width="186" 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; ">Replace</td><td valign="top" width="579" 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; ">通常会配合Find找出指定Name的Scheduled Action，并加以取代它。</td></tr></tbody></table><p 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; "></p><p 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; ">　　B. PeriodicTask：</p><p 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; ">　　Periodic(定期) Task是一种定期代理运作的观念，专门针对运作背景任务所需时间较少，而且是执行隔间具有规律週期性的情境。</p><p 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; ">　　常见的使用情境，例如：定期上传手机的Location资讯、完成少量资料的同步、更新Tile状态&#8230;等。</p><p 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; ">　　B-1. 使用Periodic Task的约束与时间週期建议</p><table border="1" cellspacing="0" cellpadding="2" width="95%" align="center" 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; "><tbody 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; "><tr 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; "><td valign="top" width="235" 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; "><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; ">约束/建议</strong></td><td valign="top" width="531" 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; "><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; ">说明</strong></td></tr><tr 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; "><td valign="top" width="235" 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; ">排程时间间隔：30分</td><td valign="top" width="531" 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; ">通常每30分执行一次，在电力状况不错的情形下可以配合其他background process使用时，也可以设定接近上下差距10秒的使用。</td></tr><tr 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; "><td valign="top" width="235" 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; ">排程持续时间</td><td valign="top" width="531" 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; ">通常支援持续执行25秒，但也可能因为其他塬因造成该agent被提早结束。</td></tr><tr 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; "><td valign="top" width="235" 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; ">电池为节约模式时，能防止Exception</td><td valign="top" width="531" 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; ">由于电池是否要使用节约模式是由用户自行选择。如果该模式被选择时，当电池进入节约模式时，periodic task将有可能无法使用。</td></tr><tr 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; "><td valign="top" width="235" 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; ">每一个设备在Periodic Task的限制</td><td valign="top" width="531" 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; ">为了让电池最大化使用，不同的设备对电池的使用有一定的控制範围，因此，可能限制一个设备最多有几个Agent可以被执行，如果超过，它会自动被turn off。</td></tr></tbody></table><p 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; "></p><p 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; ">　　C. ResourceIntensiveTask：</p><p 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; ">　　Resource-Intensive(资源密集) Task是针对需要相对较长的处理时间，或是遇到需使用大量手机电源、网路等资源时较为适用的类型。</p><p 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; ">　　常见的使用情境，例如：同步大量的资料(如App需要下载大量的资料至手机端才能让App运行)&#8230;等。</p><p 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; ">　　C-1. 使用ResourceIntensiveTask的约束与时间週期建议</p><table border="1" cellspacing="0" cellpadding="2" width="95%" align="center" 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; "><tbody 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; "><tr 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; "><td valign="top" width="198" 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; "><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; ">约束/建议</strong></td><td valign="top" width="560" 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; "><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; ">说明</strong></td></tr><tr 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; "><td valign="top" width="198" 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; ">持续时间：10分鐘</td><td valign="top" width="560" 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; ">通常resource-intensive agent一般执行持续约10分鐘，如果有其他如下方的限制，将会提早停止agent的执行。</td></tr><tr 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; "><td valign="top" width="198" 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; ">外部电力需求</td><td valign="top" width="560" 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; ">除非设备已连接外部的电力来源，否则无法执行。</td></tr><tr 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; "><td valign="top" width="198" 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; ">无行动网路能线能力</td><td valign="top" width="560" 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; ">除非设备已通过Wi-Fi、行动网路或连接到PC，否则无法执行。</td></tr><tr 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; "><td valign="top" width="198" 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; ">最小电力需求</td><td valign="top" width="560" 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; "><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; ">除非电力超过90%的情形，否则无法执行resource-intensive agent</strong>。</td></tr><tr 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; "><td valign="top" width="198" 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; ">设备萤幕被锁定状态</td><td valign="top" width="560" 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; "><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; ">除非电话处于锁定的状态，否则无法执行resource-intensive agent</strong>。</td></tr><tr 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; "><td valign="top" width="198" 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; ">通话中无法使用</td><td valign="top" width="560" 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; ">当手机处于通中状态时，resource-intensive agent无法使用。</td></tr><tr 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; "><td valign="top" width="198" 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; ">不能改变网路状态为行动网路</td><td valign="top" width="560" 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; ">如果resource-intensive agent企图去唿叫AssociateToNetworkInterface(Socket, NetworkInterfaceInfo)来指定任何一种行动网路(GSM或CDMA)，则会失败。</td></tr></tbody></table><p 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; "></p><p 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; ">　　这二个元素其实都是由ScheduleAction与ScheduledTask抽象类别实作出来的，它们分别有自身使用的情境与适用性，</p><p 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; ">　　二者最大的差别即在于使用情境与需要耗用手机资源的多少，以及resource-intensive task要在萤幕锁定与电力90%以上才能执行。</p><p 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; ">　　由于使用resource-intensive task要求的限制实在很多，因此，在设计Scheduled Task时需要特别考虑这个部分，至于其他相关的</p><p 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; ">　　属性就大同小异了，以下简介其较长使用到的属性：</p><table border="1" cellspacing="0" cellpadding="2" width="95%" align="center" 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; "><tbody 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; "><tr 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; "><td valign="top" width="167" 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; "><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; ">名称</strong></td><td valign="top" width="595" 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; "><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; ">说明</strong></td></tr><tr 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; "><td valign="top" width="167" 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; ">Description</td><td valign="top" width="595" 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; ">设定/取得有关该Scheduled Task的描述。该描述的内容将会出现于手机「Settings/Applications/Background Tasks Settings」的画面中。&nbsp;<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; " />如下图：以Background Scheulde为程式名称：&nbsp;<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; " /><img title="0000" border="0" alt="0000" width="148" height="244" src="http://www.silverlightchina.net/uploads/allimg/111127/19432M5S-0.png" 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; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; " />&nbsp;<img title="0001" border="0" alt="0001" width="148" height="244" src="http://www.silverlightchina.net/uploads/allimg/111127/19432I593-1.png" 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; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; " /></td></tr><tr 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; "><td valign="top" width="167" 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; ">ExpirationTime</td><td valign="top" width="595" 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; ">设定/取得Scheduled Task到期的时间。</td></tr><tr 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; "><td valign="top" width="167" 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; ">IsScheduled</td><td valign="top" width="595" 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; ">取得Scheduled Task状态是否为启动。</td></tr><tr 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; "><td valign="top" width="167" 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; ">LastExitReason</td><td valign="top" width="595" 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; ">取得Agent执行最近一次Task被结束的理由。</td></tr><tr 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; "><td valign="top" width="167" 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; ">LastScheduledTime</td><td valign="top" width="595" 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; ">取得Agent执行最近一次Task的时间，以手机时间为主。</td></tr><tr 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; "><td valign="top" width="167" 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; ">Name</td><td valign="top" width="595" 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; ">取得Scheduled Action的名称。</td></tr></tbody></table><p 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; "></p><p 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; ">　　了解了二个元素的基本属性与使用情境后，有几个使用Background Agent要特别注意的：</p><p 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; ">　　1. 一个Application只能有一个Background agent(ScheduledTaskAgent)，但Agent可以单独使用PeriodicTask、ResourceIntensiveTask</p><p 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; ">　　或者二个同时使用。要注意的是一个Agent只能有一个PeriodicTask与一个ResourceIntensiveTask。</p><p 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; ">　　2. Background Agent(ScheduledTaskAgent)：</p><p 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; ">　　2-1. 透过OnInvoke(ScheduleTask)触发Agent逻辑的部分;</p><p 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; ">　　2-2. 已成功执行完所有任务时，记得唿叫NotifyComplete()告知Agent已完成任务;</p><p 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; ">　　2-3. 如果在执行过程发生错误或是无法执行Task时，要记得唿叫Abort()告知Agent接下来取消运作，然而即可以在Application端取得</p><p 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; ">　　ScheduledTask中的IsScheduled属性为false。但要注意的是如何Abort()之后，要记得使用ShellToast告知用户，以免用户不知道。</p><p 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; ">　　3. Background Agent在记忆体使用量的控制：</p><p 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; ">　　3-1. Periodic agents与resource-intensive agents允许在每次执行Task时，不超过6MB记忆体用量。</p><p 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; ">　　3-2. Audio agents则限制不能超过15MB记忆体用量。</p><p 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; ">　　3-3. 在Debug模式下则不限制，但可以透过<applicationmemoryusagelimit 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; "></applicationmemoryusagelimit>API去查询在每一个部分使用记体忆的状况。</p><p 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; ">　　4. 预设Agent为二个星期后需要重新安排Scheduled：</p><p 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; ">　　虽然可以透过ScheduledTask中的LastScheduledTime去确认究竟最近一次执行的Datetime为何，并且使用ExpirationTime去指定Task</p><p 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; ">　　可运行的时间长度。但是使用ScheduledTask可能因为条件限制(例如遇到执行Task时没网路能力，自动要求Agent延后执行)，造成Task</p><p 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; ">　　长时间没有被执行，为了确保Task不会一直占住不使用，透过设定2个星期可存活时间，可以自动解决这个问题。设定ExpirationTime可</p><p 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; ">　　在每一次执行Application于前景状况时，进行判断与设定。</p><p 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; ">　　5. Scheduled Agent在连续二个Crash后自动取消：</p><p 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; ">　　由于使用Periodic agents与resource-intensive agetns是交由Agent去控制，因此，当Agent连续出现二次以上的Crash或无法预期的错误，</p><p 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; ">　　该Agent将会被停止，需透过Application回到前景模式再重新启动它。</p></span><img src ="http://www.blogjava.net/TiGERTiAN/aggbug/369413.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-02-05 19:43 <a href="http://www.blogjava.net/TiGERTiAN/archive/2012/02/05/369413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>