??xml version="1.0" encoding="utf-8" standalone="yes"?>看全色黄大色大片免费久久久,精品综合久久久久久97超人,久久天天躁狠狠躁夜夜2020老熟妇 http://www.shnenglu.com/life02/category/18322.htmlzh-cnMon, 09 Apr 2012 15:10:19 GMTMon, 09 Apr 2012 15:10:19 GMT60PackageInstaller 原理qͼ转)http://www.shnenglu.com/life02/archive/2012/04/08/170511.htmllife02life02Sun, 08 Apr 2012 14:29:00 GMThttp://www.shnenglu.com/life02/archive/2012/04/08/170511.htmlhttp://www.shnenglu.com/life02/comments/170511.htmlhttp://www.shnenglu.com/life02/archive/2012/04/08/170511.html#Feedback0http://www.shnenglu.com/life02/comments/commentRss/170511.htmlhttp://www.shnenglu.com/life02/services/trackbacks/170511.html阅读全文

life02 2012-04-08 22:29 发表评论
]]>
Android开发之道(10QHandler本质析与使用实例 Q{载)http://www.shnenglu.com/life02/archive/2012/03/20/168391.htmllife02life02Tue, 20 Mar 2012 06:04:00 GMThttp://www.shnenglu.com/life02/archive/2012/03/20/168391.htmlhttp://www.shnenglu.com/life02/comments/168391.htmlhttp://www.shnenglu.com/life02/archive/2012/03/20/168391.html#Feedback0http://www.shnenglu.com/life02/comments/commentRss/168391.htmlhttp://www.shnenglu.com/life02/services/trackbacks/168391.html阅读全文

life02 2012-03-20 14:04 发表评论
]]>
Android Service 服务Q三Q—?bindService与remoteService Q{载)http://www.shnenglu.com/life02/archive/2012/03/20/168390.htmllife02life02Tue, 20 Mar 2012 06:02:00 GMThttp://www.shnenglu.com/life02/archive/2012/03/20/168390.htmlhttp://www.shnenglu.com/life02/comments/168390.htmlhttp://www.shnenglu.com/life02/archive/2012/03/20/168390.html#Feedback0http://www.shnenglu.com/life02/comments/commentRss/168390.htmlhttp://www.shnenglu.com/life02/services/trackbacks/168390.html阅读全文

life02 2012-03-20 14:02 发表评论
]]>
android ?涉及到context的时候this和this.getApplictionContext的区?(转蝲)http://www.shnenglu.com/life02/archive/2012/03/20/168389.htmllife02life02Tue, 20 Mar 2012 05:56:00 GMThttp://www.shnenglu.com/life02/archive/2012/03/20/168389.htmlhttp://www.shnenglu.com/life02/comments/168389.htmlhttp://www.shnenglu.com/life02/archive/2012/03/20/168389.html#Feedback0http://www.shnenglu.com/life02/comments/commentRss/168389.htmlhttp://www.shnenglu.com/life02/services/trackbacks/168389.html阅读全文

life02 2012-03-20 13:56 发表评论
]]>
Android Service学习之AIDL, Parcelable和远E服?(转蝲)http://www.shnenglu.com/life02/archive/2012/03/06/167234.htmllife02life02Tue, 06 Mar 2012 03:49:00 GMThttp://www.shnenglu.com/life02/archive/2012/03/06/167234.htmlhttp://www.shnenglu.com/life02/comments/167234.htmlhttp://www.shnenglu.com/life02/archive/2012/03/06/167234.html#Feedback0http://www.shnenglu.com/life02/comments/commentRss/167234.htmlhttp://www.shnenglu.com/life02/services/trackbacks/167234.html阅读全文

life02 2012-03-06 11:49 发表评论
]]>
Activity的蟩转与传?Q{载)http://www.shnenglu.com/life02/archive/2012/02/05/165013.htmllife02life02Sun, 05 Feb 2012 14:09:00 GMThttp://www.shnenglu.com/life02/archive/2012/02/05/165013.htmlhttp://www.shnenglu.com/life02/comments/165013.htmlhttp://www.shnenglu.com/life02/archive/2012/02/05/165013.html#Feedback0http://www.shnenglu.com/life02/comments/commentRss/165013.htmlhttp://www.shnenglu.com/life02/services/trackbacks/165013.html阅读全文

life02 2012-02-05 22:09 发表评论
]]>
android学习视频|站http://www.shnenglu.com/life02/archive/2011/12/15/162192.htmllife02life02Thu, 15 Dec 2011 15:50:00 GMThttp://www.shnenglu.com/life02/archive/2011/12/15/162192.htmlhttp://www.shnenglu.com/life02/comments/162192.htmlhttp://www.shnenglu.com/life02/archive/2011/12/15/162192.html#Feedback0http://www.shnenglu.com/life02/comments/commentRss/162192.htmlhttp://www.shnenglu.com/life02/services/trackbacks/162192.htmlhttp://www.mars-droid.com/
http://www.verycd.com/topics/2900036/

http://hi-android.info/src/com/android/phone/ 

 http:
//gitorious.org/0xdroid/packages_apps_phone/trees/5f6f01ecda4336dfb47108e67ff909a65f14b820/src/com/android/phone



life02 2011-12-15 23:50 发表评论
]]>
Android学习W记QA-10Q_记录与出错(LogCat的用)Q{载)http://www.shnenglu.com/life02/archive/2011/12/15/162187.htmllife02life02Thu, 15 Dec 2011 14:28:00 GMThttp://www.shnenglu.com/life02/archive/2011/12/15/162187.htmlhttp://www.shnenglu.com/life02/comments/162187.htmlhttp://www.shnenglu.com/life02/archive/2011/12/15/162187.html#Feedback0http://www.shnenglu.com/life02/comments/commentRss/162187.htmlhttp://www.shnenglu.com/life02/services/trackbacks/162187.html阅读全文

life02 2011-12-15 22:28 发表评论
]]>
Thread、Looper、Handler和Message 解开qh (?http://www.shnenglu.com/life02/archive/2011/12/13/161993.htmllife02life02Mon, 12 Dec 2011 16:33:00 GMThttp://www.shnenglu.com/life02/archive/2011/12/13/161993.htmlhttp://www.shnenglu.com/life02/comments/161993.htmlhttp://www.shnenglu.com/life02/archive/2011/12/13/161993.html#Feedback0http://www.shnenglu.com/life02/comments/commentRss/161993.htmlhttp://www.shnenglu.com/life02/services/trackbacks/161993.html阅读全文

life02 2011-12-13 00:33 发表评论
]]>
Android 核心分析 之七------Service深入分析Q{Q?/title><link>http://www.shnenglu.com/life02/archive/2011/12/08/161747.html</link><dc:creator>life02</dc:creator><author>life02</author><pubDate>Thu, 08 Dec 2011 03:38:00 GMT</pubDate><guid>http://www.shnenglu.com/life02/archive/2011/12/08/161747.html</guid><wfw:comment>http://www.shnenglu.com/life02/comments/161747.html</wfw:comment><comments>http://www.shnenglu.com/life02/archive/2011/12/08/161747.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/life02/comments/commentRss/161747.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/life02/services/trackbacks/161747.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="100%" align="center" border="0"> <tbody> <tr> <td bgcolor="#ffffff"> <div id="f97v7f9" class="arttitle" align="center">Android核心分析<br /></div></td></tr> <tr> <td bgcolor="#ffffff" height="17"> </td></tr> <tr> <td bgcolor="#ffffff"> <div id="ltbd19b" class="artformtitle" align="center"> <p>发布?011-09-28</p><a >http://www.uml.org.cn/mobiledev/201109284.asp#7</a></div></td></tr> <tr> <td bgcolor="#ffffff" height="16"> </td></tr> <tr> <td valign="top" bgcolor="#ffffff"> <table class="artcontent" cellspacing="1" cellpadding="3" width="95%" align="center" border="0"> <tbody> <tr> <td valign="top" bgcolor="#ffffff"> <p class="artdir1"><a name="7">Android 核心分析 之七------Service深入分析</a></p> <p class="artcon">上一章我们分析了Android IPC架构,知道了Android服务构徏的一些基本理念和原理Q本章我们将深入分析Android的服务。Android体系架构中三U意义上服务Q?/p> <p class="artcon">Native服务</p> <p class="artcon">Android服务</p> <p class="artcon">InitI间的服务,主要是属性设|,q个QPQ是利用QIcket来完成的Q这个我在另外一章来讨论?/p> <p class="artcon">Navite服务Q实际上是指完全在C++I间完成的服务,主要是指pȝ一开始初始化Q通过Init.rc脚本h的服务,例如Service Manger service,Zygote service,Media service , ril_demon service{?/p> <p class="artcon">Android服务是指在JVMI间完成的服务,虽然也要使用Navite上的框架Q但是服务主体存在于AndroidI间。Android是二阶段初始QInit2Q初始化时徏立的服务?/p> <p class="artcon"><strong>1 Service本质l构</strong></p> <p class="artcon">我们q是从Service的根本意义分析入手,服务的本质就是响应客Lh。要提供服务Q就必须建立接收hQ处理请求,应答客服端的框架。我惛_Android Service设计者也会无时不Lq个服务本质框图挂在脑v中。从E序的角度,服务一定要存在一个闭合@环框架和h处理框架</p> <p class="artcon"><img height="232" src="http://www.uml.org.cn/mobiledev/images/2011092819.gif" width="530" alt="" /></p> <p class="artcon">分析清楚服务框就必须弄清楚以下的机制及其构成?/p> <p class="artcon">Q?Q闭合@环结构放|在哪里Q?/p> <p class="artcon">Q?Q处理请求是如何分发和管理?</p> <p class="artcon">Q?Q处理框架是如何建立的?</p> <p class="artcon">Q?Q概忉|架是如何建立的?</p> <p class="artcon"><strong>2 Service基本框架分析</strong></p> <p class="artcon">Android设计中,Native Service和Android Service采用了同一个闭合@环框架。这个闭合@环框架放|在Native的C++I间中,,ProcessState@ProcessState.cpp 和IPCThreadState@IPCThreadState.cpp两个cd成了全部工作?/p> <p class="artcon"><img height="258" src="http://www.uml.org.cn/mobiledev/images/2011092820.gif" width="279" alt="" /></p> <p class="artcon">在服务框架中QProcessState是公用的部分Q这个公用部分最主要的框架就是闭合@环框架和接收CBinder来的h后的处理框架。我们将服务框架用ProcessSate来表C?a之:</p> <p class="artcon">Q?Q?addservice</p> <p class="artcon">Q?Q?建立闭合循环处理框架?/p> <p class="artcon">int main(int argc, char** argv)</p> <p class="artcon">{</p> <p class="artcon">sp<ProcessState> proc(ProcessState::self());</p> <p class="artcon">addService(String16("xxx0"), new xxx0Service());</p> <p class="artcon">addService(String16("xxx1"), new xxx1Service());</p> <p class="artcon">…</p> <p class="artcon">ProcessState::self()->startThreadPool();</p> <p class="artcon">IPCThreadState::self()->joinThreadPool();//闭合循环框架</p> <p class="artcon">}</p> <p class="artcon"><img height="768" src="http://www.uml.org.cn/mobiledev/images/2011092821.gif" width="614" alt="" /></p> <p class="artcon">2.1 Native Service </p> <p class="artcon">Native Service是在pȝInit阶段通过Init.rc脚本建立的服务?/p> <p class="artcon">首先来看看一个例子mediaserver@main_mediaserver.cpp的徏立过E?/p> <p class="artcon">int main(int argc, char** argv)</p> <p class="artcon">{</p> <p class="artcon">sp<ProcessState> proc(ProcessState::self());</p> <p class="artcon">sp<IServiceManager> sm = defaultServiceManager();</p> <p class="artcon">LOGI("ServiceManager: %p", sm.get());</p> <p class="artcon">AudioFlinger::instantiate();</p> <p class="artcon">MediaPlayerService::instantiate();</p> <p class="artcon">CameraService::instantiate();</p> <p class="artcon">AudioPolicyService::instantiate();</p> <p class="artcon">ProcessState::self()->startThreadPool();</p> <p class="artcon">IPCThreadState::self()->joinThreadPool();</p> <p class="artcon">}</p> <p class="artcon">我们代码向下展开了一层,更能看到事物的本质?/p> <p class="artcon">int main(int argc, char** argv)</p> <p class="artcon">{</p> <p class="artcon">sp<ProcessState> proc(ProcessState::self());</p> <p class="artcon">sp<IServiceManager> sm = defaultServiceManager();</p> <p class="artcon">defaultServiceManager()->addService(String16("media.audio_flinger"), new AudioFlinger());</p> <p class="artcon">…</p> <p class="artcon">ProcessState::self()->startThreadPool();</p> <p class="artcon">IPCThreadState::self()->joinThreadPool();</p> <p class="artcon">}</p> <p class="artcon">Q?Q服务进E徏立了ProcessState对象Qƈ给对象登记在进E的上下文中?/p> <p class="artcon">Q?Q徏立一个新AudioFlinger对象Qƈ对象登记Service Manager Service中?/p> <p class="artcon">Q?Q开始就收请求,处理hQ应{这个@环闭合框架?/p> <p class="artcon">2.2 Android Service</p> <p class="artcon">Androids service是系l二阶段QInit2Q初始化时徏立的服务?/p> <p class="artcon">Android的所有服务@环框枉是徏立SystemServer@(SystemServer.javaQ上。在SystemServer.java中看不到循环l构Q只是可以看到徏立了init2的实现函敎ͼ建立了一大堆服务QƈAddService到service Manager?/p> <p class="artcon">main() @ com/android/server/SystemServer </p> <p class="artcon">{</p> <p class="artcon">init1();</p> <p class="artcon">}</p> <p class="artcon">Init1()是在NativeI间实现的(com_andoird_server_systemServer.cppQ。我们一看这个函数就知道了,原来q个闭合循环处理框架在这里:</p> <p class="artcon">init1->system_init() @System_init.cpp</p> <p class="artcon">在system_init()我们看到了这个久q的循环闭合理框架?/p> <p class="artcon">{</p> <p class="artcon">Call "com/android/server/SystemServer", "init2"</p> <p class="artcon">….. </p> <p class="artcon">ProcessState::self()->startThreadPool();</p> <p class="artcon">IPCThreadState::self()->joinThreadPool();</p> <p class="artcon">}</p> <p class="artcon">Init2()@SystemServer.java中徏立了Android中所有要用到的服务:</p> <p class="artcon">Entropy Service</p> <p class="artcon">Power Manager</p> <p class="artcon">Activity Manager</p> <p class="artcon">Telephony Registry</p> <p class="artcon">Package Manager</p> <p class="artcon">Account Manager</p> <p class="artcon">Content Manager</p> <p class="artcon">System Content Providers</p> <p class="artcon">Battery Service</p> <p class="artcon">Hardware Service</p> <p class="artcon">Alarm Manager</p> <p class="artcon">Init Watchdog</p> <p class="artcon">Sensor Service</p> <p class="artcon">Window Manager</p> <p class="artcon">Bluetooth Service</p> <p class="artcon">statusbar</p> <p class="artcon">Clipboard Service</p> <p class="artcon">Input Method Service</p> <p class="artcon">NetStat Service</p> <p class="artcon">Connectivity Service</p> <p class="artcon">Accessibility Manager</p> <p class="artcon">Notification Manager</p> <p class="artcon">Mount Service</p> <p class="artcon">Device Storage Monitor</p> <p class="artcon">Location Manager</p> <p class="artcon">Search Service</p> <p class="artcon">Checkin Service</p> <p class="artcon">Wallpaper Service</p> <p class="artcon">Audio Service</p> <p class="artcon">Headset Observer</p> <p class="artcon">Backup Service</p> <p class="artcon">AppWidget Service</p> <p class="artcon"><strong>3 ProcessState和IPCThreadState</strong></p> <p class="artcon">从宏观来ԌPocessState及其IPCThreadState处于IPC与内核打交道包装层。前面的章节已经提到Q下面我更详细的分析。有关IPC的c++I间的实现都是从ProcessStateq个对象完成的?/p> <p class="artcon"><img height="294" src="http://www.uml.org.cn/mobiledev/images/2011092822.gif" width="555" alt="" /></p> <p class="artcon">我们可以得出如下的结论:不管JVM的Binder做了多么复杂的操作,最l还是需要利用ProcessState q个c++I间的对象把数据传递给Binder DriverQ接收数据也是通过ProcessStateq个对象完成QProcessState是所有Binder IPC必经的通道?/p> <p class="artcon"><img height="294" src="http://www.uml.org.cn/mobiledev/images/2011092823.gif" width="471" alt="" /></p> <p class="artcon">ProcessState攄在全局变量gProcess中,每个q程只有一个ProcessState对象Q负责打开Binder讑֤驱动Q徏立线E池{。而IPCThreadState每个U程有一个,IPCThreadState实例登记在LinuxU程E的上下文附属数据中Q主要负责Binder数据dQ写入和h处理框架。IPCThreadSate在构造的时候,获取q程的ProcessSateq记录在自己的成员变量mProcess?通过mProcess可以获取到Binder的句柄?/p> <p class="artcon">3.1 ProcessState的生命周?/p> <p class="artcon">既然ProcessState是Binder通讯的基Q那么Process必须在Binder通讯之前建立。客LQ服务端都必d立。由于现在重点讨论服务端Q所以重心放|在服务端。在Android体系中有c++I间的服务,JVMI间的服务,q两cL务在本质上相同的Q只是Ş式上不同Q由于他们都是徏立在QͽocessStateq个基础上,所以在形式上不同就仅仅表现在对OnTransact的回调处理的不同?/p> <p class="artcon">Native Service </p> <p class="artcon">我们直接可以看到使用sp<ProcessState> proc(ProcessState::self())Q徏立徏立ProcessStateQ一旦调用ProcessState徏立了Qƈ且这个selfProcessSate登记在全局变量中?/p> <p class="artcon">Android Service</p> <p class="artcon">建立Android Service服务system_init @System_init.cpp中我们可以看到相同的l构。有一点不同的是所有的Android Service都运行在一个进E中Qsystemseverq程?/p> <p class="artcon">3.2 Binder Driver包装 @IPCThreadState</p> <p class="artcon">ProcessSate构造的时候,使用open_binder打开/driver/binderQƈ句柄记录在mDriverFDQ在ProcessState中ƈ不用这个句柄,真正使用q个Binder讑֤句柄的是IPCThreadStateQ所有关于Binder的操作放|在IPCThreadState中:</p> <p class="artcon">(1)d/写入QtalkWithDriverQ)@IPCThreadState对ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr)q行包装?/p> <p class="artcon">(2)h处理QexecuteCommand(...)@ IPCThreadState</p> <p class="artcon">(3)循环l构QjoinThreadPool()</p> <p class="artcon">joinThreadPool()</p> <p class="artcon">{</p> <p class="artcon">While(1){</p> <p class="artcon">talkWithDriver(...)</p> <p class="artcon">...</p> <p class="artcon">executeCommand(...)</p> <p class="artcon">}</p> <p class="artcon">}</p></td></tr></tbody></table><br /></td></tr></tbody></table><img src ="http://www.shnenglu.com/life02/aggbug/161747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/life02/" target="_blank">life02</a> 2011-12-08 11:38 <a href="http://www.shnenglu.com/life02/archive/2011/12/08/161747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android核心分析Q{Q?/title><link>http://www.shnenglu.com/life02/archive/2011/12/08/161746.html</link><dc:creator>life02</dc:creator><author>life02</author><pubDate>Thu, 08 Dec 2011 03:37:00 GMT</pubDate><guid>http://www.shnenglu.com/life02/archive/2011/12/08/161746.html</guid><wfw:comment>http://www.shnenglu.com/life02/comments/161746.html</wfw:comment><comments>http://www.shnenglu.com/life02/archive/2011/12/08/161746.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/life02/comments/commentRss/161746.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/life02/services/trackbacks/161746.html</trackback:ping><description><![CDATA[     摘要:   <a href='http://www.shnenglu.com/life02/archive/2011/12/08/161746.html'>阅读全文</a><img src ="http://www.shnenglu.com/life02/aggbug/161746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/life02/" target="_blank">life02</a> 2011-12-08 11:37 <a href="http://www.shnenglu.com/life02/archive/2011/12/08/161746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android应用开发之intent的妙用二Q{Q?/title><link>http://www.shnenglu.com/life02/archive/2011/12/07/161707.html</link><dc:creator>life02</dc:creator><author>life02</author><pubDate>Wed, 07 Dec 2011 15:27:00 GMT</pubDate><guid>http://www.shnenglu.com/life02/archive/2011/12/07/161707.html</guid><wfw:comment>http://www.shnenglu.com/life02/comments/161707.html</wfw:comment><comments>http://www.shnenglu.com/life02/archive/2011/12/07/161707.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/life02/comments/commentRss/161707.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/life02/services/trackbacks/161707.html</trackback:ping><description><![CDATA[     摘要:   <a href='http://www.shnenglu.com/life02/archive/2011/12/07/161707.html'>阅读全文</a><img src ="http://www.shnenglu.com/life02/aggbug/161707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/life02/" target="_blank">life02</a> 2011-12-07 23:27 <a href="http://www.shnenglu.com/life02/archive/2011/12/07/161707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android应用开发之intent的妙用一(?http://www.shnenglu.com/life02/archive/2011/12/07/161706.htmllife02life02Wed, 07 Dec 2011 15:26:00 GMThttp://www.shnenglu.com/life02/archive/2011/12/07/161706.htmlhttp://www.shnenglu.com/life02/comments/161706.htmlhttp://www.shnenglu.com/life02/archive/2011/12/07/161706.html#Feedback0http://www.shnenglu.com/life02/comments/commentRss/161706.htmlhttp://www.shnenglu.com/life02/services/trackbacks/161706.html
http://blog.csdn.net/louiswangbing/article/details/6607612

Intent妙用之编写自qandroidȝ?/strong>

众所周知Qandroid的主界面名ؓ laucher2Q功能强大,会在android启动之后q行Q也是所有其他应用程序的入口E序。那么,如何让自q应用E序取代laucher2的位 |,成ؓandroidpȝ的主界面呢?其实说出来很单,接下来,我就来ؓ大家揭开q其中的秘面纱?/p>

首先Q我们来看看一个普通的应用E序的intent声明Q?/p>

  1. <intent-filter>  
  2.              <action android:name="android.intent.action.MAIN" />  
  3.              <category android:name="android.intent.category.LAUNCHER" />  
  4.          </intent-filter>  
是不是看着很眼熟呢Q没错了Q这D代码是在AndroidManifest.xml中相应activity的intent声明Q相信大家目前羃写的应用E序的intent声明无一例外都是q样的吧。可能很多h都会对着两行代码有下面的理解Q?p>W二?span style="line-height: 18px; "><action android:name="android.intent.action.MAIN" />表示q个activity是当前应用程序的主activityQ而第二行表示当前activity在lancher中加载?/span>

q么理解的却是没错,但事实上Q有更加单的理解方式。这里请容许我先卖个兛_。我们l往下看?/span>

既然是想让我们自q应用E序取代laucher的位|,那么我们来看一下lancher的intent声明是怎么L吧:

  1. <intent-filter>  
  2.         <action android:name="android.intent.action.MAIN" />  
  3.         <category android:name="android.intent.category.HOME"/>  
  4.         <category android:name="android.intent.category.DEFAULT" />  
  5.         <category android:name="android.intent.category.MONKEY" />  
  6.     </intent-filter> 
?Ӟ惌看到q段代码Q你必须要有laucher的源代码。(关于android源代码的问题Q前面的文章已经提到q很多次了,有源代码真的是g很好的事 情,不管是对应用E序开发者来说还是对底层开发者来说亦或是对android爱好者来_都会受益匪浅的,所以这里再ơ徏议大家不要仅仅局限于 android sdk和avd的用来q行应用E序的开发,不管你有没有旉Q下份源代码L没有坏处的。)

大家看出q两个intent声明之间的差别了吗?没错Q当出现  <category android:name="android.intent.category.HOME"/>  的时候,我们的应用程序就会变成跟lancherh相同功能的(当然Q我指的仅仅是主界面Qlaucher的功能是在是太强大了Q,成ؓ androidpȝ的主界面Qƈ且,当我们按下Home键的时候,会出C个选择界面Q是不是发现你的应用E序和laucher同时出现在了选择框中呢? 如果是,那么恭喜你,从功能上来说Q你已经实现了。如果没有看刎ͼ请email我louiswangbing@gmail.com?/span>

但是Q所谓一׃容二虎,同时有两个主界面存在当然不是我们惌的?/span>

?果你有android源代码的话,你甚臛_以把laucher删掉Q直接将你自q应用E序~译到androidpȝ中,q样Q系l启动的时候就会直接运 行你的应用程序,而你的应用程序就会堂而皇之地鸠占鹊l(f)Q顺理成章的成ؓpȝ的主界面Qƈ且当你按下Home键的时候,׃跛_你的应用E序的主 activity了!Q?/span>

如果你只是一个功能上的追求者,那么看到q里你就可以xq个面去试试上面的功能了?/span>

如果你是一个好奇心比较强的人,那么误着我l往下看?/span>

刚才我说q,intent声明的理解问题。事实上Q你可以有更好的理解方式Q当Ӟq要建立在你对androidpȝ的启动进E有一定的了解的基上?/span>

单来_intent其实是一个条件过滤器Qactivity的intent声明的每一条都可以作ؓ一个过滤条Ӟ条目多Q过滤条件也p强,定位?来也pҎ(gu)。相信这个原理学q数据库的朋友理解v来更加容易。你可以整个androidpȝ中所有的activity都集中v来当成是一个数据库Q?intent本n是一条select语句Q其中每一声明都是一过滤条Ӟ而过滤之后剩下的Q就是将要被调用的activity。当qo条g_强大 或者过滤条件比较特D的时候,最后剩下的只有一个activityQ那么系l会毫不犹U地启动它Q当qo条g不Dqo之后q剩下比较多?activity的时候,pȝ会将满q些条g的所有的activity用一个listview列出来让你选择?/span>

怿原理大家都已l很清楚了,那么上面所q的q个功能很好理解了。没错,android在启动的时候会有一个PackageManager选择pȝ中满滤条Ӟ

  1. <action android:name="android.intent.action.MAIN" />  
  2.         <category android:name="android.intent.category.HOME"/>  
  3.         <category android:name="android.intent.category.DEFAULT" />  
  4.         <category android:name="android.intent.category.MONKEY" />  
?activity作ؓpȝ启动的第一个activityQ也是ȝ面,M一个满个过滤条件的activity都将q入候选名单,如果候选名单中?有一人,那么很荣q,不战而胜Q你是pȝ的主界面了;如果候选名单中有多个hQ比如刚才说的有laucher和你自己的应用程序)Q那么就q入D酷?#8221; 民意选D“Q也是用户自己的选择Q你选谁pȝ׃启动谁。但和民意选D不同的是Q选D出来的结果通常会有一定的LQ而这个主界面的选DL非常的短Q?每当你按下一ơHome键或者重启一下系l,pȝ׃重新安排一?#8221;民意选D“。如果想要永q的成ؓȝ面,那么唯一的办法就?-没错Q虽然很D酷Q但 不得不说--是Q干掉它......或者和谐一点,你可以让它活着Q但是也必须它贬ؓ庶民或者是其发配边疆Q具体的实施手段是--Ҏ(gu)它的 intent声明Q其不满ȝ面的q个qo条g?p>?整个intent妙用章节中,q一章算是比较特D的Q因然所有的章节q用的原理基本相通,也就是我上面说到的原理,但是后箋章节的intentqo?仉是可以由用户自己定义、手动修改的Q而唯独只有这个是不能改的Q你只能军_去适应或者不适应q个qo条gQ而不能去改变q个qo条gQ就像你只能去?应这个社会,却很难改变它--或许不是不能Q而是暂时q能扑ֈ途径......

有时候真的,生活跟计机Q居然有如此之多的相g?.....




life02 2011-12-07 23:26 发表评论
]]>
Android开发组件——IntentQ{Q?/title><link>http://www.shnenglu.com/life02/archive/2011/12/07/161705.html</link><dc:creator>life02</dc:creator><author>life02</author><pubDate>Wed, 07 Dec 2011 15:25:00 GMT</pubDate><guid>http://www.shnenglu.com/life02/archive/2011/12/07/161705.html</guid><wfw:comment>http://www.shnenglu.com/life02/comments/161705.html</wfw:comment><comments>http://www.shnenglu.com/life02/archive/2011/12/07/161705.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/life02/comments/commentRss/161705.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/life02/services/trackbacks/161705.html</trackback:ping><description><![CDATA[<div><div class="zlbv9v7" id="article_content"><p align="center"><strong><br /></strong></p>http://blog.csdn.net/louiswangbing/article/details/6610936<p align="center"><strong>Android开发组?#8212;—Intent</strong></p><p align="left">Intent提供了一U通用的消息系l,允许你的应用E序与其它的应用E序间传逺ntent来执行动作和产生事g。通过使用Intent可以ȀzAndroid应用的三个核心组Ӟzd、服务和q播接收器?/p><p align="left">Intent 的意思是意图Q也是说App通过Intent向android表达自己的意囑֍惛_什么,惛_动另一个Activity或者去调用其它的App{?{;Intentfilter反应了AppҎ(gu)囄响应能力Q比如书上的例子拨号E序Q在自己的App中声明一个Intentfilter对这个动作意?q行相应Q这样当我们按下拨号键时Qandroid׃在所用的Intentfilter中找到合适的App来满?/p><p align="left">¥  <strong>Intent的分c?/strong></p><p align="left">Ø  <strong>昄意图</strong>Q?/p><p align="left">调用Intent.setComponent()或Intent.setClass()Ҏ(gu)明确指定了组件名的Intent为显C意图,明确指定了Intent应该传递到哪个lg?/p><p align="left">Ø  <strong>隐式意图</strong></p><p align="left">没有明确指定lg名的Intent为隐式意图。Androidpȝ会根据隐式意图中讄的动作、类别、数据找到最适合的组件来处理q个意图</p><p align="left">¥  <strong>IntentI竟是什?/strong></p><p align="left">?们可以将Intent看成是Activity通信的标准的。比如Intent中的内容告诉了系l激发Intent的Activity需要什么服务,而服?者Activity应该满的条件。然后就是Androidpȝ的事了,它负责找出符合条件的Activity服务者,q将Intentl?Activity服务者,然后q个ActivityҎ(gu)Intent中剩余的信息做出相应的操作。由上面可知QIntent包含两部分信息:</p><p align="left">Ø  Activity服务者的信息Q这个是lAndroid用来扑ֈ合适Activity的?/p><p align="left">Ø  Activity服务者要做什么操作的信息Q这个是lActivity服务者用的?/p><p align="left">¥  <strong>Intent</strong></p><p align="left">Android 中提供了Intent机制来协助应用间的交互与通讯QIntent负责对应用中一ơ操作的动作、动作涉及数据、附加数据进行描qͼAndroid则根据此 Intent的描qͼ负责扑ֈ对应的组ӞIntent传递给调用的组Ӟq完成组件的调用。Intent不仅可用于应用程序之_也可用于应用E序?部的Activity/Service之间的交互。因此,Intent在这里v着一个媒体中介的作用Q专门提供组件互相调用的相关信息Q实现调用者与被调 用者之间的解耦?/p><p align="left">¥  <strong>Intent的属?/strong></p><p align="left">Ø  <strong>Action</strong></p><p align="left">表示要执行的动作Q当然也可以自定义动作,q可定义相应的Activity</p><p align="left">来处理我们的自定义动作?/p><p align="left">Ø  <strong>Data</strong></p><p align="left">也就是执行动作要操作的数据。Android中采用指向数据的一个URI</p><p align="left">来表C。如在联pMh应用中,一个指向某联系人的URI可能?content://contacts/1。对于不同的动作Q其URI数据的类型是不同的(可以讄type属性指定特定类型数据)Q如ACTION_EDIT指定Data为文件URIQ打?sh)话?a href="tel:URI">tel:URI</a>Q访问网lؓhttp:URIQ而由content provider提供的数据则为content:URIs?/p><p align="left"> 如果动作字段是ACTION_EDITQ数据字D包含将昄用于~辑的文</p><p align="left">档的URIQ如果动作时ACTION_CALL。数据字D将是一?a href="tel:URI%E5%92%8C%E5%B0%86%E6%8B%A8">tel:URI和将?/a>  打的LQ如果动作是ACTION_VIEWQ数据字D|一个http:URIQ接收活动将被调用去下蝲和显CURI指向的数据?/p><p align="left">Ø  <strong>Type</strong></p><p align="left">数据cdQ显C指定Intent的数据类型(MIMEQ。一般Intent的数?/p><p align="left">cd能够Ҏ(gu)数据本nq行判断Q但是通过讄q个属性,可以强制采用昑ּ指定的类型而不再进行推对{?/p><p align="left">Ø  <strong>Category</strong></p><p align="left">被执行动作的附加信息。例如LAUNCHER_CATEGORY表示intent的接</p><p align="left">?者应该在Launcher中作为顶U应用出玎ͼ而ALTERNATIVE_CATEGORY表示当前的Intent是一pd的可选动作中的一个,q些动作 可以在同一数据上执行。Alternative表明Q这个Activity可以变成OptionMenuQ供其他Activity直接调用?/p><p align="left">Ø  <strong>Component</strong></p><p align="left">指定Intent的目标组件的cdU。通常Android会根据Intent中包?/p><p align="left">?其它属性的信息Q比如action、data/type、categoryq行查找Q最l找C个与之匹配的目标lg。但是,如果componentq个 属性有指定的话Q将直接使用它指定的lgQ而不再执行上q查找过E。指定了q个属性以后,Intent的其它所有属性都是可选的?/p><p align="left">Ø  <strong>Extra</strong></p><p align="left">是其它所有附加信息的集合。用extras可以为组件提供扩展信息,</p><p align="left">比如Q如果要执行“发送电(sh)子邮?#8221;q个动作Q可以将?sh)子邮g的标题、正文等保存在extras里,传给?sh)子邮g发送组件?/p><p align="left">Android需要解析的是那些隐式IntentQ通过解析Q将Intent映射l可?/p><p align="left">处理此Intent的Activity、IntentReceiver或Service。Intent解析机制主要是?/p><p align="left">q查扑ַ注册在AndroidManifest.xml中的所有IntentFilter及其中定义的IntentQ?/p><p align="left">最l找到匹配的Intent。在q个解析q程中,Android是通过Intent的action?/p><p align="left">type、categoryq三个属性来q行判断Q判断方法如下:</p><p align="left">@  如果Intent指定了actionQ则目标lg的IntentFilter的action列表中就必须包含有这个actionQ否则就不能匚w?/p><p align="left">@  如果Intent没有提供typeQ系l将从data中得到数据类型。和action一P目标lg的数据类型列表中必须包含Intent的数据类型,否则不能匚w?/p><p align="left">@  如果Intent中的数据不是contentQ类型的URIQ而且Intent也没有明指定它的typeQ将Ҏ(gu)Intent中数据的schemeQ比 如http:或者mailto:Q进行匹配。同上,Intent的scheme必须出现在目标组件的scheme列表中?/p><p align="left">@  如果Intent指定了一个或多个categoryQ这些类别必d部出现在lg的类别列表中。比如Intent中包含了两个cd:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORYQ解析得到的目标lg必须臛_包含q两个类别?/p><p align="left">当匹配一个intentC个能够处理数据的lgQ通常知道数据的类型(?/p><p align="left">的MIME cdQ和它的URI很重要。例如,一个组件能够显C图像数据,不应该被调用L放一个音频文件?/p><p align="left"> 在许多情况下Q数据类型能够从URI中推,特别是content:URIs,它表</p><p align="left">C?位于讑֤上的数据且被内容提供?content provider)控制。但是类型也能够昄地设|,setData()Ҏ(gu)指定数据的URIQsetType()指定MIMEc?型,setDataAndType()指定数据的URI和MIMEcd。通过getData()dURIQgetType()dcd?/p><p align="left">¥  <strong>Intentqo?/strong></p><p align="left">zd、服务、广播接收者ؓ了告知系l能够处理哪些隐式IntentQ它?/p><p align="left">?以有一个或多个intentqo器。每个过滤器描述lg的一U能力,即乐意接收的一lIntent。实际上Q它{掉不想要的IntentsQ也仅仅是不?要的隐式Intents。一个显CIntentL能够传递到它的目标lgQ不它包含什么;不考虑qo器。但是一个隐式IntentQ仅当它能够通过l?件的qo器之一才能够传递给它?/p><p align="left">一个组件能够做的每一工作有独立的qo器,例如Q记事本中的NoteEditerzd有两个过滤器Q一个是启动一个指定的记录Q用户可以查看和~辑Q另一个是启动一个新的、空的记录,用户能够填充q保存?/p><p align="left">一 个intentqo器是一个IntentFiltercȝ实例。因为Androidpȝ在启动一个组件之前必ȝ道它的能力,但是intentqo器通常 不在java代码中设|,而是在应用程序的清单文g(AndroidManifest.xml)中设|。但是有一个例外,q播接收者的qo器通过调用 Context.registerReceiver()动态地注册Q它直接创徏一个IntentFilter对象?/p><p align="left">一 个过滤器有对应于Intent对象的动作、数据、种cȝ字段。过滤器要检隐式Intent的所有这三个字段Q其中Q何一个失败,Androidpȝ都不 会传逺ntentl组件。然而,因ؓ一个组件可以有多个Intentqo器,一个Intent通不q组件的qo器检,其它的过滤器可能通过?/p><p align="left">一个过滤器必须臛_包含一?lt;action>子元素,否则它将d所有的Intents?/p><p align="left">要通过,Intent对象中指定的动作必须匚wqo器的动作列表中的一个。如果对象或qo器没有指定一个动作,l果如下:</p><p align="left">ž   如果qo器没有指定动作,没有一个Intent匹配,所有的Intent检失败,x有intent能够通过qo器?/p><p align="left">ž   如果Intent对象没有指定动作Q将自动通过查(只要qo器至有一个过滤器Q否则就是上面的情况了)</p><p align="left">对于一个Intent要通过U类,Intent对象中的每个U类必须匚wq?/p><p align="left">滤器中的一个。即qo器能够列出额外的U类Q但是Intent对象中的U类都必能够在qo器中扑ֈQ只有一个种cdqo器列表中没有Q就种cL失?</p><p align="left">        因此原则上如果一个Intent对象中没有种c(即种cdDؓI)应该?/p><p align="left">?通过U类试Q而不过滤器中有什么种cR但是有个例外,Android对待所有传递给Context.startActivity()的隐?Intent好像它们臛_包含”android.intent.category.DEFAULT”(对应CATEGORY_DEFAULT帔R)。因 此,zd惌接收隐式Intent必须要在Intentqo器中包含”android.intent.category.DEFAULT”?/p><p align="left">      Intents对照着Intentqo器匹配,不仅dC个目标组件去Ȁz,而且</p><p align="left">?发现讑֤上的lg的其他信息。例如,Androidpȝ填充应用E序启动列表Q最高层屏幕昄用户能够启动的应用程序:是通过查找所有的包含指定 ?#8221;android.intent.action.MAIN”的动作和”android.intent.category.LAUNCHER” U?nbsp;        cȝqo器的zdQ然后在zd列表中显C些活动的图标和标{。类似的Q?nbsp;  它通过查找”android.intent.category.HOME”qo器的zd发掘主菜单?/p><p align="left">¥  <strong>IntentCZ</strong></p><p align="left">要实C个Activity的蟩转,我们可以要跌{的Activitycdl定?/p><p align="left">Intent对象中,然后通过startActivityҎ(gu)ȀzIntent对象中所指定的ActivityQ关键代码如下:</p> </div></div><br /> <div><embed id="lingoes_plugin_object" type="application/lingoes-npruntime-capture-word-plugin" height="0" hidden="true" width="0"></div><img src ="http://www.shnenglu.com/life02/aggbug/161705.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/life02/" target="_blank">life02</a> 2011-12-07 23:25 <a href="http://www.shnenglu.com/life02/archive/2011/12/07/161705.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>context(?http://www.shnenglu.com/life02/archive/2011/12/05/161514.htmllife02life02Mon, 05 Dec 2011 09:13:00 GMThttp://www.shnenglu.com/life02/archive/2011/12/05/161514.htmlhttp://www.shnenglu.com/life02/comments/161514.htmlhttp://www.shnenglu.com/life02/archive/2011/12/05/161514.html#Feedback0http://www.shnenglu.com/life02/comments/commentRss/161514.htmlhttp://www.shnenglu.com/life02/services/trackbacks/161514.html
   Context字面意思上下文Q位于framework package的android.content.Context中,其实该类为LONG型,cMWin32中的Handle句柄Q很多方法需要通过Context才能识别调用者的实例Q比如说Toast的第一个参数就是ContextQ一般在Activity中我们直接用this代替Q代表调用者的实例为ActivityQ而到了一个button的onClick(View view){方法时Q我们用this时就会报错,所以我们可能用ActivityName.this来解冻I主要原因是因为实现Context的类主要有AndroidҎ(gu)的几个模型,Activity、Service以及BroadcastReceiver?br />
  常规需要Context实例的方法主要有各种Service实现的类Q比如说SensorManager在实例化旉要getSystemService(String)Ҏ(gu)必ȝContext的实例执行,q有一些私有的文gpȝI/O比如说openFileInput以及常用的Toast的makeTextҎ(gu)?br />
在android中context可以作很多操作,但是最主要的功能是加蝲和访问资源。在android中有两种contextQ一U是 application contextQ一U是activity contextQ通常我们在各U类和方法间传递的是activity context?br />比如一个activity的onCreateQ?br />protected void onCreate(Bundle state) {
        super.onCreate(state);

        TextView label
= new TextView(this); //传递contextlview control
        label.setText("Leaks are bad");

        setContentView(label);
}
把activity context传递给viewQ意味着view拥有一个指向activity的引用,q而引用activity占有的资源:view hierachy, resource{?br />q样如果context发生内存泄露的话Q就会泄露很多内存?br />q里泄露的意思是gc没有办法回收activity的内存?br />
Leaking an entire activity是很Ҏ(gu)的一件事?br />
当屏q旋转的时候,pȝ会销毁当前的activityQ保存状态信息,再创Z个新的?br />
比如我们写了一个应用程序,它需要加载一个很大的囄Q我们不希望每次旋{?q的时候都销毁这个图片,重新加蝲。实现这个要求的单想法就是定义一个静态的DrawableQ这样Activity cd建销毁它始终保存在内存中?br />实现cMQ?br />
public class myactivity extends Activity {
       
private static Drawable sBackground;
       
protected void onCreate(Bundle state) {
                super.onCreate(state);

                TextView label
= new TextView(this);
                label.setText(
"Leaks are bad");

               
if (sBackground == null) {
                        sBackground
= getDrawable(R.drawable.large_bitmap);
                }
        label.setBackgroundDrawable(sBackground);
//drawable attached to a view

        setContentView(label);
        }
}
q段E序看v来很单,但是却问题很大。当屏幕旋{的时候会有leakQ即gc没法销毁activityQ?br />我们刚才说过Q屏q旋转的时候系l会销毁当前的activity。但是当drawable和view兌后,drawable保存了view?referenceQ即sBackground保存了label的引用,而label保存了activity的引用。既然drawable不能销毁,它所 引用和间接引用的都不能销毁,q样pȝ没有办法销毁当前的activityQ于是造成了内存泄霌Ӏgc对这U类型的内存泄露是无能ؓ力的?br />
避免q种内存泄露的方法是避免activity中的M对象的生命周期长qactivityQ避免由于对象对 activity的引用导致activity不能正常被销毁。我们可以用application context。application context伴随application的一生,与activity的生命周期无兟뀂application context可以通过Context.getApplicationContext或者Activity.getApplicationҎ(gu)获取?br />
避免context相关的内存泄ԌC以下几点Q?br />
1. 不要让生命周期长的对象引用activity contextQ即保证引用activity的对象要与activity本n生命周期是一L
2. 对于生命周期长的对象Q可以用application context
3. 避免非静态的内部c,量使用静态类Q避免生命周期问题,注意内部cd外部对象引用D的生命周期变?br />




life02 2011-12-05 17:13 发表评论
]]>
þþþþaëƬ| ŷսպ91ۺһþþ| 99þþƷҹһ| ɫþˬˬƬaV | þˬˬƬAV| þþþ޾Ʒ| ŷ޾Ʒ˾þ| һþۺ³³ŷһ | þþž޾Ʒ| ƷþþþþþþѼ| ۺɫ77777þ| þþþƷsmվ| 99þҹɫƷվ| þþƷŷ| 㽶97þ| þþĻձ| ɫþ| AVպƷþþþþ| þþƷƵ| ھƷþþþþ鶹| ޾ƷŮþþþ99С˵| þ99Ʒ鶹| Ʒ۲ӰԺþ| þøһëƬ| Ʒþþ21p| þùƷӰԺ| þ996ȾƷxxxx| þþƷԴվ | 77777ҹþö| þҹɫƷAV| þù| þþþAVվ| þѹƵ| ҹƷþþþþþ| þþƷaĻ| ˾þþƷӰԺ| þþŮ붯ȺëƬ| ƷŮٸaѾþ| պ뾫Ʒþþò| ҹƷþþþþ˳| 777þµַ|