﻿<?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-随笔杂记-随笔分类-Android</title><link>http://www.blogjava.net/liuyanbo/category/49628.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 26 May 2019 06:22:32 GMT</lastBuildDate><pubDate>Sun, 26 May 2019 06:22:32 GMT</pubDate><ttl>60</ttl><item><title>Ubuntu16.04配置Android编译环境</title><link>http://www.blogjava.net/liuyanbo/archive/2019/04/03/433702.html</link><dc:creator>天宇恒星</dc:creator><author>天宇恒星</author><pubDate>Wed, 03 Apr 2019 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/liuyanbo/archive/2019/04/03/433702.html</guid><wfw:comment>http://www.blogjava.net/liuyanbo/comments/433702.html</wfw:comment><comments>http://www.blogjava.net/liuyanbo/archive/2019/04/03/433702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyanbo/comments/commentRss/433702.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyanbo/services/trackbacks/433702.html</trackback:ping><description><![CDATA[<br /><div>sudo apt-get install -y&nbsp; openjdk-8-jdk openjdk-8-jre git&nbsp; build-essential libncurses5-dev:i386&nbsp; libx11-dev:i386&nbsp; libreadline6-dev:i386 g++-multilib&nbsp; tofrodos python-markdown libxml2-utils xsltproc&nbsp; &nbsp;dpkg-dev&nbsp; libesd0-dev&nbsp; git-core gnupg flex bison gperf build-essential&nbsp; zip curl&nbsp; gcc-multilib g++-multilib&nbsp; libc6-dev-i386&nbsp; lib32ncurses5-dev x11proto-core-dev libx11-dev&nbsp; &nbsp;ccache&nbsp; &nbsp;libxml2-utils xsltproc unzip m4 python-pip smbclient libgl1-mesa-dev libsdl1.2-dev zlib1g-dev:i386&nbsp; lib32z-dev zlib1g-dev lib32z1 lib32ncurses5 lib32stdc++6 libbz2-1.0:i386 libssl-dev</div><div></div><img src ="http://www.blogjava.net/liuyanbo/aggbug/433702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyanbo/" target="_blank">天宇恒星</a> 2019-04-03 11:29 <a href="http://www.blogjava.net/liuyanbo/archive/2019/04/03/433702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解压System.img的方法</title><link>http://www.blogjava.net/liuyanbo/archive/2019/04/03/433701.html</link><dc:creator>天宇恒星</dc:creator><author>天宇恒星</author><pubDate>Wed, 03 Apr 2019 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/liuyanbo/archive/2019/04/03/433701.html</guid><wfw:comment>http://www.blogjava.net/liuyanbo/comments/433701.html</wfw:comment><comments>http://www.blogjava.net/liuyanbo/archive/2019/04/03/433701.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyanbo/comments/commentRss/433701.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyanbo/services/trackbacks/433701.html</trackback:ping><description><![CDATA[<br /><pre bash"="" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; padding: 15px; margin-top: 0px; margin-bottom: 20px; line-height: 1.42857; overflow-wrap: normal; color: #abb2bf; background: #282c34; border: 1px solid #cccccc; border-radius: 4px; word-break: break-word !important;"><code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: inherit; background-color: transparent; border-radius: 0px; padding: 0px; border: none; vertical-align: middle;">$ simg2img system.img system.ext4.img<br /><div>$ mkdir system <br />$ sudo mount -t ext4 system.ext4.img system</div></code></pre><img src ="http://www.blogjava.net/liuyanbo/aggbug/433701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyanbo/" target="_blank">天宇恒星</a> 2019-04-03 11:27 <a href="http://www.blogjava.net/liuyanbo/archive/2019/04/03/433701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>l2tp vpn 在Android6.0/4G网络模式下不生效的处理方法</title><link>http://www.blogjava.net/liuyanbo/archive/2017/05/31/432563.html</link><dc:creator>天宇恒星</dc:creator><author>天宇恒星</author><pubDate>Wed, 31 May 2017 06:48:00 GMT</pubDate><guid>http://www.blogjava.net/liuyanbo/archive/2017/05/31/432563.html</guid><wfw:comment>http://www.blogjava.net/liuyanbo/comments/432563.html</wfw:comment><comments>http://www.blogjava.net/liuyanbo/archive/2017/05/31/432563.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyanbo/comments/commentRss/432563.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyanbo/services/trackbacks/432563.html</trackback:ping><description><![CDATA[&#215;#&#215;#4636#&#215;#&#215; 进手机信息，&#8220;切换DNS检查&#8221;修改为 allowed<img src ="http://www.blogjava.net/liuyanbo/aggbug/432563.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyanbo/" target="_blank">天宇恒星</a> 2017-05-31 14:48 <a href="http://www.blogjava.net/liuyanbo/archive/2017/05/31/432563.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android源码编译环境中集成leakcanary内存泄露检测工具的方法</title><link>http://www.blogjava.net/liuyanbo/archive/2016/12/31/432223.html</link><dc:creator>天宇恒星</dc:creator><author>天宇恒星</author><pubDate>Sat, 31 Dec 2016 09:06:00 GMT</pubDate><guid>http://www.blogjava.net/liuyanbo/archive/2016/12/31/432223.html</guid><wfw:comment>http://www.blogjava.net/liuyanbo/comments/432223.html</wfw:comment><comments>http://www.blogjava.net/liuyanbo/archive/2016/12/31/432223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyanbo/comments/commentRss/432223.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyanbo/services/trackbacks/432223.html</trackback:ping><description><![CDATA[Android.mk修改<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">LOCAL_PATH:=&nbsp;$(call&nbsp;my-dir)<br /><br />include&nbsp;$(CLEAR_VARS)&nbsp;<br />
<span style="color: red;">LOCAL_STATIC_JAVA_AAR_LIBRARIES&nbsp;:</span><span style="color: red;">=</span><span style="color: red;">&nbsp;leakcanary</span><span style="color: red;">-</span><span style="color: red;">android</span><span style="color: red;">-</span><span style="color: red;">aar&nbsp;leakcanary</span><span style="color: red;">-</span><span style="color: red;">watcher</span><span style="color: red;">-</span><span style="color: red;">aar&nbsp;leakcanary</span><span style="color: red;">-</span><span style="color: red;">analyzer</span><span style="color: red;">-</span><span style="color: red;">aar&nbsp;</span><br />
<span style="color: red;">LOCAL_STATIC_JAVA_LIBRARIES&nbsp;:</span><span style="color: red;">=</span><span style="color: red;">&nbsp;&nbsp;haha</span><br />
LOCAL_MODULE_TAGS&nbsp;:=&nbsp;optional&nbsp;<br />
LOCAL_AAPT_FLAGS&nbsp;:=&nbsp;\<br />
&nbsp;&nbsp;&nbsp;&nbsp;--auto-add-overlay&nbsp;\<br />
<span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: red;">--</span><span style="color: red;">extra</span><span style="color: red;">-</span><span style="color: red;">packages&nbsp;com.squareup.leakcanary</span>&nbsp; &nbsp;&nbsp;<br />
LOCAL_RESOURCE_DIR&nbsp;:=&nbsp;$(LOCAL_PATH)/res<br />
LOCAL_SRC_FILES&nbsp;:=&nbsp;\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(call&nbsp;all-java-files-under,&nbsp;src)&nbsp;&nbsp;<br />
LOCAL_PACKAGE_NAME&nbsp;:=&nbsp;XXXXX&nbsp;<br />
include&nbsp;$(BUILD_PACKAGE)<br />
<br />
include&nbsp;$(CLEAR_VARS)<br />
<span style="color: red;">LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES&nbsp;:</span><span style="color: red;">=</span>&nbsp;<br />
<span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;haha:</span><span style="color: red;">libs</span><span style="color: red;">/</span><span style="color: red;">haha</span><span style="color: red;">-</span><span style="color: red;">2.0</span><span style="color: red;">.</span><span style="color: red;">3</span><span style="color: red;">.jar&nbsp;\</span><br />
<span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;leakcanary</span><span style="color: red;">-</span><span style="color: red;">android</span><span style="color: red;">-</span><span style="color: red;">aar:libs</span><span style="color: red;">/</span><span style="color: red;">leakcanary</span><span style="color: red;">-</span><span style="color: red;">android</span><span style="color: red;">-</span><span style="color: red;">1.5</span><span style="color: red;">.aar&nbsp;\</span><br />
<span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;leakcanary</span><span style="color: red;">-</span><span style="color: red;">watcher</span><span style="color: red;">-</span><span style="color: red;">aar:libs</span><span style="color: red;">/</span><span style="color: red;">leakcanary</span><span style="color: red;">-</span><span style="color: red;">watcher</span><span style="color: red;">-</span><span style="color: red;">1.5</span><span style="color: red;">.aar&nbsp;\</span><br />
<span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;leakcanary</span><span style="color: red;">-</span><span style="color: red;">analyzer</span><span style="color: red;">-</span><span style="color: red;">aar:libs</span><span style="color: red;">/</span><span style="color: red;">leakcanary</span><span style="color: red;">-</span><span style="color: red;">analyzer</span><span style="color: red;">-</span><span style="color: red;">1.5</span><span style="color: red;">.aar&nbsp;</span><br />
include&nbsp;$(BUILD_MULTI_PREBUILT)<br /><br />
include&nbsp;$(call&nbsp;all-makefiles-under,$(LOCAL_PATH))<br />
</div>
<br /><img src ="http://www.blogjava.net/liuyanbo/aggbug/432223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyanbo/" target="_blank">天宇恒星</a> 2016-12-31 17:06 <a href="http://www.blogjava.net/liuyanbo/archive/2016/12/31/432223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu 14.04 配置Android编译环境</title><link>http://www.blogjava.net/liuyanbo/archive/2016/06/22/430988.html</link><dc:creator>天宇恒星</dc:creator><author>天宇恒星</author><pubDate>Wed, 22 Jun 2016 06:37:00 GMT</pubDate><guid>http://www.blogjava.net/liuyanbo/archive/2016/06/22/430988.html</guid><wfw:comment>http://www.blogjava.net/liuyanbo/comments/430988.html</wfw:comment><comments>http://www.blogjava.net/liuyanbo/archive/2016/06/22/430988.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyanbo/comments/commentRss/430988.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyanbo/services/trackbacks/430988.html</trackback:ping><description><![CDATA[<div>1.安装相关软件<br />sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev x11proto-core-dev libx11-dev lib32readline-gplv2-dev lib32z1-dev libgl1-mesa-dev gcc-multilib g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc libsdl-dev libesd0-dev libncurses5-dev lib32ncurses5 lib32stdc++6 rapidsvn nautilus-open-terminal libswitch-perl subversion openjdk-7-jdk lib32z1 libusb-dev libpcap-dev lib32bz2-1.0<span style="background-color: #efefef;"><span style="line-height: 14px;"> libmtp-common mtp-tools libmtp-dev libmtp-runtime libmtp9</span></span><br /><br />2.设置环境变量，修改.bashrc<br /><div>export ANDROID_SDK_HOME=/home/xxx/android_env/adt-bundle-linux-x86_64/sdk</div><div>export ANDROID_HOME=/home/xxx/android_env/adt-bundle-linux-x86_64/sdk</div><div>export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64</div><div>export JRE_HOME=$JAVA_HOME/jre</div><div>export PATH=.:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$ANDROID_SDK_HOME/tools:$ANDROID_SDK_HOME/platform-tools:$GRADLE_HOME/bin:$PATH:</div><div>export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib</div><div></div><div>export USE_CCACHE=1</div><div>export MAVEN_HOME=/home/xxx/android_env/apache-maven-3.3.9/</div><div>export GRADLE_HOME=/home/xxx/android_env/gradle-2.10</div><div>export GRADLE_USER_HOME=/home/xxx/android_env/gradle-2.10</div><div>export ANT_HOME=/home/xxx/android_env/apache-ant-1.9.7</div><div>export PATH=$GRADLE_HOME/bin:$MAVEN_HOME/bin:$ANT_HOME/bin:$PATH</div><div></div><div>export GOROOT=/root/go</div><div>export GOPATH=/root/goworkspace</div><div>export PATH="/root/go/bin:/root/goworkspace/bin:"$PATH</div></div><img src ="http://www.blogjava.net/liuyanbo/aggbug/430988.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyanbo/" target="_blank">天宇恒星</a> 2016-06-22 14:37 <a href="http://www.blogjava.net/liuyanbo/archive/2016/06/22/430988.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何解决Android 5.0中出现的警告：Service Intent must be explicit </title><link>http://www.blogjava.net/liuyanbo/archive/2016/05/31/430715.html</link><dc:creator>天宇恒星</dc:creator><author>天宇恒星</author><pubDate>Tue, 31 May 2016 05:19:00 GMT</pubDate><guid>http://www.blogjava.net/liuyanbo/archive/2016/05/31/430715.html</guid><wfw:comment>http://www.blogjava.net/liuyanbo/comments/430715.html</wfw:comment><comments>http://www.blogjava.net/liuyanbo/archive/2016/05/31/430715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyanbo/comments/commentRss/430715.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyanbo/services/trackbacks/430715.html</trackback:ping><description><![CDATA[有两种解决方法：<br style="word-wrap: break-word;" />1、设置Action和packageName：<br style="word-wrap: break-word;" />参考代码如下：<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 />-->Intent&nbsp;mIntent&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Intent();<br />mIntent.setAction("XXX.XXX.XXX");<span style="color: #008000; ">//</span><span style="color: #008000; ">你定义的service的action</span><span style="color: #008000; "><br /></span>mIntent.setPackage(getPackageName());<span style="color: #008000; ">//</span><span style="color: #008000; ">这里你需要设置你应用的包名</span><span style="color: #008000; "><br /></span>context.startService(mIntent);</div><span style="color: #ff0000; font-family: 新宋体; font-size: medium; line-height: 24px; background-color: #ffffff;">此方式是google官方推荐使用的解决方法。</span><br /><br />2、将隐式启动转换为显示启动：<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; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Intent&nbsp;getExplicitIntent(Context&nbsp;context,&nbsp;Intent&nbsp;implicitIntent)&nbsp;{<span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PackageManager&nbsp;pm&nbsp;=&nbsp;context.getPackageManager();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;ResolveInfo&gt;&nbsp;resolveInfo&nbsp;=&nbsp;pm.queryIntentServices(implicitIntent,&nbsp;0);<span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(resolveInfo&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;||&nbsp;resolveInfo.size()&nbsp;!=&nbsp;1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;}<span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResolveInfo&nbsp;serviceInfo&nbsp;=&nbsp;resolveInfo.get(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;packageName&nbsp;=&nbsp;serviceInfo.serviceInfo.packageName;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;className&nbsp;=&nbsp;serviceInfo.serviceInfo.name;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ComponentName&nbsp;component&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ComponentName(packageName,&nbsp;className);<span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Intent&nbsp;explicitIntent&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Intent(implicitIntent);<span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;explicitIntent.setComponent(component);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;explicitIntent;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><span style="font-family: 新宋体; font-size: medium; line-height: 24px; background-color: #ffffff;">调用方式如下：</span><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 />-->Intent&nbsp;mIntent&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Intent();<br />mIntent.setAction("XXX.XXX.XXX");<br />Intent&nbsp;eintent&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Intent(getExplicitIntent(mContext,mIntent));<br />context.startService(eintent);</div><br /><img src ="http://www.blogjava.net/liuyanbo/aggbug/430715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyanbo/" target="_blank">天宇恒星</a> 2016-05-31 13:19 <a href="http://www.blogjava.net/liuyanbo/archive/2016/05/31/430715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Media scan 的使用方法</title><link>http://www.blogjava.net/liuyanbo/archive/2012/11/23/391795.html</link><dc:creator>天宇恒星</dc:creator><author>天宇恒星</author><pubDate>Fri, 23 Nov 2012 01:12:00 GMT</pubDate><guid>http://www.blogjava.net/liuyanbo/archive/2012/11/23/391795.html</guid><wfw:comment>http://www.blogjava.net/liuyanbo/comments/391795.html</wfw:comment><comments>http://www.blogjava.net/liuyanbo/archive/2012/11/23/391795.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyanbo/comments/commentRss/391795.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyanbo/services/trackbacks/391795.html</trackback:ping><description><![CDATA[<br /><div><a href="http://www.blogjava.net/Green-nut/articles/336256.html">http://www.blogjava.net/Green-nut/articles/336256.html</a></div><img src ="http://www.blogjava.net/liuyanbo/aggbug/391795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyanbo/" target="_blank">天宇恒星</a> 2012-11-23 09:12 <a href="http://www.blogjava.net/liuyanbo/archive/2012/11/23/391795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ListView线程刷新异常的问题</title><link>http://www.blogjava.net/liuyanbo/archive/2012/09/13/387616.html</link><dc:creator>天宇恒星</dc:creator><author>天宇恒星</author><pubDate>Thu, 13 Sep 2012 02:12:00 GMT</pubDate><guid>http://www.blogjava.net/liuyanbo/archive/2012/09/13/387616.html</guid><wfw:comment>http://www.blogjava.net/liuyanbo/comments/387616.html</wfw:comment><comments>http://www.blogjava.net/liuyanbo/archive/2012/09/13/387616.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyanbo/comments/commentRss/387616.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyanbo/services/trackbacks/387616.html</trackback:ping><description><![CDATA[如下错误:<br /><br /><span style="font-size:12.0pt;font-family: 宋体;">java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread.</span><br /><br />可以使用如下方式解决：<br />将notifyDataSetChanged 放在handler中，同时加上红字字体代码：<br /><br /><div><span style="color: red; ">mWifiListView.setVisibility(View.GONE);</span></div><div>mWifiListAdapter.notifyDataSetChanged();</div><div><span style="color: red; ">mWifiListView.setVisibility(View.VISIBLE); &nbsp; &nbsp;</span></div><img src ="http://www.blogjava.net/liuyanbo/aggbug/387616.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyanbo/" target="_blank">天宇恒星</a> 2012-09-13 10:12 <a href="http://www.blogjava.net/liuyanbo/archive/2012/09/13/387616.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获取Preview数据并转换成jpeg格式的方法</title><link>http://www.blogjava.net/liuyanbo/archive/2012/08/04/384760.html</link><dc:creator>天宇恒星</dc:creator><author>天宇恒星</author><pubDate>Sat, 04 Aug 2012 07:15:00 GMT</pubDate><guid>http://www.blogjava.net/liuyanbo/archive/2012/08/04/384760.html</guid><wfw:comment>http://www.blogjava.net/liuyanbo/comments/384760.html</wfw:comment><comments>http://www.blogjava.net/liuyanbo/archive/2012/08/04/384760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyanbo/comments/commentRss/384760.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyanbo/services/trackbacks/384760.html</trackback:ping><description><![CDATA[<div>1.startPreview之前设置PreviewCallback
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;mCameraDevice.setPreviewCallback(mPreviewCallback);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;mCameraDevice.startPreview();</span></div>2. 获取preview数据<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;PreviewCallback&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;<br /><img id="Codehighlighter1_90_510_Open_Image" onclick="this.style.display='none'; Codehighlighter1_90_510_Open_Text.style.display='none'; Codehighlighter1_90_510_Closed_Image.style.display='inline'; Codehighlighter1_90_510_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_90_510_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_90_510_Closed_Text.style.display='none'; Codehighlighter1_90_510_Open_Image.style.display='inline'; Codehighlighter1_90_510_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android.hardware.Camera.PreviewCallback&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_90_510_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_90_510_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_167_507_Open_Image" onclick="this.style.display='none'; Codehighlighter1_167_507_Open_Text.style.display='none'; Codehighlighter1_167_507_Closed_Image.style.display='inline'; Codehighlighter1_167_507_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_167_507_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_167_507_Closed_Text.style.display='none'; Codehighlighter1_167_507_Open_Image.style.display='inline'; Codehighlighter1_167_507_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;onPreviewFrame(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;data,&nbsp;android.hardware.Camera&nbsp;camera)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_167_507_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_167_507_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Size&nbsp;size&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mParameters.getPreviewSize();<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;YuvImage&nbsp;yuvimage&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;YuvImage(data,&nbsp;ImageFormat.NV21,&nbsp;size.width,&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size.height,&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayOutputStream&nbsp;outputSteam&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ByteArrayOutputStream();<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yuvimage.compressToJpeg(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Rect(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;size.width,&nbsp;size.height),&nbsp;</span><span style="color: #000000">80</span><span style="color: #000000">,&nbsp;outputSteam);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div><br /></div><img src ="http://www.blogjava.net/liuyanbo/aggbug/384760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyanbo/" target="_blank">天宇恒星</a> 2012-08-04 15:15 <a href="http://www.blogjava.net/liuyanbo/archive/2012/08/04/384760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android中自定义View的MeasureSpec使用</title><link>http://www.blogjava.net/liuyanbo/archive/2012/03/15/371969.html</link><dc:creator>天宇恒星</dc:creator><author>天宇恒星</author><pubDate>Thu, 15 Mar 2012 11:18:00 GMT</pubDate><guid>http://www.blogjava.net/liuyanbo/archive/2012/03/15/371969.html</guid><wfw:comment>http://www.blogjava.net/liuyanbo/comments/371969.html</wfw:comment><comments>http://www.blogjava.net/liuyanbo/archive/2012/03/15/371969.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyanbo/comments/commentRss/371969.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyanbo/services/trackbacks/371969.html</trackback:ping><description><![CDATA[<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; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">有时，Android系统控件无法满足我们的需求，因此有必要自定义View。具体方法参见官方开发文档：<a href="http://developer.android.com/guide/topics/ui/custom-components.html" style="color: #108ac6; ">http://developer.android.com/guide/topics/ui/custom-components.html</a></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; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; "><br />
</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; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">一般来说，自定义控件都会去重写View的onMeasure方法，因为该方法指定该控件在屏幕上的大小。</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; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">protected void&nbsp;<span style="margin-right: 2px; ">onMeasure</span>&nbsp;(int widthMeasureSpec, int heightMeasureSpec)</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; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">onMeasure传入的两个参数是由上一层控件传入的大小，有多种情况，重写该方法时需要对计算控件的实际大小，然后调用<span style="line-height: 13px; ">setMeasuredDimension(int, int)</span>设置实际大小。</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; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; "><br />
</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; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">onMeasure传入的widthMeasureSpec和heightMeasureSpec不是一般的尺寸数值，而是将模式和尺寸组合在一起的数值。我们需要通过int mode = MeasureSpec.getMode(widthMeasureSpec<span style="color: #3a3a3a; ">)得到模式，用int size =&nbsp;</span>MeasureSpec.getSize(widthMeasureSpec<span style="color: #3a3a3a; ">)得到尺寸。</span></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; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; "><br />
</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; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">mode共有三种情况，取值分别为MeasureSpec.<span style="color: #333333; line-height: 16px; ">UNSPECIFIED, MeasureSpec.</span><span style="color: #333333; line-height: 16px; ">EXACTLY, MeasureSpec.</span><span style="color: #333333; line-height: 16px; ">AT_MOST。</span></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; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; "><br />
</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; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; "><span style="color: #333333; line-height: 16px; ">MeasureSpec.</span><span style="color: #333333; line-height: 16px; ">EXACTLY是精确尺寸，当我们将控件的layout_width或layout_height指定为具体数值时如andorid:layout_width="50dip"，或者为FILL_PARENT是，都是控件大小已经确定的情况，都是精确尺寸。</span></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; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; "><br />
</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; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">MeasureSpec.AT_MOST是最大尺寸，当控件的layout_width或layout_height指定为WRAP_CONTENT时，控件大小一般随着控件的子空间或内容进行变化，此时控件尺寸只要不超过父控件允许的最大尺寸即可。因此，此时的mode是AT_MOST，size给出了父控件允许的最大尺寸。</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; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; "><br />
</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; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">MeasureSpec.UNSPECIFIED是未指定尺寸，这种情况不多，一般都是父控件是AdapterView，通过measure方法传入的模式。</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; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; "><br />
</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; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">因此，在重写onMeasure方法时要根据模式不同进行尺寸计算。下面代码就是一种比较典型的方式：<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 />-->@Override&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">protected</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;onMeasure(<span style="color: #0000FF; ">int</span>&nbsp;widthMeasureSpec,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;heightMeasureSpec)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;setMeasuredDimension(getMeasuredLength(widthMeasureSpec,&nbsp;<span style="color: #0000FF; ">true</span>),&nbsp;getMeasuredLength(heightMeasureSpec,&nbsp;<span style="color: #0000FF; ">false</span>));&nbsp;&nbsp;&nbsp;&nbsp;<br />}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;getMeasuredLength(<span style="color: #0000FF; ">int</span>&nbsp;length,&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;isWidth)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;specMode&nbsp;=&nbsp;MeasureSpec.getMode(length);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;specSize&nbsp;=&nbsp;MeasureSpec.getSize(length);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;padding&nbsp;=&nbsp;isWidth&nbsp;?&nbsp;getPaddingLeft()&nbsp;+&nbsp;getPaddingRight()&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;getPaddingTop()&nbsp;+&nbsp;getPaddingBottom();&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(specMode&nbsp;==&nbsp;MeasureSpec.EXACTLY)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;=&nbsp;specSize;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;=&nbsp;isWidth&nbsp;?&nbsp;padding&nbsp;+&nbsp;mWave.length&nbsp;/&nbsp;4&nbsp;:&nbsp;DEFAULT_HEIGHT&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;padding;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(specMode&nbsp;==&nbsp;MeasureSpec.AT_MOST)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;=&nbsp;Math.min(size,&nbsp;specSize);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;size;&nbsp;&nbsp;&nbsp;&nbsp;<br />} &nbsp;</div>
</p><img src ="http://www.blogjava.net/liuyanbo/aggbug/371969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyanbo/" target="_blank">天宇恒星</a> 2012-03-15 19:18 <a href="http://www.blogjava.net/liuyanbo/archive/2012/03/15/371969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android 获取和设置屏幕亮度</title><link>http://www.blogjava.net/liuyanbo/archive/2012/03/13/371799.html</link><dc:creator>天宇恒星</dc:creator><author>天宇恒星</author><pubDate>Tue, 13 Mar 2012 06:49:00 GMT</pubDate><guid>http://www.blogjava.net/liuyanbo/archive/2012/03/13/371799.html</guid><wfw:comment>http://www.blogjava.net/liuyanbo/comments/371799.html</wfw:comment><comments>http://www.blogjava.net/liuyanbo/archive/2012/03/13/371799.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyanbo/comments/commentRss/371799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyanbo/services/trackbacks/371799.html</trackback:ping><description><![CDATA[<p style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 20px; "><strong># 获取屏幕亮度</strong></p><div style="font-size: 12px; margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; "><pre style="line-height: 20px; margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New'; "><span style="line-height: 1.5; color: #0000ff; ">public</span> <span style="line-height: 1.5; color: #0000ff; ">static</span> <span style="line-height: 1.5; color: #0000ff; ">int</span> getScreenBrightness(Activity activity) {<br />    <span style="line-height: 1.5; color: #0000ff; ">int</span> value = 0;<br />    ContentResolver cr = activity.getContentResolver();<br />    <span style="line-height: 1.5; color: #0000ff; ">try</span> {<br />        value = Settings.System.getInt(cr, Settings.System.SCREEN_BRIGHTNESS);<br />    } <span style="line-height: 1.5; color: #0000ff; ">catch</span> (SettingNotFoundException e) {<br />        <br />    }<br />    <span style="line-height: 1.5; color: #0000ff; ">return</span> value;<br />}</pre><div style="margin-top: 5px; "><span style="line-height: 18px;"><br /></span></div></div><p style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 20px; "><strong># 设置屏幕亮度</strong></p><div style="font-size: 12px; margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; "><pre style="line-height: 20px; margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New'; "><span style="line-height: 1.5; color: #0000ff; ">public</span> <span style="line-height: 1.5; color: #0000ff; ">static</span> <span style="line-height: 1.5; color: #0000ff; ">void</span> setScreenBrightness(Activity activity, <span style="line-height: 1.5; color: #0000ff; ">int</span> value) {<br />    WindowManager.LayoutParams params = activity.getWindow().getAttributes();<br />    params.screenBrightness = value / 255f;<br />    activity.getWindow().setAttributes(params);<br />}</pre><div style="margin-top: 5px; "><span style="line-height: 18px;"><br /></span></div></div><img src ="http://www.blogjava.net/liuyanbo/aggbug/371799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyanbo/" target="_blank">天宇恒星</a> 2012-03-13 14:49 <a href="http://www.blogjava.net/liuyanbo/archive/2012/03/13/371799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入理解Android消息处理系统——Looper、Handler、Thread</title><link>http://www.blogjava.net/liuyanbo/archive/2011/09/20/359074.html</link><dc:creator>天宇恒星</dc:creator><author>天宇恒星</author><pubDate>Tue, 20 Sep 2011 06:56:00 GMT</pubDate><guid>http://www.blogjava.net/liuyanbo/archive/2011/09/20/359074.html</guid><wfw:comment>http://www.blogjava.net/liuyanbo/comments/359074.html</wfw:comment><comments>http://www.blogjava.net/liuyanbo/archive/2011/09/20/359074.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyanbo/comments/commentRss/359074.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyanbo/services/trackbacks/359074.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #333333; font-family: Tahoma, Verdana, Arial, sans-serif; letter-spacing: 1px; line-height: 18px; background-color: #ffffff; font-size: large; "><br />熟悉Windows编程的朋友可能知道Windows程序是消息驱动的，并且有全局的消息循环系统。而Android应用程序也是消息驱动的，按道理来说也应该提供消息循环机制。实际上谷歌参考了Windows的消息循环机制，也在Android系统中实现了消息循环机制。Android通过Looper、Handler来实现消息循环机制，Android消息循环是针对线程的（每个线程都可以有自己的消息队列和消息循环）。本文深入介绍一下Android消息处理系统原理。</span><span class="Apple-style-span" style="color: #333333; font-family: Tahoma, Verdana, Arial, sans-serif; font-size: 13px; letter-spacing: 1px; line-height: 18px; background-color: #ffffff; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4"><span style="color: #333333; font-family: Tahoma, Verdana, Arial, sans-serif; font-size: 13px; letter-spacing: 1px; line-height: 18px; "></span></font></p></span><span class="Apple-style-span" style="color: #333333; font-family: Tahoma, Verdana, Arial, sans-serif; letter-spacing: 1px; line-height: 18px; background-color: #ffffff; "><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">&nbsp;&nbsp;&nbsp; Android系统中Looper负责管理线程的消息队列和消息循环，具体实现请参考Looper的源码。 可以通过Loop.myLooper()得到当前线程的Looper对象，通过Loop.getMainLooper()可以获得当前进程的主线程的Looper对象。</font></p><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">&nbsp;&nbsp;&nbsp; 前面提到Android系统的消息队列和消息循环都是针对具体线程的，一个线程可以存在（当然也可以不存在）一个消息队列和一个消息循环（Looper），特定线程的消息只能分发给本线程，不能进行跨线程，跨进程通讯。但是创建的工作线程默认是没有消息循环和消息队列的，如果想让该线程具有消息队列和消息循环，需要在线程中首先调用Looper.prepare()来创建消息队列，然后调用Looper.loop()进入消息循环。如下例所示：</font></p><pre style="background-color: #ccccff; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: #6699cc; border-right-color: #6699cc; border-bottom-color: #6699cc; border-left-color: #6699cc; padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1.16em; overflow-x: auto; overflow-y: auto; ">  <span style="color: #0000ff; ">class</span> LooperThread <span style="color: #0000ff; ">extends</span> Thread {
      <span style="color: #0000ff; ">public</span> Handler mHandler;

      <span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">void</span> run() {
          Looper.prepare();

          mHandler = <span style="color: #0000ff; ">new</span> Handler() {
              <span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">void</span> handleMessage(Message msg) {
                  <span style="color: #008000; ">// process incoming messages here</span>
              }
          };

          Looper.loop();
      }
  }</pre><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">这样你的线程就具有了消息处理机制了，在Handler中进行消息处理。</font></p><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; Activity是一个UI线程，运行于主线程中，Android系统在启动的时候会为Activity创建一个消息队列和消息循环（Looper）。详细实现请参考ActivityThread.java文件。</font></p><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; Handler的作用是把消息加入特定的（Looper）消息队列中，并分发和处理该消息队列中的消息。构造Handler的时候可以指定一个Looper对象，如果不指定则利用当前线程的Looper创建。详细实现请参考Looper的源码。</font></p><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; Activity、Looper、Handler的关系如下图所示：</font></p><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><img src="http://api.photoshop.com/home_a6dba90e84ba45f8aa3ec8f7953a00d0/adobe-px-assets/626919e5915a4493b860bb456b839d73" width="372" height="219" style="margin-top: 0.6em; margin-right: auto; margin-bottom: 0.6em; margin-left: auto; display: block; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccc99; border-right-color: #cccc99; border-bottom-color: #cccc99; border-left-color: #cccc99; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; float: none; " alt="" /></p><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; 一个Activity中可以创建多个工作线程或者其他的组件，如果这些线程或者组件把他们的消息放入Activity的主线程消息队列，那么该消息就会在主线程中处理了。因为主线程一般负责界面的更新操作，并且Android系统中的weget不是线程安全的，所以这种方式可以很好的实现Android界面更新。在Android系统中这种方式有着广泛的运用。</font></p><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; 那么另外一个线程怎样把消息放入主线程的消息队列呢？答案是通过Handle对象，只要Handler对象以主线程的Looper创建，那么调用Handler的sendMessage等接口，将会把消息放入队列都将是放入主线程的消息队列。并且将会在Handler主线程中调用该handler的handleMessage接口来处理消息。</font></p><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; 这里面涉及到线程同步问题，请先参考如下例子来理解Handler对象的线程模型：</font></p><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">1、首先创建MyHandler工程。</font></p><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">2、在MyHandler.java中加入如下的代码：</font></p><pre style="background-color: #ccccff; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: #6699cc; border-right-color: #6699cc; border-bottom-color: #6699cc; border-left-color: #6699cc; padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1.16em; overflow-x: auto; overflow-y: auto; "><span style="color: #0000ff; ">package</span> com.simon;

<span style="color: #0000ff; ">import</span> android.app.Activity;
<span style="color: #0000ff; ">import</span> android.os.Bundle;
<span style="color: #0000ff; ">import</span> android.os.Message;
<span style="color: #0000ff; ">import</span> android.util.Log;
<span style="color: #0000ff; ">import</span> android.os.Handler;

<span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">class</span> MyHandler <span style="color: #0000ff; ">extends</span> Activity {
	<span style="color: #0000ff; ">static</span> <span style="color: #0000ff; ">final</span> String TAG = "<span style="color: #8b0000; ">Handler</span>";
	Handler h = <span style="color: #0000ff; ">new</span> Handler(){
    	<span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">void</span> handleMessage (Message msg)
    	{
    		<span style="color: #0000ff; ">switch</span>(msg.what)
    		{
    		<span style="color: #0000ff; ">case</span> HANDLER_TEST:
    			Log.d(TAG, "<span style="color: #8b0000; ">The handler thread id = </span>" + Thread.currentThread().getId() + "<span style="color: #8b0000; ">\n</span>");
    			<span style="color: #0000ff; ">break</span>;
    		}
    	}
    };

	<span style="color: #0000ff; ">static</span> <span style="color: #0000ff; ">final</span> <span style="color: #0000ff; ">int</span> HANDLER_TEST = 1;
    <span style="color: #008000; ">/** Called when the activity is first created. */</span>
    @Override
    <span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">void</span> onCreate(Bundle savedInstanceState) {
        <span style="color: #0000ff; ">super</span>.onCreate(savedInstanceState);
        Log.d(TAG, "<span style="color: #8b0000; ">The main thread id = </span>" + Thread.currentThread().getId() + "<span style="color: #8b0000; ">\n</span>");

        <span style="color: #0000ff; ">new</span> myThread().start();
        setContentView(R.layout.main);
    }

    <span style="color: #0000ff; ">class</span> myThread <span style="color: #0000ff; ">extends</span> Thread
    {
    	<span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">void</span> run()
    	{
    		Message msg = <span style="color: #0000ff; ">new</span> Message();
    		msg.what = HANDLER_TEST;
    		h.sendMessage(msg);
    		Log.d(TAG, "<span style="color: #8b0000; ">The worker thread id = </span>" + Thread.currentThread().getId() + "<span style="color: #8b0000; ">\n</span>");
    	}
    }
}</pre><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">在这个例子中我们主要是打印，这种处理机制各个模块的所处的线程情况。如下是我的机器运行结果：</font></p><pre style="background-color: #ccccff; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: #6699cc; border-right-color: #6699cc; border-bottom-color: #6699cc; border-left-color: #6699cc; padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 1.16em; overflow-x: auto; overflow-y: auto; ">09-10 23:40:51.478: DEBUG/Handler(302): The main thread id = 1
09-10 23:40:51.569: DEBUG/Handler(302): The worker thread id = 8
09-10 23:40:52.128: DEBUG/Handler(302): The handler thread id = 1</pre><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">我们可以看出消息处理是在主线程中处理的，在消息处理函数中可以安全的调用主线程中的任何资源，包括刷新界面。工作线程和主线程运行在不同的线程中，所以必须要注意这两个线程间的竞争关系。</font></p><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; 上例中，你可能注意到在工作线程中访问了主线程handler对象，并在调用handler的对象向消息队列加入了一个消息。这个过程中会不会出现消息队列数据不一致问题呢？答案是handler对象不会出问题，因为handler对象管理的Looper对象是线程安全的，不管是加入消息到消息队列和从队列读出消息都是有同步对象保护的，具体请参考Looper.java文件。上例中没有修改handler对象，所以handler对象不可能会出现数据不一致的问题。</font></p><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; 通过上面的分析，我们可以得出如下结论：</font></p><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">1、如果通过工作线程刷新界面，推荐使用handler对象来实现。</font></p><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">2、注意工作线程和主线程之间的竞争关系。推荐handler对象在主线程中构造完成（并且启动工作线程之后不要再修改之，否则会出现数据不一致），然后在工作线程中可以放心的调用发送消息SendMessage等接口。</font></p><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">3、除了2所述的hanlder对象之外的任何主线程的成员变量如果在工作线程中调用，仔细考虑线程同步问题。如果有必要需要加入同步对象保护该变量。</font></p><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">4、handler对象的handleMessage接口将会在主线程中调用。在这个函数可以放心的调用主线程中任何变量和函数，进而完成更新UI的任务。</font></p><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">5、Android很多API也利用Handler这种线程特性，作为一种回调函数的变种，来通知调用者。这样Android框架就可以在其线程中将消息发送到调用者的线程消息队列之中，不用担心线程同步的问题。</font></p><p style="font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; 深入理解Android消息处理机制对于应用程序开发非常重要，也可以让你对线程同步有更加深刻的认识。以上是最近Simon学习Android消息处理机制的一点儿总结，如有错误之处请不吝指教。</font></p></span><img src ="http://www.blogjava.net/liuyanbo/aggbug/359074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyanbo/" target="_blank">天宇恒星</a> 2011-09-20 14:56 <a href="http://www.blogjava.net/liuyanbo/archive/2011/09/20/359074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编译带有第三方jar包的ap，如何才能过用mmm编译成功</title><link>http://www.blogjava.net/liuyanbo/archive/2011/09/20/359072.html</link><dc:creator>天宇恒星</dc:creator><author>天宇恒星</author><pubDate>Tue, 20 Sep 2011 06:49:00 GMT</pubDate><guid>http://www.blogjava.net/liuyanbo/archive/2011/09/20/359072.html</guid><wfw:comment>http://www.blogjava.net/liuyanbo/comments/359072.html</wfw:comment><comments>http://www.blogjava.net/liuyanbo/archive/2011/09/20/359072.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyanbo/comments/commentRss/359072.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyanbo/services/trackbacks/359072.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">具体代码如下：<br />
</span>
<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: #000000; ">LOCAL_PATH&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;$(call&nbsp;my</span><span style="color: #000000; ">-</span><span style="color: #000000; ">dir)&nbsp;&nbsp;<br />
include&nbsp;$(CLEAR_VARS)&nbsp;&nbsp;<br />
LOCAL_STATIC_JAVA_LIBRARIES&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;libarity&nbsp;&nbsp;<br />
LOCAL_SRC_FILES&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;$(call&nbsp;all</span><span style="color: #000000; ">-</span><span style="color: #000000; ">java</span><span style="color: #000000; ">-</span><span style="color: #000000; ">files</span><span style="color: #000000; ">-</span><span style="color: #000000; ">under,&nbsp;src)&nbsp;&nbsp;<br />
LOCAL_PACKAGE_NAME&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;TestJar&nbsp;&nbsp;<br />
include&nbsp;$(BUILD_PACKAGE)&nbsp;&nbsp;<br />
##################################################&nbsp;&nbsp;<br />
include&nbsp;$(CLEAR_VARS)&nbsp;&nbsp;<br />
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;libarity:lily.jar&nbsp;&nbsp;<br />
include&nbsp;$(BUILD_MULTI_PREBUILT)&nbsp;&nbsp;<br />
#&nbsp;Use&nbsp;the&nbsp;folloing&nbsp;include&nbsp;to&nbsp;make&nbsp;our&nbsp;test&nbsp;apk.&nbsp;&nbsp;<br />
include&nbsp;$(call&nbsp;all</span><span style="color: #000000; ">-</span><span style="color: #000000; ">makefiles</span><span style="color: #000000; ">-</span><span style="color: #000000; ">under,$(LOCAL_PATH)) &nbsp;<br />
</span></div><br /><br /><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><p>关键在于LOCAL_STATIC_JAVA_LIBRARIES := libarity和LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libarity:lily.jar</p><p>其实libarity是个名字可以随便取，但是两个属性的值要一样就好了，但是后面那个冒号里面就一定要写你的jar包名，你的jar包一定放在工程的根目录就好了，目录结构如下：</p><p>-res</p><p>-src</p><p><span style="white-space: pre; ">	</span>-com</p><p><span style="white-space: pre; ">		</span>-ianc</p><p><span style="white-space: pre; ">			</span>-testjar</p><p><span style="white-space: pre; ">				</span>TestJar.java</p><p>android.mk</p><p>AndroidManifest.xml</p><p>default.properties</p><p>lily.jar</p></span><br /><img src ="http://www.blogjava.net/liuyanbo/aggbug/359072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyanbo/" target="_blank">天宇恒星</a> 2011-09-20 14:49 <a href="http://www.blogjava.net/liuyanbo/archive/2011/09/20/359072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>善用Android预定义样式</title><link>http://www.blogjava.net/liuyanbo/archive/2011/09/20/359071.html</link><dc:creator>天宇恒星</dc:creator><author>天宇恒星</author><pubDate>Tue, 20 Sep 2011 06:45:00 GMT</pubDate><guid>http://www.blogjava.net/liuyanbo/archive/2011/09/20/359071.html</guid><wfw:comment>http://www.blogjava.net/liuyanbo/comments/359071.html</wfw:comment><comments>http://www.blogjava.net/liuyanbo/archive/2011/09/20/359071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyanbo/comments/commentRss/359071.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyanbo/services/trackbacks/359071.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; background-color: #ffffff; "><h1 style="font-size: 2em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; ">字体大小</h1><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; ">对于能够显示文字的控件（如TextView EditText RadioButton Button CheckBox Chronometer等等），你有时需要控制字体的大小。Android平台定义了三种字体大小。</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; ">"?android:attr/textAppearanceLarge"</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; ">"?android:attr/textAppearanceMedium"</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; ">"?android:attr/textAppearanceSmall"</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><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; ">android:textAppearance="?android:attr/textAppearanceLarge"&nbsp;<br />android:textAppearance="?android:attr/textAppearanceMedium"&nbsp;<br />android:textAppearance="?android:attr/textAppearanceSmall"</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><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; ">style="?android:attr/textAppearanceLarge"&nbsp;<br />style="?android:attr/textAppearanceMedium"&nbsp;<br />style="?android:attr/textAppearanceSmall"</p><h1 style="font-size: 2em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; ">字体颜色</h1><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; ">android:textColor="?android:attr/textColorPrimary"&nbsp;<br />android:textColor="?android:attr/textColorSecondary"&nbsp;<br />android:textColor="?android:attr/textColorTertiary"&nbsp;<br />android:textColor="?android:attr/textColorPrimaryInverse"&nbsp;<br />android:textColor="?android:attr/textColorSecondaryInverse"</p><h1 style="font-size: 2em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; ">ProgressBar</h1><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; ">style="?android:attr/progressBarStyleHorizontal"&nbsp;<br />style="?android:attr/progressBarStyleLarge"&nbsp;<br />style="?android:attr/progressBarStyleSmall"&nbsp;<br />style="?android:attr/progressBarStyleSmallTitle"</p><h1 style="font-size: 2em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; ">分隔符</h1><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; ">&lt;View android:layout_width="fill_parent"&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android:layout_height="1dip"&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android:background="?android:attr/listDivider" /&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; ">纵向：</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; ">&lt;View android:layout_width="1dip"&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android:layout_height="fill_parent"&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android:background="?android:attr/listDivider" /&gt;</p><h1 style="font-size: 2em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; ">CheckBox</h1><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; ">style="?android:attr/starStyle"</p><h1 style="font-size: 2em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; ">类似标题栏效果的TextView</h1><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; ">style="?android:attr/listSeparatorTextViewStyle"</p><h1 style="font-size: 2em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; ">其它有用的样式</h1><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; ">android:layout_height="?android:attr/listPreferredItemHeight"</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; ">android:paddingRight="?android:attr/scrollbarSize"</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; ">style="?android:attr/windowTitleBackgroundStyle"</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; ">style="?android:attr/windowTitleStyle"</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; ">android:layout_height="?android:attr/windowTitleSize"</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; ">android:background="?android:attr/windowBackground"</p></span><img src ="http://www.blogjava.net/liuyanbo/aggbug/359071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyanbo/" target="_blank">天宇恒星</a> 2011-09-20 14:45 <a href="http://www.blogjava.net/liuyanbo/archive/2011/09/20/359071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>