﻿<?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>C++博客-编程自动化-随笔分类-android 开发</title><link>http://www.cppblog.com/AutomateProgram/category/13634.html</link><description>当音乐和传说在深夜中沉寂后，程序的每个字符还在跳动！</description><language>zh-cn</language><lastBuildDate>Tue, 14 Sep 2010 18:17:02 GMT</lastBuildDate><pubDate>Tue, 14 Sep 2010 18:17:02 GMT</pubDate><ttl>60</ttl><item><title>ADB使用方法</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/09/13/126503.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Mon, 13 Sep 2010 07:05:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/09/13/126503.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/126503.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/09/13/126503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/126503.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/126503.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://blog.csdn.net/liranke/archive/2009/10/24/4721954.aspx">http://blog.csdn.net/liranke/archive/2009/10/24/4721954.aspx</a><br><br>ADB全称Android Debug Bridge, 是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备(如G1手机).</p>
<p>它的主要功能有:</p>
<p>&nbsp;</p>
<p>&#8226;运行设备的shell(命令行) <br>&#8226;管理模拟器或设备的端口映射 <br>&#8226;计算机和设备之间上传/下载文件 <br>&#8226;将本地apk软件安装至模拟器或android设备</p>
<p><br>ADB是一个 客户端-服务器端 程序, 其中客户端是你用来操作的电脑, 服务器端是android设备.</p>
<p>先说安装方法, 电脑上需要安装客户端. 客户端包含在sdk里. 设备上不需要安装, 只需要在手机上打开选项settings-applications-development-USB debugging.</p>
<p>对于Mac和Linux用户, 下载好的sdk解压后, 可以放~或者任意目录. 然后修改~/.bash_profile文件, 设置运行环境指向sdk的tools目录.<br>具体是打开~/.bash_profile文件(如果没有此文件也可以自行添加), 在里面加入一行:</p>
<p>export PATH=${PATH}:&lt;你的sdk目录&gt;/tools</p>
<p>例如：</p>
<p>&nbsp;</p>
<p>然后就可以使用adb命令了.</p>
<p>嫌安装麻烦的同学其实也可以省去上面安装步骤, 直接输入完整路径来使用命令, 例如:</p>
<p>&nbsp;</p>
<p>对于windows xp用户, 需要先安装usb驱动, 然后如果你只打算使用adb而不想下载整个sdk的话, 可以下载这个单独的adb工具包 下载后解压, 把里面 adb.exe 和 AdbWinApi.dll 两个文件放到系统盘的 windows/system32 文件夹里就可以了. </p>
<p>&nbsp;现在说下ADB常用的几个命令<br>1. 查看设备 </p>
<p>&#8226;adb devices<br>这个命令是查看当前连接的设备, 连接到计算机的android设备或者模拟器将会列出显示</p>
<p>2. 安装软件 </p>
<p>&#8226;adb install &lt;apk文件路径&gt;<br>这个命令将指定的apk文件安装到设备上</p>
<p>3. 卸载软件 </p>
<p>&#8226;adb uninstall &lt;软件名&gt; <br>&#8226;adb uninstall -k &lt;软件名&gt;<br>如果加 -k 参数,为卸载软件但是保留配置和缓存文件.</p>
<p>4. 登录设备shell </p>
<p>&#8226;adb shell <br>&#8226;adb shell &lt;command命令&gt;<br>这个命令将登录设备的shell.<br>后面加&lt;command命令&gt;将是直接运行设备命令, 相当于执行远程命令</p>
<p>5. 从电脑上发送文件到设备 </p>
<p>&#8226;adb push &lt;本地路径&gt; &lt;远程路径&gt;<br>用push命令可以把本机电脑上的文件或者文件夹复制到设备(手机)</p>
<p>6. 从设备上下载文件到电脑 </p>
<p>&#8226;adb pull &lt;远程路径&gt; &lt;本地路径&gt;<br>用pull命令可以把设备(手机)上的文件或者文件夹复制到本机电脑</p>
<p>7. 显示帮助信息 </p>
<p>&#8226;adb help<br>这个命令将显示帮助信息</p>
<p>8. 更多android命令使用方法,请参考我的另一篇博文:<a href="http://blog.csdn.net/liranke/archive/2009/12/15/5014534.aspx"><u><font color=#800080>android命令实战手册</font></u></a></p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/126503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-09-13 15:05 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/09/13/126503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android中读取短信</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/07/21/120930.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Wed, 21 Jul 2010 01:00:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/07/21/120930.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/120930.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/07/21/120930.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/120930.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/120930.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原文地址：http://hi.baidu.com/miuchen/blog/item/d5313b34bf35b887a61e1288.htmlimport&nbsp;android.app.Activity;import&nbsp;android.content.ContentValues;import&nbsp;android.database.ContentObserver;import...&nbsp;&nbsp;<a href='http://www.cppblog.com/AutomateProgram/archive/2010/07/21/120930.html'>阅读全文</a><img src ="http://www.cppblog.com/AutomateProgram/aggbug/120930.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-07-21 09:00 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/07/21/120930.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android中widgets开发入门（开发显示电源电量widgets）</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/06/13/117782.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sun, 13 Jun 2010 05:13:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/06/13/117782.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/117782.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/06/13/117782.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/117782.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/117782.html</trackback:ping><description><![CDATA[参考网站：<a href="http://www.eoeandroid.com/viewthread.php?tid=19709&amp;highlight=widget">http://www.eoeandroid.com/viewthread.php?tid=19709&amp;highlight=widget</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Android<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E5%BC%80%E5%8F%91">开发</span>的<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E5%BA%94%E7%94%A8">应用</span>除了<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E7%A8%8B%E5%BA%8F">程序</span>应用，还有是<span class=t_tag onclick=tagshow(event) href="tag.php?name=Widget">Widget</span>应用。好多人会开发程序应用而不会开发Widget应用。<br>&nbsp;&nbsp;&nbsp;
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 30px; TEXT-INDENT: 2em">先简单说说Widget的原理。Widget是在桌面上的一块显示信息的东西，也通过单击Widget跳转到一个程序里面。而<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E7%B3%BB%E7%BB%9F">系统</span>自带的程序，典型的Widget是music，这个Android内置的音乐<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E6%92%AD%E6%94%BE">播放</span>小程序。这个是典型的Widget+<span class=t_tag onclick=tagshow(event) href="tag.php?name=app">app</span>应用。就是一个程序既可以通过Widget启动，也可以通过App启动。Widget就是一个AppWidgetProvider+一个UI<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E7%95%8C%E9%9D%A2">界面</span>显示（预先绑定了好多<span id=ajaxid_0.2920319025179945 class=t_tag onclick=tagshow(event) unselectable="true" href="tag.php?name=Intent" overfunc="null" outfunc="null" initialized="true">Intent</span>），界面上的信息可以通过程序控制而改变，单击Widget，上的<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E6%8E%A7%E4%BB%B6">控件</span>只能激发发送一个Intent，或发出一个<span class=t_tag onclick=tagshow(event) href="tag.php?name=Service">Service</span>的启动通知。而AppWidgetProvider可以拦截这个Intent，而进行相应的处理（比如显示新的信息）。</p>
&nbsp;&nbsp;&nbsp; 我们先来看看AndroidManifest.xml中的代码：<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"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">manifest&nbsp;</span><span style="COLOR: #ff0000">xmlns:android</span><span style="COLOR: #0000ff">="http://schemas.android.com/apk/res/android"</span><span style="COLOR: #ff0000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;package</span><span style="COLOR: #0000ff">="com.android"</span><span style="COLOR: #ff0000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:versionCode</span><span style="COLOR: #0000ff">="1"</span><span style="COLOR: #ff0000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:versionName</span><span style="COLOR: #0000ff">="1.0"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">application&nbsp;</span><span style="COLOR: #ff0000">android:icon</span><span style="COLOR: #0000ff">="@drawable/icon"</span><span style="COLOR: #ff0000">&nbsp;android:label</span><span style="COLOR: #0000ff">="@string/app_name"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">receiver&nbsp;</span><span style="COLOR: #ff0000">android:name</span><span style="COLOR: #0000ff">=".BatteryMonitor"</span><span style="COLOR: #ff0000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:label</span><span style="COLOR: #0000ff">="@string/app_name"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">intent-filter</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">action&nbsp;</span><span style="COLOR: #ff0000">android:name</span><span style="COLOR: #0000ff">="android.appwidget.action.APPWIDGET_UPDATE"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">intent-filter</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">meta-data<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #ff0000">android:name</span><span style="COLOR: #0000ff">="android.appwidget.provider"</span><span style="COLOR: #ff0000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:resource</span><span style="COLOR: #0000ff">="@xml/widget_provider"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">receiver</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">application</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">uses-sdk&nbsp;</span><span style="COLOR: #ff0000">android:minSdkVersion</span><span style="COLOR: #0000ff">="3"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">manifest</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;</span></div>
这里很清楚的可以看出AppWidgetProvider就是一个receiver的东西。<br>在receiver中<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"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">meta-data<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #ff0000">android:name</span><span style="COLOR: #0000ff">="android.appwidget.provider"</span><span style="COLOR: #ff0000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:resource</span><span style="COLOR: #0000ff">="@xml/widget_provider"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span></div>
代表了一个widget_provider代码如下：<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"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">appwidget-provider<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;</span><span style="COLOR: #ff0000">xmlns:android</span><span style="COLOR: #0000ff">="http://schemas.android.com/apk/res/android"</span><span style="COLOR: #ff0000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;android:minWidth</span><span style="COLOR: #0000ff">="100dip"</span><span style="COLOR: #ff0000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;android:minHeight</span><span style="COLOR: #0000ff">="100dip"</span><span style="COLOR: #ff0000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;android:initialLayout</span><span style="COLOR: #0000ff">="@layout/main"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">appwidget-provider</span><span style="COLOR: #0000ff">&gt;</span></div>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 30px; TEXT-INDENT: 2em">这个是Widget的显示<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E8%AE%BE%E7%BD%AE">设置</span>，是对Widget属性的一个配置文件这个android:minHeight是Widget的高，这个android:minWidth<br>是Widget的宽。这个android:updatePeriodMillis属性是设置Widget页面的<br>更新页面的时间的频率。而这个android:initialLayout属性是表示的是初始化页面的布局，Android里画UI的地方都是通过xml文件，也可以通过<span id=ajaxid_0.9715062123412328 class=t_tag onclick=tagshow(event) unselectable="true" href="tag.php?name=%E4%BB%A3%E7%A0%81" overfunc="null" outfunc="null" initialized="true">代码</span>程序来画，不过这样画的太麻烦了。</p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 30px; TEXT-INDENT: 2em">建一个类BatteryMonitor继承于AppWidgetProvider，而AppWidgetProvider继承与android.content.BroadcastReceiver，所以TestAppWidget就是一个拦截处理Intent的BroadcastReceiver，这些Intent只能在Androidmainfest里设置来拦截处理。<br>在onUpdate中设置窗口界面：<br></p>
<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"><img id=Codehighlighter1_44_613_Open_Image onclick="this.style.display='none'; Codehighlighter1_44_613_Open_Text.style.display='none'; Codehighlighter1_44_613_Closed_Image.style.display='inline'; Codehighlighter1_44_613_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_44_613_Closed_Image onclick="this.style.display='none'; Codehighlighter1_44_613_Closed_Text.style.display='none'; Codehighlighter1_44_613_Open_Image.style.display='inline'; Codehighlighter1_44_613_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="COLOR: #000000">&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;defaultWidget(Context&nbsp;context)&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_44_613_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_44_613_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RemoteViews&nbsp;updateViews&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;RemoteViews(context.getPackageName(),&nbsp;R.layout.main);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">updateViews.setTextViewText(R.id.battery_level,&nbsp;BatteryLevel+"&nbsp;%");</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateViews.setImageViewResource(R.id.battery_img,&nbsp;R.drawable.batteryimg);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Push&nbsp;update&nbsp;for&nbsp;this&nbsp;widget&nbsp;to&nbsp;the&nbsp;home&nbsp;screen</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ComponentName&nbsp;batteryWidget&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ComponentName(context,&nbsp;BatteryMonitor.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AppWidgetManager&nbsp;manager&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;AppWidgetManager.getInstance(context);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manager.updateAppWidget(batteryWidget,&nbsp;updateViews);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
启动一个服务来更新电源电量：<br>context.startService(new Intent(context, BatteryMonitorReceiver.class));<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"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;android.app.Service;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;android.appwidget.AppWidgetManager;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;android.content.BroadcastReceiver;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;android.content.ComponentName;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;android.content.Context;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;android.content.Intent;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;android.content.IntentFilter;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;android.os.IBinder;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;android.util.Log;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;android.widget.RemoteViews;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;BatteryMonitorReceiver&nbsp;</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000">&nbsp;Service<br><img id=Codehighlighter1_394_2131_Open_Image onclick="this.style.display='none'; Codehighlighter1_394_2131_Open_Text.style.display='none'; Codehighlighter1_394_2131_Closed_Image.style.display='inline'; Codehighlighter1_394_2131_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_394_2131_Closed_Image onclick="this.style.display='none'; Codehighlighter1_394_2131_Closed_Text.style.display='none'; Codehighlighter1_394_2131_Open_Image.style.display='inline'; Codehighlighter1_394_2131_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></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_394_2131_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_394_2131_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;BatteryLevel&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;BroadcastReceiver&nbsp;batteryReceiver&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;BroadcastReceiver()<br><img id=Codehighlighter1_507_882_Open_Image onclick="this.style.display='none'; Codehighlighter1_507_882_Open_Text.style.display='none'; Codehighlighter1_507_882_Closed_Image.style.display='inline'; Codehighlighter1_507_882_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_507_882_Closed_Image onclick="this.style.display='none'; Codehighlighter1_507_882_Closed_Text.style.display='none'; Codehighlighter1_507_882_Open_Image.style.display='inline'; Codehighlighter1_507_882_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&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_507_882_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_507_882_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&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;onReceive(Context&nbsp;context,&nbsp;Intent&nbsp;intent)<br><img id=Codehighlighter1_597_876_Open_Image onclick="this.style.display='none'; Codehighlighter1_597_876_Open_Text.style.display='none'; Codehighlighter1_597_876_Closed_Image.style.display='inline'; Codehighlighter1_597_876_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_597_876_Closed_Image onclick="this.style.display='none'; Codehighlighter1_597_876_Closed_Text.style.display='none'; Codehighlighter1_597_876_Open_Image.style.display='inline'; Codehighlighter1_597_876_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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_597_876_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_597_876_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;action&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;intent.getAction();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(action.equals(Intent.ACTION_BATTERY_CHANGED))<br><img id=Codehighlighter1_712_866_Open_Image onclick="this.style.display='none'; Codehighlighter1_712_866_Open_Text.style.display='none'; Codehighlighter1_712_866_Closed_Image.style.display='inline'; Codehighlighter1_712_866_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_712_866_Closed_Image onclick="this.style.display='none'; Codehighlighter1_712_866_Closed_Text.style.display='none'; Codehighlighter1_712_866_Open_Image.style.display='inline'; Codehighlighter1_712_866_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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_712_866_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_712_866_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">BatteryLevel</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">BatteryCHANGED</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BatteryLevel&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;intent.getIntExtra(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">level</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpdateAppWidget(context);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_938_1392_Open_Image onclick="this.style.display='none'; Codehighlighter1_938_1392_Open_Text.style.display='none'; Codehighlighter1_938_1392_Closed_Image.style.display='inline'; Codehighlighter1_938_1392_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_938_1392_Closed_Image onclick="this.style.display='none'; Codehighlighter1_938_1392_Closed_Text.style.display='none'; Codehighlighter1_938_1392_Open_Image.style.display='inline'; Codehighlighter1_938_1392_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&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;UpdateAppWidget(Context&nbsp;context)</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_938_1392_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_938_1392_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RemoteViews&nbsp;updateViews&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;RemoteViews(context.getPackageName(),&nbsp;R.layout.main);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateViews.setTextViewText(R.id.battery_level,&nbsp;BatteryLevel</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;%</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Push&nbsp;update&nbsp;for&nbsp;this&nbsp;widget&nbsp;to&nbsp;the&nbsp;home&nbsp;screen</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ComponentName&nbsp;batteryWidget&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ComponentName(context,&nbsp;BatteryMonitor.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AppWidgetManager&nbsp;manager&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;AppWidgetManager.getInstance(context);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manager.updateAppWidget(batteryWidget,&nbsp;updateViews);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_1403_1463_Open_Image onclick="this.style.display='none'; Codehighlighter1_1403_1463_Open_Text.style.display='none'; Codehighlighter1_1403_1463_Closed_Image.style.display='inline'; Codehighlighter1_1403_1463_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1403_1463_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1403_1463_Closed_Text.style.display='none'; Codehighlighter1_1403_1463_Open_Image.style.display='inline'; Codehighlighter1_1403_1463_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&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_1403_1463_Closed_Text>/**/</span><span id=Codehighlighter1_1403_1463_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;(non-Javadoc)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;android.app.Service#onCreate()<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;@Override<br><img id=Codehighlighter1_1500_1709_Open_Image onclick="this.style.display='none'; Codehighlighter1_1500_1709_Open_Text.style.display='none'; Codehighlighter1_1500_1709_Closed_Image.style.display='inline'; Codehighlighter1_1500_1709_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1500_1709_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1500_1709_Closed_Text.style.display='none'; Codehighlighter1_1500_1709_Open_Image.style.display='inline'; Codehighlighter1_1500_1709_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&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;onCreate()&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_1500_1709_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1500_1709_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">super</span><span style="COLOR: #000000">.onCreate();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntentFilter&nbsp;itFilter&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;IntentFilter();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itFilter.addAction(Intent.ACTION_BATTERY_CHANGED);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;registerReceiver(batteryReceiver,&nbsp;itFilter);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;@Override<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&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;onStart(Intent&nbsp;intent,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;startId)<br><img id=Codehighlighter1_1779_1791_Open_Image onclick="this.style.display='none'; Codehighlighter1_1779_1791_Open_Text.style.display='none'; Codehighlighter1_1779_1791_Closed_Image.style.display='inline'; Codehighlighter1_1779_1791_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1779_1791_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1779_1791_Closed_Text.style.display='none'; Codehighlighter1_1779_1791_Open_Image.style.display='inline'; Codehighlighter1_1779_1791_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&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_1779_1791_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1779_1791_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_1800_1861_Open_Image onclick="this.style.display='none'; Codehighlighter1_1800_1861_Open_Text.style.display='none'; Codehighlighter1_1800_1861_Closed_Image.style.display='inline'; Codehighlighter1_1800_1861_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1800_1861_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1800_1861_Closed_Text.style.display='none'; Codehighlighter1_1800_1861_Open_Image.style.display='inline'; Codehighlighter1_1800_1861_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&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_1800_1861_Closed_Text>/**/</span><span id=Codehighlighter1_1800_1861_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;(non-Javadoc)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;android.app.Service#onDestroy()<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;@Override<br><img id=Codehighlighter1_1899_1999_Open_Image onclick="this.style.display='none'; Codehighlighter1_1899_1999_Open_Text.style.display='none'; Codehighlighter1_1899_1999_Closed_Image.style.display='inline'; Codehighlighter1_1899_1999_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1899_1999_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1899_1999_Closed_Text.style.display='none'; Codehighlighter1_1899_1999_Open_Image.style.display='inline'; Codehighlighter1_1899_1999_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&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;onDestroy()&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_1899_1999_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1899_1999_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">super</span><span style="COLOR: #000000">.onDestroy();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unregisterReceiver(batteryReceiver);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;@Override<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;IBinder&nbsp;onBind(Intent&nbsp;intent)<br><img id=Codehighlighter1_2058_2128_Open_Image onclick="this.style.display='none'; Codehighlighter1_2058_2128_Open_Text.style.display='none'; Codehighlighter1_2058_2128_Closed_Image.style.display='inline'; Codehighlighter1_2058_2128_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_2058_2128_Closed_Image onclick="this.style.display='none'; Codehighlighter1_2058_2128_Closed_Text.style.display='none'; Codehighlighter1_2058_2128_Open_Image.style.display='inline'; Codehighlighter1_2058_2128_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&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_2058_2128_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_2058_2128_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
在xml中注册服务<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"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">service&nbsp;android:name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.BatteryMonitorReceiver</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">intent</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">action&nbsp;android:name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">com.adroid.pp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">category&nbsp;android:name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">android.intent.category.default</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">intent</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">service</span><span style="COLOR: #000000">&gt;</span></div>
<a href="http://www.cppblog.com/Files/AutomateProgram/BatteryMonitor.rar">代码下载 </a>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/117782.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-06-13 13:13 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/06/13/117782.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>adb的一些命令</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/06/09/117501.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Wed, 09 Jun 2010 14:04:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/06/09/117501.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/117501.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/06/09/117501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/117501.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/117501.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://blog.csdn.net/chief1985/archive/2010/05/03/5553022.aspx">http://blog.csdn.net/chief1985/archive/2010/05/03/5553022.aspx</a><br><br>android的adb采用的是server+client的方式，所以adb是支持多个设备同时连接的。通过adb devices命令可以看到所有连接的android设备，而多个设备都连上adb server，如果你想针对某一个设备执行adb命令，可以在adb命令后面加上-s &lt;serial number&gt;,例如adb &#8211;s 12345678 push c:\a.txt /data/。adb的设计可以参考<a href="http://blog.csdn.net/wbw1985/archive/2010/04/02/5443910.aspx">http://blog.csdn.net/wbw1985/archive/2010/04/02/5443910.aspx</a>。</p>
<p>对于adb shell，后面可以跟的命令主要来自android-1.5\system\core\toolbox里面，如下：</p>
<p>&nbsp;&nbsp;&nbsp; ls&nbsp; <br>&nbsp;&nbsp;&nbsp; mount&nbsp; <br>&nbsp;&nbsp;&nbsp; cat&nbsp; <br>&nbsp;&nbsp;&nbsp; ps&nbsp; <br>&nbsp;&nbsp;&nbsp; kill&nbsp; <br>&nbsp;&nbsp;&nbsp; ln&nbsp; <br>&nbsp;&nbsp;&nbsp; insmod&nbsp; <br>&nbsp;&nbsp;&nbsp; rmmod&nbsp; <br>&nbsp;&nbsp;&nbsp; lsmod&nbsp; <br>&nbsp;&nbsp;&nbsp; ifconfig&nbsp; <br>&nbsp;&nbsp;&nbsp; setconsole&nbsp; <br>&nbsp;&nbsp;&nbsp; rm&nbsp; <br>&nbsp;&nbsp;&nbsp; mkdir&nbsp; <br>&nbsp;&nbsp;&nbsp; rmdir&nbsp; <br>&nbsp;&nbsp;&nbsp; reboot&nbsp; <br>&nbsp;&nbsp;&nbsp; getevent&nbsp; <br>&nbsp;&nbsp;&nbsp; sendevent&nbsp; <br>&nbsp;&nbsp;&nbsp; date&nbsp; <br>&nbsp;&nbsp;&nbsp; wipe&nbsp; <br>&nbsp;&nbsp;&nbsp; sync&nbsp; <br>&nbsp;&nbsp;&nbsp; umount&nbsp; <br>&nbsp;&nbsp;&nbsp; start&nbsp; <br>&nbsp;&nbsp;&nbsp; stop&nbsp; <br>&nbsp;&nbsp;&nbsp; notify&nbsp; <br>&nbsp;&nbsp;&nbsp; cmp&nbsp; <br>&nbsp;&nbsp;&nbsp; dmesg&nbsp; <br>&nbsp;&nbsp;&nbsp; route&nbsp; <br>&nbsp;&nbsp;&nbsp; hd&nbsp; <br>&nbsp;&nbsp;&nbsp; dd&nbsp; <br>&nbsp;&nbsp;&nbsp; df&nbsp; <br>&nbsp;&nbsp;&nbsp; getprop&nbsp; <br>&nbsp;&nbsp;&nbsp; setprop&nbsp; <br>&nbsp;&nbsp;&nbsp; watchprops&nbsp; <br>&nbsp;&nbsp;&nbsp; log&nbsp; <br>&nbsp;&nbsp;&nbsp; sleep&nbsp; <br>&nbsp;&nbsp;&nbsp; renice&nbsp; <br>&nbsp;&nbsp;&nbsp; printenv&nbsp; <br>&nbsp;&nbsp;&nbsp; smd&nbsp; <br>&nbsp;&nbsp;&nbsp; chmod&nbsp; <br>&nbsp;&nbsp;&nbsp; chown&nbsp; <br>&nbsp;&nbsp;&nbsp; mkdosfs&nbsp; <br>&nbsp;&nbsp;&nbsp; netstat&nbsp; <br>&nbsp;&nbsp;&nbsp; ioctl&nbsp; <br>&nbsp;&nbsp;&nbsp; mv&nbsp; <br>&nbsp;&nbsp;&nbsp; schedtop&nbsp; <br>&nbsp;&nbsp;&nbsp; top&nbsp; <br>&nbsp;&nbsp;&nbsp; iftop&nbsp; <br>&nbsp;&nbsp;&nbsp; id&nbsp; <br>&nbsp;&nbsp;&nbsp; vmstat </p>
<p>具体的意思就不解释了，大家可以去看linux手册或者看android的源码。需要说一下的是ps命令,很多时候我们想只列举出我们需要的进程列表，例如列举出所有运行的app。从ps的源码来看，它是支持filter的，ps app应该可以列举出所有以app开头的进程，但在某些手机里面运行时这个filter又是没用的，可能是这些手机修改了ps的代码。</p>
<p>还有两个比较好用的命令是adb shell am和adb shell pm,这两个命令在frameworks/base/cmds下面。am命令主要用于管理Activity，例如启动，停止Activity（eclipse在运行Activity就使用了这个命令），发送intent；pm命令则主要用于管理应用package的管理，有点像控制面板的添加和删除程序。</p>
<p>am命令的具体用法如下：</p>
<p>usage: am [start|broadcast|instrument|profile] <br>am start -D INTENT <br>am broadcast INTENT <br>am instrument [-r] [-e &lt;ARG_NAME&gt; &lt;ARG_VALUE&gt;] [-p &lt;PROF_FILE&gt;] <br>[-w] &lt;COMPONENT&gt; <br>am profile &lt;PROCESS&gt; [start &lt;PROF_FILE&gt;|stop] <br>INTENT is described with: <br>[-a &lt;ACTION&gt;] [-d &lt;DATA_URI&gt;] [-t &lt;MIME_TYPE&gt;] <br>[-c &lt;CATEGORY&gt; [-c &lt;CATEGORY&gt;] ...] <br>[-e|--es &lt;EXTRA_KEY&gt; &lt;EXTRA_STRING_VALUE&gt; ...] <br>[--ez &lt;EXTRA_KEY&gt; &lt;EXTRA_BOOLEAN_VALUE&gt; ...] <br>[-e|--ei &lt;EXTRA_KEY&gt; &lt;EXTRA_INT_VALUE&gt; ...] <br>[-n &lt;COMPONENT&gt;] [-f &lt;FLAGS&gt;] [&lt;URI&gt;] <br>The start command starts activity. Use -D option to make 'DebugOption' true. <br>The broadcast command sends broadcast. <br>The instrument command starts instrumentation. <br>Use -r option to make 'rawMode' true. <br>Use -e option to add the pair of ARG_NAME and ARG_VALUE into Bundle. <br>Use -p option to specify profileFile. <br>Use -w option to make 'wait' true in order to new an instance of InstrumentationWatcher. <br>Use COMPONENT to specify the name of the instrumentation component. <br>The profile command turn on/off profiling in a particular process specified by PROCESS. <br>Use start option to turn on and stop to turn off.Use PROF_FILE to specify the file path of profile. <br>Use -a to set action specified by ACTION to be performed. <br>Use -d to create a Uri(data) which parses the given encoded URI string DATA_URI. <br>Use -t to specify the type specified by MIME_TYPE. Use -c to add a new category specified by <br>CATEGORY to the intent. <br>Use -e or --es to add extended data to the intent.EXTRA_KEY specifies the name of the extra data and <br>EXTRA_STRING_VALUE specifies the string data value. <br>Use --ez to add extended data to the intent. EXTRA_KEY specifies the name of the extra data and <br>EXTRA_BOOLEAN_VALUE specifies the serializable data value. <br>Use -e or --ei to add extended data to the intent. EXTRA_KEY specifies the name of the extra data and <br>EXTRA_INT_VALUE specifies the serializable data value. <br>Use -n to explicitly set the component specified by COMPONENT to handle the intent. <br>Use -f to set special flags controlling how this intent is handled.FLAGS specifies the desired flags. <br>Use URI to create an intent from a URI. </p>
<p>pm命令的具体用法如下：</p>
<p>usage: pm [list|path|install|uninstall] <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pm list packages [-f] <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pm list permission-groups <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pm list permissions [-g] [-f] [-d] [-u] [GROUP] <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pm list instrumentation [-f] [TARGET-PACKAGE] <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pm path PACKAGE <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pm install [-l] [-r] PATH <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pm uninstall [-k] PACKAGE <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pm enable PACKAGE_OR_COMPONENT <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pm disable PACKAGE_OR_COMPONENT </p>
<p>The list packages command prints all packages.&nbsp; Use <br>the -f option to see their associated file. </p>
<p>The list permission-groups command prints all known <br>permission groups. </p>
<p>The list permissions command prints all known <br>permissions, optionally only those in GROUP.&nbsp; Use <br>the -g option to organize by group.&nbsp; Use <br>the -f option to print all information.&nbsp; Use <br>the -s option for a short summary.&nbsp; Use <br>the -d option to only list dangerous permissions.&nbsp; Use <br>the -u option to list only the permissions users will see. </p>
<p>The list instrumentation command prints all instrumentations, <br>or only those that target a specified package.&nbsp; Use the -f option <br>to see their associated file. </p>
<p>The path command prints the path to the .apk of a package. </p>
<p>The install command installs a package to the system.&nbsp; Use <br>the -l option to install the package with FORWARD_LOCK. Use <br>the -r option to reinstall an exisiting app, keeping its data. </p>
<p>The uninstall command removes a package from the system. Use <br>the -k option to keep the data and cache directories around <br>after the package removal. </p>
<p>The enable and disable commands change the enabled state of <br>a given package or component (written as "package/class").<br>&nbsp;</p>
<p>frameworks/base/cmds下面还有一个别的命令,如下 </p>
<p><br>dumpstate <br>dumpsys <br>ime <br>input <br>installd <br>runtime <br>service <br>servicemanager <br>surfaceflinger <br>svc <br>system_server </p>
<p>下面是上述命令的一些输出：</p>
<p>C:\Users\xufan&gt;adb shell dumpstate <br>======================================================== <br>== dumpstate <br>======================================================== <br>------ MEMORY INFO ------ <br>MemTotal:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 94348 kB <br>MemFree:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9912 kB <br>Buffers:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 kB <br>Cached:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 47876 kB <br>SwapCached:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 kB <br>Active:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 47016 kB <br>Inactive:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29980 kB <br>SwapTotal:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 kB <br>SwapFree:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 kB <br>Dirty:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 kB <br>Writeback:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 kB <br>AnonPages:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29156 kB <br>Mapped:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 22948 kB <br>Slab:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2992 kB <br>SReclaimable:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 796 kB <br>SUnreclaim:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2196 kB <br>PageTables:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2180 kB <br>NFS_Unstable:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 kB <br>Bounce:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 kB <br>WritebackTmp:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 kB <br>CommitLimit:&nbsp;&nbsp;&nbsp;&nbsp; 47172 kB <br>Committed_AS:&nbsp;&nbsp; 658548 kB <br>VmallocTotal:&nbsp;&nbsp; 876544 kB <br>VmallocUsed:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8380 kB <br>VmallocChunk:&nbsp;&nbsp; 859132 kB </p>
<p>------ CPU INFO ------ </p>
<p>User 7%, System 23%, IOW 0%, IRQ 0% <br>User 11 + Nice 0 + Sys 33 + Idle 98 + IOW 0 + IRQ 0 + SIRQ 0 = 142 </p>
<p>&nbsp; PID&nbsp;&nbsp; TID CPU% S&nbsp;&nbsp;&nbsp;&nbsp; VSS&nbsp;&nbsp;&nbsp;&nbsp; RSS UID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Proc <br>&nbsp; 743&nbsp;&nbsp; 743&nbsp; 26% R&nbsp;&nbsp;&nbsp; 928K&nbsp;&nbsp;&nbsp; 384K shell&nbsp;&nbsp;&nbsp; top&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top <br>&nbsp; 565&nbsp;&nbsp; 581&nbsp;&nbsp; 1% S 177876K&nbsp; 25384K system&nbsp;&nbsp; er.ServerThread system_server <br>&nbsp; 565&nbsp;&nbsp; 570&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; Binder Thread # system_server <br>&nbsp; 565&nbsp;&nbsp; 571&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; Binder Thread # system_server <br>&nbsp; 605&nbsp;&nbsp; 605&nbsp;&nbsp; 0% S 105820K&nbsp; 17540K radio&nbsp;&nbsp;&nbsp; app_process&nbsp;&nbsp;&nbsp;&nbsp; com.android.phone <br>&nbsp; 565&nbsp;&nbsp; 619&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; er$SensorThread system_server <br>&nbsp; 565&nbsp;&nbsp; 585&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; PackageManager&nbsp; system_server <br>&nbsp; 565&nbsp;&nbsp; 586&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; FileObserver&nbsp;&nbsp;&nbsp; system_server <br>&nbsp; 565&nbsp;&nbsp; 589&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; SyncHandlerThre system_server <br>&nbsp; 565&nbsp;&nbsp; 590&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; UEventObserver&nbsp; system_server <br>&nbsp; 565&nbsp;&nbsp; 591&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; PowerManagerSer system_server <br>&nbsp; 565&nbsp;&nbsp; 592&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; AlarmManager&nbsp;&nbsp;&nbsp; system_server <br>&nbsp; 565&nbsp;&nbsp; 593&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; WindowManager&nbsp;&nbsp; system_server <br>&nbsp; 565&nbsp;&nbsp; 594&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; InputDeviceRead system_server <br>&nbsp; 565&nbsp;&nbsp; 595&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; WindowManagerPo system_server <br>&nbsp; 565&nbsp;&nbsp; 596&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; InputDispatcher system_server <br>&nbsp; 565&nbsp;&nbsp; 597&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; ConnectivityThr system_server <br>&nbsp; 565&nbsp;&nbsp; 598&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; WifiService&nbsp;&nbsp;&nbsp;&nbsp; system_server <br>&nbsp; 565&nbsp;&nbsp; 599&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; WifiWatchdogThr system_server <br>&nbsp; 565&nbsp;&nbsp; 600&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; er.ServerThread system_server <br>&nbsp; 565&nbsp;&nbsp; 601&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; GpsEventThread&nbsp; system_server <br>&nbsp; 565&nbsp;&nbsp; 602&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; AudioService&nbsp;&nbsp;&nbsp; system_server <br>&nbsp; 565&nbsp;&nbsp; 603&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; android:unnamed system_server <br>&nbsp; 565&nbsp;&nbsp; 604&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; android:unnamed system_server <br>&nbsp; 565&nbsp;&nbsp; 609&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; watchdog&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; system_server <br>&nbsp; 565&nbsp;&nbsp; 640&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; r.MountListener system_server <br>&nbsp; 565&nbsp;&nbsp; 651&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; Binder Thread # system_server <br>&nbsp; 565&nbsp;&nbsp; 678&nbsp;&nbsp; 0% S 177876K&nbsp; 25384K system&nbsp;&nbsp; Binder Thread # system_server <br>&nbsp; 605&nbsp;&nbsp; 606&nbsp;&nbsp; 0% S 105820K&nbsp; 17540K radio&nbsp;&nbsp;&nbsp; HeapWorker&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.android.phone <br>&nbsp; 605&nbsp;&nbsp; 607&nbsp;&nbsp; 0% S 105820K&nbsp; 17540K radio&nbsp;&nbsp;&nbsp; Signal Catcher&nbsp; com.android.phone <br>------ PROCRANK ------<br>&nbsp;</p>
<p><br>&nbsp;</p>
<p>C:\Users\xufan&gt;adb shell dumpsys </p>
<p>&nbsp; Provider mms-sms <br>&nbsp;&nbsp;&nbsp; ContentProviderRecord{436a0040 com.android.providers.telephony.MmsSmsProvide <br>r} <br>&nbsp;&nbsp;&nbsp; package=com.android.providers.telephony process=com.android.phone <br>&nbsp;&nbsp;&nbsp; app=ProcessRecord{43638990 605:com.android.phone/1001} <br>&nbsp;&nbsp;&nbsp; launchingApp=null <br>&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#61;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#46;&#99;&#111;&#110;&#116;&#101;&#110;&#116;&#46;&#67;&#111;&#110;&#116;&#101;&#110;&#116;&#80;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#80;&#114;&#111;&#120;&#121;&#64;&#52;&#51;&#54;&#99;&#56;&#99;&#56;&#56;">provider=android.content.ContentProviderProxy@436c8c88</a> <br>&nbsp;&nbsp;&nbsp; name=mms-sms <br>&nbsp;&nbsp;&nbsp; isSyncable=false <br>&nbsp;&nbsp;&nbsp; multiprocess=true initOrder=0 uid=1001 <br>&nbsp;&nbsp;&nbsp; clients=[] <br>&nbsp;&nbsp;&nbsp; externals=0 </p>
<p>&nbsp; Published content providers (by class): <br>&nbsp; Provider android.content.SyncProvider <br>&nbsp;&nbsp;&nbsp; ContentProviderRecord{435bceb8 android.content.SyncProvider} <br>&nbsp;&nbsp;&nbsp; package=android process=system <br>&nbsp;&nbsp;&nbsp; app=ProcessRecord{436236b8 565:system/1000} <br>&nbsp;&nbsp;&nbsp; launchingApp=null <br>&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#61;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#46;&#99;&#111;&#110;&#116;&#101;&#110;&#116;&#46;&#67;&#111;&#110;&#116;&#101;&#110;&#116;&#80;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#36;&#84;&#114;&#97;&#110;&#115;&#112;&#111;&#114;&#116;&#64;&#52;&#51;&#54;&#51;&#52;&#99;&#52;&#56;">provider=android.content.ContentProvider$Transport@43634c48</a> <br>&nbsp;&nbsp;&nbsp; name=sync <br>&nbsp;&nbsp;&nbsp; isSyncable=false <br>&nbsp;&nbsp;&nbsp; multiprocess=false initOrder=0 uid=1000 <br>&nbsp;&nbsp;&nbsp; clients=[] <br>&nbsp;&nbsp;&nbsp; externals=0 <br>&nbsp; Provider com.android.providers.telephony.MmsSmsProvider <br>&nbsp;&nbsp;&nbsp; ContentProviderRecord{436a0040 com.android.providers.telephony.MmsSmsProvide <br>r} <br>&nbsp;&nbsp;&nbsp; package=com.android.providers.telephony process=com.android.phone <br>&nbsp;&nbsp;&nbsp; app=ProcessRecord{43638990 605:com.android.phone/1001} <br>&nbsp;&nbsp;&nbsp; launchingApp=null <br>&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#61;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#46;&#99;&#111;&#110;&#116;&#101;&#110;&#116;&#46;&#67;&#111;&#110;&#116;&#101;&#110;&#116;&#80;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#80;&#114;&#111;&#120;&#121;&#64;&#52;&#51;&#54;&#99;&#56;&#99;&#56;&#56;">provider=android.content.ContentProviderProxy@436c8c88</a> <br>&nbsp;&nbsp;&nbsp; name=mms-sms <br>&nbsp;&nbsp;&nbsp; isSyncable=false <br>&nbsp;&nbsp;&nbsp; multiprocess=true initOrder=0 uid=1001 <br>&nbsp;&nbsp;&nbsp; clients=[] <br>&nbsp;&nbsp;&nbsp; externals=0 <br>&nbsp; Provider com.android.providers.settings.SettingsProvider <br>&nbsp;&nbsp;&nbsp; ContentProviderRecord{435bda90 com.android.providers.settings.SettingsProvid <br>er} <br>&nbsp;&nbsp;&nbsp; package=com.android.providers.settings process=system <br>&nbsp;&nbsp;&nbsp; app=ProcessRecord{436236b8 565:system/1000} <br>&nbsp;&nbsp;&nbsp; launchingApp=null <br>&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#61;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#46;&#99;&#111;&#110;&#116;&#101;&#110;&#116;&#46;&#67;&#111;&#110;&#116;&#101;&#110;&#116;&#80;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#36;&#84;&#114;&#97;&#110;&#115;&#112;&#111;&#114;&#116;&#64;&#52;&#51;&#53;&#97;&#50;&#98;&#53;&#56;">provider=android.content.ContentProvider$Transport@435a2b58</a> <br>&nbsp;&nbsp;&nbsp; name=settings <br>&nbsp;&nbsp;&nbsp; isSyncable=false <br>&nbsp;&nbsp;&nbsp; multiprocess=false initOrder=100 uid=1000 <br>&nbsp;&nbsp;&nbsp; clients=[ProcessRecord{4371bad0 655:com.android.alarmclock/10000}, ProcessRe <br>cord{43638990 605:com.android.phone/1001}] <br>&nbsp;&nbsp;&nbsp; externals=0 <br>&nbsp; Provider com.android.providers.userdictionary.UserDictionaryProvider <br>&nbsp;&nbsp;&nbsp; ContentProviderRecord{436a2398 com.android.providers.userdictionary.UserDict <br>ionaryProvider} <br>&nbsp;&nbsp;&nbsp; package=com.android.providers.userdictionary process=android.process.acore <br>&nbsp;&nbsp;&nbsp; app=ProcessRecord{43645bc0 608:android.process.acore/10004} <br>&nbsp;&nbsp;&nbsp; launchingApp=null <br>&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#61;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#46;&#99;&#111;&#110;&#116;&#101;&#110;&#116;&#46;&#67;&#111;&#110;&#116;&#101;&#110;&#116;&#80;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#80;&#114;&#111;&#120;&#121;&#64;&#52;&#51;&#54;&#99;&#99;&#99;&#97;&#48;">provider=android.content.ContentProviderProxy@436ccca0</a> <br>&nbsp;&nbsp;&nbsp; name=user_dictionary <br>&nbsp;&nbsp;&nbsp; isSyncable=false <br>&nbsp;&nbsp;&nbsp; multiprocess=false initOrder=0 uid=10004 <br>&nbsp;&nbsp;&nbsp; clients=[] <br>&nbsp;&nbsp;&nbsp; externals=0 <br>&nbsp; Provider com.android.providers.contacts.ContactsProvider <br>&nbsp;&nbsp;&nbsp; ContentProviderRecord{436a25e8 com.android.providers.contacts.ContactsProvid <br>er} <br>&nbsp;&nbsp;&nbsp; package=com.android.providers.contacts process=android.process.acore <br>&nbsp;&nbsp;&nbsp; app=ProcessRecord{43645bc0 608:android.process.acore/10004} <br>&nbsp;&nbsp;&nbsp; launchingApp=null <br>&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#61;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#46;&#99;&#111;&#110;&#116;&#101;&#110;&#116;&#46;&#67;&#111;&#110;&#116;&#101;&#110;&#116;&#80;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#80;&#114;&#111;&#120;&#121;&#64;&#52;&#51;&#54;&#99;&#100;&#57;&#49;&#48;">provider=android.content.ContentProviderProxy@436cd910</a> <br>&nbsp;&nbsp;&nbsp; name=contacts;call_log <br>&nbsp;&nbsp;&nbsp; isSyncable=false <br>&nbsp;&nbsp;&nbsp; multiprocess=false initOrder=0 uid=10004 <br>&nbsp;&nbsp;&nbsp; clients=[] <br>&nbsp;&nbsp;&nbsp; externals=0 <br>&nbsp; Provider com.android.providers.drm.DrmProvider <br>&nbsp;&nbsp;&nbsp; ContentProviderRecord{4361c528 com.android.providers.drm.DrmProvider} <br>&nbsp;&nbsp;&nbsp; package=com.android.providers.drm process=android.process.media <br>&nbsp;&nbsp;&nbsp; app=ProcessRecord{436e89e8 644:android.process.media/10003} <br>&nbsp;&nbsp;&nbsp; launchingApp=null <br>&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#61;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#46;&#99;&#111;&#110;&#116;&#101;&#110;&#116;&#46;&#67;&#111;&#110;&#116;&#101;&#110;&#116;&#80;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#80;&#114;&#111;&#120;&#121;&#64;&#52;&#51;&#53;&#102;&#102;&#101;&#100;&#48;">provider=android.content.ContentProviderProxy@435ffed0</a> <br>&nbsp;&nbsp;&nbsp; name=drm <br>&nbsp;&nbsp;&nbsp; isSyncable=false <br>&nbsp;&nbsp;&nbsp; multiprocess=false initOrder=0 uid=10003 <br>&nbsp;&nbsp;&nbsp; clients=[] <br>&nbsp;&nbsp;&nbsp; externals=0 <br>&nbsp; Provider com.android.launcher.LauncherProvider <br>&nbsp;&nbsp;&nbsp; ContentProviderRecord{436a2710 com.android.launcher.LauncherProvider} <br>&nbsp;&nbsp;&nbsp; package=com.android.launcher process=android.process.acore <br>&nbsp;&nbsp;&nbsp; app=ProcessRecord{43645bc0 608:android.process.acore/10004} <br>&nbsp;&nbsp;&nbsp; launchingApp=null <br>&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#61;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#46;&#99;&#111;&#110;&#116;&#101;&#110;&#116;&#46;&#67;&#111;&#110;&#116;&#101;&#110;&#116;&#80;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#80;&#114;&#111;&#120;&#121;&#64;&#52;&#51;&#54;&#99;&#100;&#102;&#102;&#48;">provider=android.content.ContentProviderProxy@436cdff0</a> <br>&nbsp;&nbsp;&nbsp; name=com.android.launcher.settings <br>&nbsp;&nbsp;&nbsp; isSyncable=false <br>&nbsp;&nbsp;&nbsp; multiprocess=false initOrder=0 uid=10004 <br>&nbsp;&nbsp;&nbsp; clients=[] <br>&nbsp;&nbsp;&nbsp; externals=0 <br>&nbsp; Provider com.android.providers.media.MediaProvider <br>&nbsp;&nbsp;&nbsp; ContentProviderRecord{436e8728 com.android.providers.media.MediaProvider} <br>&nbsp;&nbsp;&nbsp; package=com.android.providers.media process=android.process.media <br>&nbsp;&nbsp;&nbsp; app=ProcessRecord{436e89e8 644:android.process.media/10003} <br>&nbsp;&nbsp;&nbsp; launchingApp=ProcessRecord{436e89e8 644:android.process.media/10003} <br>&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#61;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#46;&#99;&#111;&#110;&#116;&#101;&#110;&#116;&#46;&#67;&#111;&#110;&#116;&#101;&#110;&#116;&#80;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#80;&#114;&#111;&#120;&#121;&#64;&#52;&#51;&#53;&#102;&#102;&#54;&#51;&#56;">provider=android.content.ContentProviderProxy@435ff638</a> <br>&nbsp;&nbsp;&nbsp; name=media <br>&nbsp;&nbsp;&nbsp; isSyncable=false <br>&nbsp;&nbsp;&nbsp; multiprocess=false initOrder=0 uid=10003 <br>&nbsp;&nbsp;&nbsp; clients=[] <br>&nbsp;&nbsp;&nbsp; externals=0 <br>&nbsp; Provider com.android.providers.downloads.DownloadProvider <br>&nbsp;&nbsp;&nbsp; ContentProviderRecord{4369e808 com.android.providers.downloads.DownloadProvi <br>der} <br>&nbsp;&nbsp;&nbsp; package=com.android.providers.downloads process=android.process.media <br>&nbsp;&nbsp;&nbsp; app=ProcessRecord{436e89e8 644:android.process.media/10003} <br>&nbsp;&nbsp;&nbsp; launchingApp=null <br>&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#61;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#46;&#99;&#111;&#110;&#116;&#101;&#110;&#116;&#46;&#67;&#111;&#110;&#116;&#101;&#110;&#116;&#80;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#80;&#114;&#111;&#120;&#121;&#64;&#52;&#51;&#54;&#48;&#48;&#97;&#53;&#48;">provider=android.content.ContentProviderProxy@43600a50</a> <br>&nbsp;&nbsp;&nbsp; name=downloads <br>&nbsp;&nbsp;&nbsp; isSyncable=false <br>&nbsp;&nbsp;&nbsp; multiprocess=false initOrder=0 uid=10003 <br>&nbsp;&nbsp;&nbsp; clients=[] <br>&nbsp;&nbsp;&nbsp; externals=0 <br>&nbsp; Provider com.android.providers.telephony.MmsProvider <br>&nbsp;&nbsp;&nbsp; ContentProviderRecord{436a0f28 com.android.providers.telephony.MmsProvider} <br>&nbsp;&nbsp;&nbsp; package=com.android.providers.telephony process=com.android.phone <br>&nbsp;&nbsp;&nbsp; app=ProcessRecord{43638990 605:com.android.phone/1001} <br>&nbsp;&nbsp;&nbsp; launchingApp=null <br>&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#61;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#46;&#99;&#111;&#110;&#116;&#101;&#110;&#116;&#46;&#67;&#111;&#110;&#116;&#101;&#110;&#116;&#80;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#80;&#114;&#111;&#120;&#121;&#64;&#52;&#51;&#54;&#99;&#57;&#51;&#97;&#56;">provider=android.content.ContentProviderProxy@436c93a8</a> <br>&nbsp;&nbsp;&nbsp; name=mms <br>&nbsp;&nbsp;&nbsp; isSyncable=false <br>&nbsp;&nbsp;&nbsp; multiprocess=true initOrder=0 uid=1001 <br>&nbsp;&nbsp;&nbsp; clients=[] <br>&nbsp;&nbsp;&nbsp; externals=0 <br>&nbsp; Provider com.android.googlesearch.SuggestionProvider <br>&nbsp;&nbsp;&nbsp; ContentProviderRecord{436a24c0 com.android.googlesearch.SuggestionProvider} <br>&nbsp;&nbsp;&nbsp; package=com.android.googlesearch process=android.process.acore <br>&nbsp;&nbsp;&nbsp; app=ProcessRecord{43645bc0 608:android.process.acore/10004} <br>&nbsp;&nbsp;&nbsp; launchingApp=null <br>&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#61;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#46;&#99;&#111;&#110;&#116;&#101;&#110;&#116;&#46;&#67;&#111;&#110;&#116;&#101;&#110;&#116;&#80;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#80;&#114;&#111;&#120;&#121;&#64;&#52;&#51;&#54;&#99;&#100;&#50;&#56;&#56;">provider=android.content.ContentProviderProxy@436cd288</a> <br>&nbsp;&nbsp;&nbsp; name=com.android.googlesearch.SuggestionProvider <br>&nbsp;&nbsp;&nbsp; isSyncable=false <br>&nbsp;&nbsp;&nbsp; multiprocess=false initOrder=0 uid=10004 <br>&nbsp;&nbsp;&nbsp; clients=[] <br>&nbsp;&nbsp;&nbsp; externals=0 <br>&nbsp; Provider com.android.providers.telephony.TelephonyProvider <br>&nbsp;&nbsp;&nbsp; ContentProviderRecord{436a1030 com.android.providers.telephony.TelephonyProv <br>ider} <br>&nbsp;&nbsp;&nbsp; package=com.android.providers.telephony process=com.android.phone <br>&nbsp;&nbsp;&nbsp; app=ProcessRecord{43638990 605:com.android.phone/1001} <br>&nbsp;&nbsp;&nbsp; launchingApp=null <br>&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#61;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#46;&#99;&#111;&#110;&#116;&#101;&#110;&#116;&#46;&#67;&#111;&#110;&#116;&#101;&#110;&#116;&#80;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#80;&#114;&#111;&#120;&#121;&#64;&#52;&#51;&#54;&#99;&#57;&#57;&#56;&#56;">provider=android.content.ContentProviderProxy@436c9988</a> <br>&nbsp;&nbsp;&nbsp; name=telephony <br>&nbsp;&nbsp;&nbsp; isSyncable=false <br>&nbsp;&nbsp;&nbsp; multiprocess=true initOrder=0 uid=1001 <br>&nbsp;&nbsp;&nbsp; clients=[] <br>&nbsp;&nbsp;&nbsp; externals=0 <br>&nbsp; Provider com.android.providers.telephony.SmsProvider <br>&nbsp;&nbsp;&nbsp; ContentProviderRecord{436a1138 com.android.providers.telephony.SmsProvider} <br>&nbsp;&nbsp;&nbsp; package=com.android.providers.telephony process=com.android.phone <br>&nbsp;&nbsp;&nbsp; app=ProcessRecord{43638990 605:com.android.phone/1001} <br>&nbsp;&nbsp;&nbsp; launchingApp=null <br>&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#61;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#46;&#99;&#111;&#110;&#116;&#101;&#110;&#116;&#46;&#67;&#111;&#110;&#116;&#101;&#110;&#116;&#80;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#80;&#114;&#111;&#120;&#121;&#64;&#52;&#51;&#54;&#99;&#97;&#48;&#51;&#56;">provider=android.content.ContentProviderProxy@436ca038</a> <br>&nbsp;&nbsp;&nbsp; name=sms <br>&nbsp;&nbsp;&nbsp; isSyncable=false <br>&nbsp;&nbsp;&nbsp; multiprocess=true initOrder=0 uid=1001 <br>&nbsp;&nbsp;&nbsp; clients=[] <br>&nbsp;&nbsp;&nbsp; externals=0 <br>&nbsp; Provider com.android.phone.SimProvider <br>&nbsp;&nbsp;&nbsp; ContentProviderRecord{436a1240 com.android.phone.SimProvider} <br>&nbsp;&nbsp;&nbsp; package=com.android.phone process=com.android.phone <br>&nbsp;&nbsp;&nbsp; app=ProcessRecord{43638990 605:com.android.phone/1001} <br>&nbsp;&nbsp;&nbsp; launchingApp=null <br>&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#61;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#46;&#99;&#111;&#110;&#116;&#101;&#110;&#116;&#46;&#67;&#111;&#110;&#116;&#101;&#110;&#116;&#80;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#80;&#114;&#111;&#120;&#121;&#64;&#52;&#51;&#54;&#99;&#97;&#54;&#52;&#56;">provider=android.content.ContentProviderProxy@436ca648</a> <br>&nbsp;&nbsp;&nbsp; name=sim <br>&nbsp;&nbsp;&nbsp; isSyncable=false <br>&nbsp;&nbsp;&nbsp; multiprocess=true initOrder=0 uid=1001 <br>&nbsp;&nbsp;&nbsp; clients=[] <br>&nbsp;&nbsp;&nbsp; externals=0 <br>&nbsp; Provider com.android.alarmclock.AlarmProvider <br>&nbsp;&nbsp;&nbsp; ContentProviderRecord{4371d520 com.android.alarmclock.AlarmProvider} <br>&nbsp;&nbsp;&nbsp; package=com.android.alarmclock process=com.android.alarmclock <br>&nbsp;&nbsp;&nbsp; app=ProcessRecord{4371bad0 655:com.android.alarmclock/10000} <br>&nbsp;&nbsp;&nbsp; launchingApp=null <br>&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#61;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#46;&#99;&#111;&#110;&#116;&#101;&#110;&#116;&#46;&#67;&#111;&#110;&#116;&#101;&#110;&#116;&#80;&#114;&#111;&#118;&#105;&#100;&#101;&#114;&#80;&#114;&#111;&#120;&#121;&#64;&#52;&#51;&#53;&#101;&#50;&#99;&#49;&#48;">provider=android.content.ContentProviderProxy@435e2c10</a> <br>&nbsp;&nbsp;&nbsp; name=com.android.alarmclock <br>&nbsp;&nbsp;&nbsp; isSyncable=false <br>&nbsp;&nbsp;&nbsp; multiprocess=false initOrder=0 uid=10000 <br>&nbsp;&nbsp;&nbsp; clients=[] <br>&nbsp;&nbsp;&nbsp; externals=0 </p>
<p>Granted Uri Permissions: <br>------------------------------------------------------------------------------- <br>DUMP OF SERVICE activity.senders: <br>Intent Senders in Current Activity Manager State: <br>&nbsp; IntentSender IntentSenderRecord{435bb968 android broadcastIntent} <br>&nbsp;&nbsp;&nbsp; packageName=android type=broadcastIntent flags=0x0 <br>&nbsp;&nbsp;&nbsp; activity=null who=null <br>&nbsp;&nbsp;&nbsp; requestCode=0 requestResolvedType=null <br>&nbsp;&nbsp;&nbsp; requestIntent=Intent { action=android.content.syncmanager.SYNC_ALARM } <br>&nbsp;&nbsp;&nbsp; sent=false canceled=false <br>&nbsp; IntentSender IntentSenderRecord{4359f4e0 android broadcastIntent} <br>&nbsp;&nbsp;&nbsp; packageName=android type=broadcastIntent flags=0x0 <br>&nbsp;&nbsp;&nbsp; activity=null who=null <br>&nbsp;&nbsp;&nbsp; requestCode=0 requestResolvedType=null <br>&nbsp;&nbsp;&nbsp; requestIntent=Intent { action=android.intent.action.DATE_CHANGED } <br>&nbsp;&nbsp;&nbsp; sent=false canceled=false <br>&nbsp; IntentSender IntentSenderRecord{43638b10 android broadcastIntent} <br>&nbsp;&nbsp;&nbsp; packageName=android type=broadcastIntent flags=0x0 <br>&nbsp;&nbsp;&nbsp; activity=null who=null <br>&nbsp;&nbsp;&nbsp; requestCode=0 requestResolvedType=null <br>&nbsp;&nbsp;&nbsp; requestIntent=Intent { action=com.android.service.Watchdog.REBOOT } <br>&nbsp;&nbsp;&nbsp; sent=false canceled=false <br>&nbsp; IntentSender IntentSenderRecord{436714c0 android broadcastIntent} <br>&nbsp;&nbsp;&nbsp; packageName=android type=broadcastIntent flags=0x0 <br>&nbsp;&nbsp;&nbsp; activity=null who=null <br>&nbsp;&nbsp;&nbsp; requestCode=0 requestResolvedType=null <br>&nbsp;&nbsp;&nbsp; requestIntent=Intent { action=com.android.server.WifiManager.action.DEVICE_I <br>DLE } <br>&nbsp;&nbsp;&nbsp; sent=false canceled=false <br>&nbsp; IntentSender IntentSenderRecord{435e56d8 android broadcastIntent} <br>&nbsp;&nbsp;&nbsp; packageName=android type=broadcastIntent flags=0x0 <br>&nbsp;&nbsp;&nbsp; activity=null who=null <br>&nbsp;&nbsp;&nbsp; requestCode=0 requestResolvedType=null <br>&nbsp;&nbsp;&nbsp; requestIntent=Intent { action=android.intent.action.TIME_TICK flags=0x400000 <br>00 } <br>&nbsp;&nbsp;&nbsp; sent=true canceled=false <br>&nbsp; IntentSender IntentSenderRecord{435adb08 android broadcastIntent} <br>&nbsp;&nbsp;&nbsp; packageName=android type=broadcastIntent flags=0x0 <br>&nbsp;&nbsp;&nbsp; activity=null who=null <br>&nbsp;&nbsp;&nbsp; requestCode=0 requestResolvedType=null <br>&nbsp;&nbsp;&nbsp; requestIntent=Intent { action=android.content.syncmanager.SYNC_POLL_ALARM } <br>&nbsp;&nbsp;&nbsp; sent=true canceled=false <br>&nbsp; IntentSender IntentSenderRecord{4359edf0 android broadcastIntent} <br>&nbsp;&nbsp;&nbsp; packageName=android type=broadcastIntent flags=0x0 <br>&nbsp;&nbsp;&nbsp; activity=null who=null <br>&nbsp;&nbsp;&nbsp; requestCode=0 requestResolvedType=null <br>&nbsp;&nbsp;&nbsp; requestIntent=Intent { action=com.android.service.Watchdog.CHECKUP } <br>&nbsp;&nbsp;&nbsp; sent=false canceled=false <br>&nbsp; IntentSender IntentSenderRecord{436e3198 android broadcastIntent} <br>&nbsp;&nbsp;&nbsp; packageName=android type=broadcastIntent flags=0x0 <br>&nbsp;&nbsp;&nbsp; activity=null who=null <br>&nbsp;&nbsp;&nbsp; requestCode=0 requestResolvedType=null <br>&nbsp;&nbsp;&nbsp; requestIntent=Intent { } <br>&nbsp;&nbsp;&nbsp; sent=false canceled=false <br>------------------------------------------------------------------------------- <br>DUMP OF SERVICE activity.services: <br>Services in Current Activity Manager State: <br>------------------------------------------------------------------------------- <br>DUMP OF SERVICE alarm: <br>Current Alarm Manager state: </p>
<p>&nbsp; Realtime alarms that are scheduled: <br>&nbsp; RTC #1: <br>&nbsp;&nbsp;&nbsp; Alarm{436358a0 type 1 android} <br>&nbsp;&nbsp;&nbsp; type=1 when=1272931200000 repeatInterval=0 count=0 <br>&nbsp;&nbsp;&nbsp; operation=PendingIntent{43617020 target IntentSenderRecord{4359f4e0 android <br>broadcastIntent}} <br>&nbsp; RTC #0: <br>&nbsp;&nbsp;&nbsp; Alarm{43695080 type 1 android} <br>&nbsp;&nbsp;&nbsp; type=1 when=1272884280000 repeatInterval=0 count=0 <br>&nbsp;&nbsp;&nbsp; operation=PendingIntent{4358e9d8 target IntentSenderRecord{435e56d8 android <br>broadcastIntent}} </p>
<p>&nbsp; Elapsed realtime wakeup alarms that are scheduled: <br>&nbsp; ELAPSED_REALTIME_WAKEUP #0: <br>&nbsp;&nbsp;&nbsp; Alarm{4361e8e8 type 2 android} <br>&nbsp;&nbsp;&nbsp; type=2 when=90877805 repeatInterval=0 count=0 <br>&nbsp;&nbsp;&nbsp; operation=PendingIntent{435adc60 target IntentSenderRecord{435adb08 android <br>broadcastIntent}} </p>
<p>&nbsp; Broadcast ref count: 0 </p>
<p>&nbsp; Alarm Stats: <br>&nbsp; android <br>&nbsp;&nbsp;&nbsp; 4729ms running, 1 wakeups <br>&nbsp;&nbsp;&nbsp; 1 alarms: Intent { action=android.content.syncmanager.SYNC_POLL_ALARM flags= <br>0x4 (has extras) } <br>&nbsp;&nbsp;&nbsp; 28 alarms: Intent { action=android.intent.action.TIME_TICK flags=0x40000004 <br>(has extras) } <br>------------------------------------------------------------------------------- <br>DUMP OF SERVICE appwidget: <br>Providers: (size=3) <br>&nbsp; [0] provder=ComponentInfo{com.android.alarmclock/com.android.alarmclock.Analog <br>AppWidgetProvider} min=(146x146) updatePeriodMillis=0 initialLayout=2130903043 z <br>ombie=false <br>&nbsp; [1] provder=ComponentInfo{com.android.camera/com.android.camera.PhotoAppWidget <br>Provider} min=(146x146) updatePeriodMillis=0 initialLayout=2130903052 zombie=fal <br>se <br>&nbsp; [2] provder=ComponentInfo{com.android.music/com.android.music.MediaAppWidgetPr <br>ovider} min=(294x72) updatePeriodMillis=0 initialLayout=2130903040 zombie=false <br>AppWidgetIds: (size=1) <br>&nbsp; [0] appWidgetId=1 host=1024/com.android.launcher provider=ComponentInfo{com.an <br>droid.alarmclock/com.android.alarmclock.AnalogAppWidgetProvider} host.callbacks= <br><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#99;&#111;&#109;&#46;&#97;&#110;&#100;&#114;&#111;&#105;&#100;&#46;&#105;&#110;&#116;&#101;&#114;&#110;&#97;&#108;&#46;&#97;&#112;&#112;&#119;&#105;&#100;&#103;&#101;&#116;&#46;&#73;&#65;&#112;&#112;&#87;&#105;&#100;&#103;&#101;&#116;&#72;&#111;&#115;&#116;&#36;&#83;&#116;&#117;&#98;&#36;&#80;&#114;&#111;&#120;&#121;&#64;&#52;&#51;&#54;&#51;&#102;&#54;&#49;&#48;">com.android.internal.appwidget.IAppWidgetHost$Stub$Proxy@4363f610</a> views=android. <br><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#119;&#105;&#100;&#103;&#101;&#116;&#46;&#82;&#101;&#109;&#111;&#116;&#101;&#86;&#105;&#101;&#119;&#115;&#64;&#52;&#51;&#55;&#51;&#49;&#101;&#57;&#48;">widget.RemoteViews@43731e90</a> <br>Hosts: (size=1) <br>&nbsp; [0] packageName=com.android.launcher uid=10004 hostId=1024 callbacks=com.andro <br><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#105;&#100;&#46;&#105;&#110;&#116;&#101;&#114;&#110;&#97;&#108;&#46;&#97;&#112;&#112;&#119;&#105;&#100;&#103;&#101;&#116;&#46;&#73;&#65;&#112;&#112;&#87;&#105;&#100;&#103;&#101;&#116;&#72;&#111;&#115;&#116;&#36;&#83;&#116;&#117;&#98;&#36;&#80;&#114;&#111;&#120;&#121;&#64;&#52;&#51;&#54;&#51;&#102;&#54;&#49;&#48;">id.internal.appwidget.IAppWidgetHost$Stub$Proxy@4363f610</a> instances.size=1 zombie <br>=false <br>------------------------------------------------------------------------------- <br>DUMP OF SERVICE audio:<br>&nbsp;</p>
<p>&nbsp;</p>
<p>C:\Users\xufan&gt;adb shell ime list <br>com.android.inputmethod.latin/.LatinIME: <br>&nbsp; mId=com.android.inputmethod.latin/.LatinIME mSettingsActivityName=com.android. <br>inputmethod.latin.LatinIMESettings <br>&nbsp; mIsDefaultResId=0x7f060001 <br>&nbsp; Service: <br>&nbsp;&nbsp;&nbsp; Filter: null <br>&nbsp;&nbsp;&nbsp; priority=0 preferredOrder=0 match=0x108000 specificIndex=-1 isDefault=false <br>&nbsp;&nbsp;&nbsp; labelRes=0x0 nonLocalizedLabel=null icon=0x0 <br>&nbsp;&nbsp;&nbsp; ServiceInfo: <br>com.android.inputmethod.pinyin/.PinyinIME: <br>&nbsp; mId=com.android.inputmethod.pinyin/.PinyinIME mSettingsActivityName=com.androi <br>d.inputmethod.pinyin.SettingsActivity <br>&nbsp; mIsDefaultResId=0x7f060000 <br>&nbsp; Service: <br>&nbsp;&nbsp;&nbsp; Filter: null <br>&nbsp;&nbsp;&nbsp; priority=0 preferredOrder=0 match=0x108000 specificIndex=-1 isDefault=false <br>&nbsp;&nbsp;&nbsp; labelRes=0x0 nonLocalizedLabel=null icon=0x0 <br>&nbsp;&nbsp;&nbsp; ServiceInfo: </p>
<p>&nbsp;</p>
<p>C:\Users\xufan&gt;adb shell input <br>usage: input [text|keyevent] <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input text &lt;string&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input keyevent &lt;event_code&gt;<br></p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/117501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-06-09 22:04 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/06/09/117501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android Adb Analyse </title><link>http://www.cppblog.com/AutomateProgram/archive/2010/06/09/117500.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Wed, 09 Jun 2010 13:59:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/06/09/117500.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/117500.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/06/09/117500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/117500.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/117500.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://blog.csdn.net/wanghui_nju/archive/2010/05/27/5627672.aspx">http://blog.csdn.net/wanghui_nju/archive/2010/05/27/5627672.aspx</a><br></p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/117500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-06-09 21:59 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/06/09/117500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android adb shell 启动java程序</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/06/09/117499.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Wed, 09 Jun 2010 13:57:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/06/09/117499.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/117499.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/06/09/117499.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/117499.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/117499.html</trackback:ping><description><![CDATA[<span style="LINE-HEIGHT: 18px; FONT-FAMILY: Arial; FONT-SIZE: 12px">&nbsp;
<div style="PADDING-BOTTOM: 5px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; MARGIN-BOTTOM: 15px; PADDING-TOP: 5px">原文地址：<a href="http://www.cnblogs.com/bluespot/archive/2009/08/11/1543657.html">http://www.cnblogs.com/bluespot/archive/2009/08/11/1543657.html</a><strong style="FONT-WEIGHT: bold"><br>关键字</strong>: android am activitymanager</div>
<div style="PADDING-BOTTOM: 5px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; PADDING-TOP: 5px">进入shell&nbsp;<br>
<div style="PADDING-BOTTOM: 5px; MARGIN: 5px 0px 0px 15px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; FONT-WEIGHT: bold; PADDING-TOP: 5px">引用</div>
<div style="PADDING-BOTTOM: 3px; BACKGROUND-COLOR: #fafafa; MARGIN: 0px 5px 5px 15px; PADDING-LEFT: 3px; PADDING-RIGHT: 3px; BORDER-LEFT-COLOR: #cccccc; PADDING-TOP: 3px">C:"Documents and Settings"mawenjian&gt;adb shell</div>
<br>看一下命令的帮助&nbsp;<br>
<div style="PADDING-BOTTOM: 5px; MARGIN: 5px 0px 0px 15px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; FONT-WEIGHT: bold; PADDING-TOP: 5px">引用</div>
<div style="PADDING-BOTTOM: 3px; BACKGROUND-COLOR: #fafafa; MARGIN: 0px 5px 5px 15px; PADDING-LEFT: 3px; PADDING-RIGHT: 3px; BORDER-LEFT-COLOR: #cccccc; PADDING-TOP: 3px"><br># am -help&nbsp;<br>am -help&nbsp;<br>Error: Unknown command: -help&nbsp;<br>usage: am [start|instrument]&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; am start [-a &lt;ACTION&gt;] [-d &lt;DATA_URI&gt;] [-t &lt;MIME_TYPE&gt;]&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-c &lt;CATEGORY&gt; [-c &lt;CATEGORY&gt;] ...]&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-e &lt;EXTRA_KEY&gt; &lt;EXTRA_VALUE&gt; [-e &lt;EXTRA_KEY&gt; &lt;EXTRA_VALUE&gt; ...]&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-n &lt;COMPONENT&gt;] [-D] [&lt;URI&gt;]&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; am instrument [-e &lt;ARG_NAME&gt; &lt;ARG_VALUE&gt;] [-p &lt;PROF_FILE&gt;]&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-w] &lt;COMPONENT&gt;</div>
<br>好了,试一下启动浏览器&nbsp;<br>
<div style="PADDING-BOTTOM: 5px; MARGIN: 5px 0px 0px 15px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; FONT-WEIGHT: bold; PADDING-TOP: 5px">引用</div>
<div style="PADDING-BOTTOM: 3px; BACKGROUND-COLOR: #fafafa; MARGIN: 0px 5px 5px 15px; PADDING-LEFT: 3px; PADDING-RIGHT: 3px; BORDER-LEFT-COLOR: #cccccc; PADDING-TOP: 3px"># am start -n com.google.android.browser/com.google.android.browser.BrowserActivity&nbsp;<br>am start -n com.google.android.browser/com.google.android.browser.BrowserActivity&nbsp;<br>Starting: Intent { comp={com.google.android.browser/com.google.android.browser.BrowserActivity} }</div>
<br>ok,成功了&nbsp;<br>大家试试下面的命令吧:&nbsp;<br>
<div style="PADDING-BOTTOM: 5px; MARGIN: 5px 0px 0px 15px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; FONT-WEIGHT: bold; PADDING-TOP: 5px">引用</div>
<div style="PADDING-BOTTOM: 3px; BACKGROUND-COLOR: #fafafa; MARGIN: 0px 5px 5px 15px; PADDING-LEFT: 3px; PADDING-RIGHT: 3px; BORDER-LEFT-COLOR: #cccccc; PADDING-TOP: 3px"><br># am start -a android.intent.action.VIEW -d http://mwjian.javaeye.com&nbsp;<br>am start -a android.intent.action.VIEW -d http://mwjian.javaeye.com&nbsp;<br>Starting: Intent { action=android.intent.action.VIEW data=http://mwjian.javaeye.com }&nbsp;<br><br># am start -a android.intent.action.CALL -d tel:88888888&nbsp;<br>am start -a android.intent.action.CALL -d tel:88888888&nbsp;<br>Starting: Intent { action=android.intent.action.CALL data=tel:88888888 }&nbsp;<br><br># am start -a android.intent.action.ALL_APPS&nbsp;<br>am start -a android.intent.action.ALL_APPS&nbsp;<br>Starting: Intent { action=android.intent.action.ALL_APPS }&nbsp;<br><br># am start -a android.intent.action.VIEW geo:0,0?q=shanghai&nbsp;<br>am start -a android.intent.action.VIEW geo:0,0?q=shanghai&nbsp;<br>Starting: Intent { action=android.intent.action.VIEW data=geo:0,0?q=shanghai }<br><br><br>我具体用模拟器试的 时候是这样的指令：<br><br>adb shell am start -n com.android.browser/.BrowserActivity启动浏览器的，可能模拟器和真机的组件不一样！<br></div>
</div>
</span>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/117499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-06-09 21:57 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/06/09/117499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android ps 命令执行后各项值的含义</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/06/09/117498.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Wed, 09 Jun 2010 13:55:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/06/09/117498.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/117498.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/06/09/117498.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/117498.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/117498.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 12pt">原文地址：<a href="http://blog.csdn.net/miaouu/archive/2010/04/14/5484355.aspx">http://blog.csdn.net/miaouu/archive/2010/04/14/5484355.aspx</a><br><br><a onmousedown="return clk(0,'','','','3','','0CA4QFjAC')" href="http://iceskysl.1sters.com/?p=11" target=_blank>PS命令查看进程详细参数</a><br></p>
<p style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; android ps 命令执行完后，会有下列各项值：&#8220;USER&nbsp;&nbsp;PID&nbsp; PPID&nbsp; VSIZE&nbsp; RSS&nbsp;&nbsp;WCHAN&nbsp;&nbsp;PC&nbsp; NAME&#8221;，代表的意思分别是：</p>
<p style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; VSIZE：进程的虚拟内存大小；<br>&nbsp;&nbsp;&nbsp; RSS：&nbsp;&nbsp; 进程分配到得物理内存大小；<br>&nbsp;&nbsp;&nbsp; WCHAN：address of the kernel function where the process is sleeping，Running tasks will display (0) in this column.<br>&nbsp;&nbsp;&nbsp; 其他的再说。</p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/117498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-06-09 21:55 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/06/09/117498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android的调试原理</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/06/08/117404.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Tue, 08 Jun 2010 10:28:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/06/08/117404.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/117404.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/06/08/117404.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/117404.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/117404.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://hi.baidu.com/chocolly/blog/item/91d68f99210abc006f068c63.html/cmtid/b11822ce4bfae234b700c84d">http://hi.baidu.com/chocolly/blog/item/91d68f99210abc006f068c63.html/cmtid/b11822ce4bfae234b700c84d</a><br>/* 今天学习了用Eclipse 来调试Android的代码，首次使用，可能有的问题很基本，有问题请指出，交流嘛:) */<br>(笔记中提到的Emulator也可以理解成Device)<br>一、adb的介绍: <br>adb(Android Debug Bridge)包括三个部分：<br>1)adb client, 运行在PC上（为DDMS，即IDE工作）<br>2)adb daemon(守护进程), 运行于Emulator（为与Emulator中的VM交互工作）；<br>3)adb server(服务进程), 运行在PC（任务管理器上有），管理着adb client和adb daemon的通信.server与client通信的端口是是5037,<br>adb server会与emulator交互的，使用的端口有两个，一个是5554专门用于与Emulator实例的连接，那么数据可以从Emulator转发给IDE控制台了，另一个则是5555，专门与adb daemon连接为后面调试使用。<br><br>PS:Emulator/Device占用两个（一组）端口,一个为偶数的5554，一个奇数的5555。<br>如果还开启其他的Emulator，则使用的另一组端口是5556,5557，一直到5585.<br>adb server开启时就是通过查找5555-5585之间端口来建立与模拟器的连接的，建立连接后就可以用adb的相关命令了。<br>如果您安装了ADT就基本不需要adb的命令了（因为DDMS会调用ADB进行透明操作）<br><br>关于本机的端口使用情况可以使用netstat [-a] [-n]来查询验证一下。<br><br>二、观察一组数据：<br>1,在开启仿真器时有一些打印：<br>[2009-06-06 14:04:16 - Helloworld] Android Launch!<br>[2009-06-06 14:04:17 - Helloworld] adb is running normally.<br>[2009-06-06 14:04:17 - Helloworld] Performing com.android.hello.Helloworld activity launch<br>[2009-06-06 14:04:17 - Helloworld] Automatic Target Mode: Preferred AVD 'lab' is not available. Launching new emulator.<br>[2009-06-06 14:04:17 - Helloworld] Launching a new emulator with Virtual Device 'lab'<br>[2009-06-06 14:04:24 - Helloworld] New emulator found: emulator-5554<br>[2009-06-06 14:04:24 - Helloworld] Waiting for HOME ('android.process.acore') to be launched...<br>[2009-06-06 14:05:45 - Helloworld] HOME is up on device 'emulator-5554'<br>[2009-06-06 14:05:45 - Helloworld] Uploading Helloworld.apk onto device 'emulator-5554'<br>[2009-06-06 14:05:45 - Helloworld] Installing Helloworld.apk...<br>每一行都基本表示一个命令在执行，emulator-5554是仿真器的初始端口了。<br>最后一句等于命令：adb -s emulator-5554 install helloworld.apk<br>如果报了类似以下的错误，那得（加个-r）重装，因为该App已经在该Emulator下运行了<br>DDM dispatch reg wait timeout<br>Can't dispatch DDM chunk 52454151: no handler defined<br>Can't dispatch DDM chunk 48454c4f: no handler defined<br>网上没有看到这个错误因此顺便提下解决方法：adb -s emulator-5554 install -r helloworld.apk<br><br>三,了解下DDMS:(都是adb的命令相当的功能)<br>DDMS有几个界面：<br>1)Devices：可以查看到当前运行的Emulator和其内运行的应用<br>2)Emulator control，即仿真器的硬件设置项等：<br>&nbsp;&nbsp; 设置当前注册的网络状态（Home,Roaming,UnRegistered,Searching）<br>&nbsp;&nbsp; 数据业务的速度设置：有GSM,GPRS,EDGE,UMTS,HSDPA(3.5G?)<br>&nbsp;&nbsp; 还有载入KML或NMEA文件来模拟GPS数据<br>3)还可以查询Threads,Heap,File Explorer、重启adb,抓屏等，其他都是在调用adb。<br><br>4)关于Logcat<br>从Windows-&gt;Prereference-&gt;android-&gt;DDMS-&gt;Loggin Level进行设置打印等级，<br>不过默认下只打印入口线程的信息，射频和Tapi的动作信息要通过adb Logcat -b radio打开,<br>os-events相关的打印通过adb logcat -b events.打开，<br>Log默认被写入到手机的/data/anr/traces.txt文件中。<br><br>四，Debug面板<br>这个面板对于熟悉Eclipse的用户来说应该不用看了。<br>通过以下三步将自己的应用或将已经跑起来的应用加入调试列表：<br>1)选择Devices列表中Your app,<br>2)选择臭虫按钮将该程序加载进调试状态<br>3)OK,加断点吧。不过源代码要最新的否则断点不起作用。<br><br>五、DDMS如何让IDE的调试工作起来呢？<br>1)有几个组成:<br>一个是adb(Android Debug Bridge)参考第一部分，它起到调试桥的作用；<br><br>另一类是运行在Device/Emulator端的adb daemon, VM, debugger, your Applicatioin，<br>通过下面句话就可以理解它们的关系：<br>一个App跑在一个进程中，这个进程又被一个VM绑定，都是一对一的，但VM与Emulator显然是多对一的，<br>那调试时debugger从VM中拿到栈线程进程等信息，而daemon的作用仅仅是被DDMS用于建立一条连接（看下面）。<br><br>最后一类则是运行在PC上的DDMS debugger；<br>这个debugger是IDE的调试器，你可以改成另一个调试器；<br>DDMS是Dalvik Debug Monitor Service，负责建立调试的作用，它仅有两个Service，其他的功能都是通过ADB client.让IDE与Emulator交互起来的。<br><br>2)开启IDE时，DDMS会建立一个Device monitoring service用于监控Emulator,因为可以开启多个Emulator嘛；<br>如果找到一个Emulator，那么DDMS才会再开启另一个Service叫VM Monitoring Sevice用于监控该Emulator下的VM； 第一部分提到adb有三个部分，其中的adb client可以多个实例的，DDMS的Service通过从ADB Client与ADb server的交互结果来维护自身的数据。<br><br>如果VM Monitor找到Emulator的一个VM，那么DDMS会利用ADB获取目标VM的进程ID, <br>同时通过client与daemon建立起与vm的debugger的新连接，注意新连接的交互端口是从8600开始的（n个的话端口是8659+n）,这条新连接可以让DDMS获得与VM的实际交互。<br><br>剩下的就是DDMS把拿到的数据再扔给ide 的 debugger(它们之间默认通过8700端口，可更改，因为与VM的交互端口从8600开始使用的话可能会不够的)，<br>这样IDE的Debug视图就能正确工作了.</p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/117404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-06-08 18:28 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/06/08/117404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rom版本 固件 Radio SPL Recovery 的概念</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/06/02/116970.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Wed, 02 Jun 2010 01:21:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/06/02/116970.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/116970.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/06/02/116970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/116970.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/116970.html</trackback:ping><description><![CDATA[如果Android要出一本书，对于菜鸟们，最最需要传授的就是这几个频繁出现的关键字！<br><br>Rom版本还是能明白是啥意思的，可这 <font color=#ff0000><strong>固件</strong> </font><font color=#000000>到底是个啥概念呢？要怎么样去理解它？</font><br><font color=#000000>我把Radio，Rom，固件和SPL还有Recovery这几个关键字在论坛上搜索了下，结合了</font><br><font color=#000000>诸位热心机友的回复，整理了下对它们的理解，也作为自己的学习笔记：</font><br><br><font color=#000000>1、Radio和Rom：</font><br><font color=#000000><font color=#444444>Radio简单的说是无线通信模块的驱动程序，ROM是系统程序。Radio</font></font><font color=#000000><font color=#444444>负责网络通信，</font></font><br><font color=#000000><font color=#444444>ROM和Radio可以分开刷，互不影响。如果你的<a href="http://product.cnmo.com/" target=_blank><u><font color=#0066cc>手机</font></u></a>刷新了ROM后有通</font></font><font color=#000000><font color=#444444>讯方面的问题</font></font><br><font color=#000000><font color=#444444>可以刷新RADIO试一试</font></font><br><br>2、固件：<br><strong><font color=#ff0000>固件</font></strong>版本指的是系统内核本版，就好像：XP系统和WIN7系统采用的内核不一样。目<br>前的固件版本应该就是有：1.5内核，1.6内核，2.0内核以及2.1内核吧。阿兴的版本<br>指得是在1.6内核下的ROM版本，就好像是：XP雨林木风纯净版或XP番茄版。所以，<br>阿兴ROM的全程都应该是1.6内核。如：阿兴编译3.10版或者XXX内核阿兴编译XX版。<br>呵呵，应该是这样了。<br><br>3、什么是SPL<br>①.IPL 英文全称是 InitialProgramLoader ,负责主板，电源、硬件初始化程序、并把 SPL 装入 RAM 。IPL 损坏了可把手机扔进河里,或者通过换字库来解决.<br>②.SPL 英文全称是 SecondProgramLoader ,&#8220;第二次系统装载&#8221;，就是负责装载 OS 操作系统到 RAM 中。另外 SPL 还包括许多系统命令，如 mtty 中使用的命令等。 SPL 损坏了还可以用烧录器重写。<br>SPL 一般提供这几部分功能：检测手机硬件、寻找系统启动分区、启动操作系统为系统的基本维护提供操作界面，可以通过数据线与操作终端（如 PC ）建立连接，并接受和执行相应命令。它里面包含许多命令，像 r2sd,l,doctest (危险命令，他会擦除 gsmdata )等。我们常说的三色屏就是由 SPL 驱动的。检测 SD 卡，当你把一些特殊制作的 SD 卡插入后，SPL 可以在启动时校验并根据 SD 卡内容刷机或执行一些命令。这有点类似于 PC 的从软驱启动。<br><br>4、什么是Recovery，有什么用？<br>Recovery应该算是一种模式，理解Recovery，只要理解了Recovery是干嘛用的就可以很快明白了。<br>Android系统可以利用<strong><font color=#ff0000>Recovery</font></strong>模式，进行恢复出厂设置，OTA升级，patch升级及firmware<font color=#ff0000>（硬件上面的嵌入式程序）</font>升级等等。<br><br>简言之：<br><font color=#000000>Radio是负责无线网络通讯的功能模块；</font><br><font color=#000000>Rom相当于电脑上的操作系统；</font><br><font color=#000000>固件则是操作系统采用的内核（Win7，Xp，Win98）；</font><br><font color=#000000>SPL主要负责Rom系统的装载导入，更多的是在负责硬件方面的操作；</font><br><font color=#000000>Recovery模式可以用来备份操作系统，也可以用来升级操作系统以及恢复操作系统的缺省配置。</font>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/116970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-06-02 09:21 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/06/02/116970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>emulator: ERROR: system image file too large for device's hardware configuration (74 MB &gt; 72 MB). 问题</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/05/26/116421.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Wed, 26 May 2010 14:41:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/05/26/116421.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/116421.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/05/26/116421.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/116421.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/116421.html</trackback:ping><description><![CDATA[运行模拟器时出现以下问题 emulator: ERROR: system image file too large for device's hardware configuration (74 MB &gt; 72 MB). 一看就知道应该是硬件缓存啊什么的设置的默认值达不到出了2.1所需要的最低要求 GOOGLE了一下，说要通过命令的形式进行emulator CSDN上找了找，结果如下 在C:\Documents and Settings\Administrator\.android\avd\AndroidAVD2.0.1.avd下找到config.ini，在该文件中加入&#8220;disk.systemPartition.size=96MB&#8221;（96MB什么的应该是随便设置的吧，只要你电脑吃得消）重启
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/116421.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-05-26 22:41 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/05/26/116421.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse里的智能提示（转）</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/05/17/115619.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Mon, 17 May 2010 10:33:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/05/17/115619.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/115619.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/05/17/115619.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/115619.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/115619.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://blog.csdn.net/daizhenbest/archive/2007/02/14/1509708.aspx">http://blog.csdn.net/daizhenbest/archive/2007/02/14/1509708.aspx</a><br><br>Eclipse 3.1里的智能提示功能对于写JAVA程序又不记得类名和函数的人来说是一个很好的助手工具，但是Eclipse里的智能提示的快捷键是Ctrl+Space，在中文Windows操作系统中它确是切换中英文输入的快捷键。这就造成了两者的冲突，导致此功能在Eclipse下不能正常使用。<br>&nbsp;<br>解决方法有两个：<br>&nbsp;<br>1、改了中英文输入切换快捷键；<br>&nbsp;<br>2、在Eclipse -&gt; Window -&gt; Preferences菜单对话框选General -&gt; Keys，在右侧view列表框里找到Edit(Category), Content Assist (Command) Ctrl+Space(Key sequences)一行，将对应的快捷键改成你想要的快捷键。 <br><br>3.将when设置为Edit Text</p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/115619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-05-17 18:33 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/05/17/115619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android中读取联系人和通话记录</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/05/14/115340.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Fri, 14 May 2010 02:08:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/05/14/115340.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/115340.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/05/14/115340.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/115340.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/115340.html</trackback:ping><description><![CDATA[<p>android 中获取联系人</p>
<p>ContentResolver cr = getContentResolver();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(cursor.moveToNext()){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//get name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;int nameFiledColumnIndex = cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;String contact = cursor.getString(nameFiledColumnIndex);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] PHONES_PROJECTION = new String[] {&nbsp;"_id","display_name","data1","data3"};//<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String contactId = cursor.getString(cursor.getColumnIndex(PhoneLookup._ID));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, PHONES_PROJECTION, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null, null);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //name type .. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(phone.moveToNext()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;int i = phone.getInt(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;String str = phone.getString(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;str = phone.getString(2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;str = phone.getString(3);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phone.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //addr<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cursor addrCur = cr.query(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI ,<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;new String[]{"_id","data1","data2","data3"}, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId , null, null);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(addrCur.moveToNext()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;int i = addrCur.getInt(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;String str = addrCur.getString(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;str = addrCur.getString(2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;str = addrCur.getString(3);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addrCur.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //email<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI ,<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;new String[]{"_id","data1","data2","data3"}, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId , null, null);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(emailCur.moveToNext()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;int i = emailCur.getInt(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;String str = emailCur.getString(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;str = emailCur.getString(2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;str = emailCur.getString(3);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emailCur.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cursor.close();</p>
<p>android中获取通话记录<br>String str = "";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int type;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long callTime;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date date;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String time= "";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ContentResolver cr = getContentResolver();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Cursor cursor = cr.query(CallLog.Calls.CONTENT_URI, new String[]{CallLog.Calls.NUMBER,CallLog.Calls.CACHED_NAME,CallLog.Calls.TYPE, CallLog.Calls.DATE}, null, null,CallLog.Calls.DEFAULT_SORT_ORDER);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; cursor.getCount(); i++) {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cursor.moveToPosition(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; str = cursor.getString(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; str = cursor.getString(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; type = cursor.getInt(2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SimpleDateFormat sfd = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; date = new Date(Long.parseLong(cursor.getString(3)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; time = sfd.format(date);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }</p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/115340.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-05-14 10:08 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/05/14/115340.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android Intent Action 大全（转）</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/05/11/115092.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Tue, 11 May 2010 03:44:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/05/11/115092.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/115092.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/05/11/115092.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/115092.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/115092.html</trackback:ping><description><![CDATA[<span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="LINE-HEIGHT: 21px; FONT-FAMILY: arial; FONT-SIZE: 14px" class=Apple-style-span>
<table style="BORDER-COLLAPSE: collapse; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px">
    <tbody>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">ADD_SHORTCUT_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：在系统中添加一个快捷方式。.</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.ADD_SHORTCUT"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">ALL_APPS_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：列举所有可用的应用。<br>输入：无。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.ALL_APPS"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">ALTERNATIVE_CATEGORY</td>
            <td style="WORD-WRAP: break-word">类别：说明 activity 是用户正在浏览的数据的一个可选操作。</td>
            <td style="WORD-WRAP: break-word">"android.intent.category.ALTERNATIVE"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">ANSWER_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：处理拨入的电话。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.ANSWER"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">BATTERY_CHANGED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：充电状态，或者电池的电量发生变化。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.BATTERY_CHANGED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">BOOT_COMPLETED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：在系统启动后，这个动作被广播一次（只有一次）。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.BOOT_COMPLETED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">BROWSABLE_CATEGORY</td>
            <td style="WORD-WRAP: break-word">类别：能够被浏览器安全使用的 activities 必须支持这个类别。</td>
            <td style="WORD-WRAP: break-word">"android.intent.category.BROWSABLE"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">BUG_REPORT_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：显示 activity 报告错误。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.BUG_REPORT"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">CALL_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：拨打电话，被呼叫的联系人在数据中指定。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.CALL"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">CALL_FORWARDING_STATE_CHANGED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：语音电话的呼叫转移状态已经改变。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.CFF"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">CLEAR_CREDENTIALS_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：清除登陆凭证 (credential)。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.CLEAR_CREDENTIALS"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">CONFIGURATION_CHANGED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：设备的配置信息已经改变，参见 Resources.Configuration.</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.CONFIGURATION_CHANGED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">Creator</td>
            <td style="WORD-WRAP: break-word">CREATOR</td>
            <td style="WORD-WRAP: break-word">无</td>
            <td style="WORD-WRAP: break-word">无</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">DATA_ACTIVITY_STATE_CHANGED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：电话的数据活动(data activity)状态（即收发数据的状态）已经改变。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.DATA_ACTIVITY"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">DATA_CONNECTION_STATE_CHANGED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：电话的数据连接状态已经改变。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.DATA_STATE"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">DATE_CHANGED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：日期被改变。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.DATE_CHANGED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">DEFAULT_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：和 VIEW_ACTION 相同，是在数据上执行的标准动作。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.VIEW"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">DEFAULT_CATEGORY</td>
            <td style="WORD-WRAP: break-word">类别：如果 activity 是对数据执行确省动作（点击, center press）的一个选项，需要设置这个类别。</td>
            <td style="WORD-WRAP: break-word">"android.intent.category.DEFAULT"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">DELETE_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：从容器中删除给定的数据。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.DELETE"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">DEVELOPMENT_PREFERENCE_CATEGORY</td>
            <td style="WORD-WRAP: break-word">类别：说明 activity 是一个设置面板 (development preference panel).</td>
            <td style="WORD-WRAP: break-word">"android.intent.category.DEVELOPMENT_PREFERENCE"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">DIAL_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：拨打数据中指定的电话号码。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.DIAL"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">EDIT_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：为制定的数据显示可编辑界面。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.EDIT"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">EMBED_CATEGORY</td>
            <td style="WORD-WRAP: break-word">类别：能够在上级（父）activity 中运行。</td>
            <td style="WORD-WRAP: break-word">"android.intent.category.EMBED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">EMERGENCY_DIAL_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：拨打紧急电话号码。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.EMERGENCY_DIAL"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">int</td>
            <td style="WORD-WRAP: break-word">FORWARD_RESULT_LAUNCH</td>
            <td style="WORD-WRAP: break-word">启动标记：如果这个标记被设置，而且被一个已经存在的 activity 用来启动新的 activity，已有 activity 的回复目标 (reply target) 会被转移给新的 activity。</td>
            <td style="WORD-WRAP: break-word">16 0x00000010</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">FOTA_CANCEL_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：取消所有被挂起的 (pending) 更新下载。</td>
            <td style="WORD-WRAP: break-word">"android.server.checkin.FOTA_CANCEL"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">FOTA_INSTALL_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：更新已经被确认，马上就要开始安装。</td>
            <td style="WORD-WRAP: break-word">"android.server.checkin.FOTA_INSTALL"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">FOTA_READY_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：更新已经被下载，可以开始安装。</td>
            <td style="WORD-WRAP: break-word">"android.server.checkin.FOTA_READY"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">FOTA_RESTART_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：恢复已经停止的更新下载。</td>
            <td style="WORD-WRAP: break-word">"android.server.checkin.FOTA_RESTART"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">FOTA_UPDATE_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：通过 OTA 下载并安装操作系统更新。</td>
            <td style="WORD-WRAP: break-word">"android.server.checkin.FOTA_UPDATE"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">FRAMEWORK_INSTRUMENTATION_TEST_CATEGORY</td>
            <td style="WORD-WRAP: break-word">类别：To be used as code under test for framework instrumentation tests.</td>
            <td style="WORD-WRAP: break-word">"android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">GADGET_CATEGORY</td>
            <td style="WORD-WRAP: break-word">类别：这个 activity 可以被嵌入宿主 activity (activity that is hosting gadgets)。</td>
            <td style="WORD-WRAP: break-word">"android.intent.category.GADGET"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">GET_CONTENT_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：让用户选择数据并返回。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.GET_CONTENT"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">HOME_CATEGORY</td>
            <td style="WORD-WRAP: break-word">类别：主屏幕 (activity)，设备启动后显示的第一个 activity。</td>
            <td style="WORD-WRAP: break-word">"android.intent.category.HOME"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">INSERT_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：在容器中插入一个空项 (item)。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.INSERT"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">INTENT_EXTRA</td>
            <td style="WORD-WRAP: break-word">附加数据：和 PICK_ACTIVITY_ACTION 一起使用时，说明用户选择的用来显示的 activity；和 ADD_SHORTCUT_ACTION 一起使用的时候，描述要添加的快捷方式。</td>
            <td style="WORD-WRAP: break-word">"android.intent.extra.INTENT"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">LABEL_EXTRA</td>
            <td style="WORD-WRAP: break-word">附加数据：大写字母开头的字符标签，和 ADD_SHORTCUT_ACTION 一起使用。</td>
            <td style="WORD-WRAP: break-word">"android.intent.extra.LABEL"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">LAUNCHER_CATEGORY</td>
            <td style="WORD-WRAP: break-word">类别：Activity 应该被显示在顶级的 launcher 中。</td>
            <td style="WORD-WRAP: break-word">"android.intent.category.LAUNCHER"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">LOGIN_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：获取登录凭证。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.LOGIN"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">MAIN_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：作为主入口点启动，不需要数据。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.MAIN"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">MEDIABUTTON_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：用户按下了&#8220;Media Button&#8221;。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.MEDIABUTTON"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">MEDIA_BAD_REMOVAL_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：扩展介质（扩展卡）已经从 SD 卡插槽拔出，但是挂载点 (mount point) 还没解除 (unmount)。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.MEDIA_BAD_REMOVAL"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">MEDIA_EJECT_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：用户想要移除扩展介质（拔掉扩展卡）。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.MEDIA_EJECT"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">MEDIA_MOUNTED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：扩展介质被插入，而且已经被挂载。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.MEDIA_MOUNTED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">MEDIA_REMOVED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：扩展介质被移除。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.MEDIA_REMOVED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">MEDIA_SCANNER_FINISHED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：已经扫描完介质的一个目录。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.MEDIA_SCANNER_FINISHED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">MEDIA_SCANNER_STARTED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：开始扫描介质的一个目录。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.MEDIA_SCANNER_STARTED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">MEDIA_SHARED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：扩展介质的挂载被解除 (unmount)，因为它已经作为 USB 大容量存储被共享。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.MEDIA_SHARED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">MEDIA_UNMOUNTED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：扩展介质存在，但是还没有被挂载 (mount)。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.MEDIA_UNMOUNTED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">MESSAGE_WAITING_STATE_CHANGED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：电话的消息等待（语音邮件）状态已经改变。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.MWI"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">int</td>
            <td style="WORD-WRAP: break-word">MULTIPLE_TASK_LAUNCH</td>
            <td style="WORD-WRAP: break-word">启动标记：和 NEW_TASK_LAUNCH 联合使用，禁止将已有的任务改变为前景任务 (foreground)。</td>
            <td style="WORD-WRAP: break-word">8 0x00000008</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">NETWORK_TICKLE_RECEIVED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：设备收到了新的网络 "tickle" 通知。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.NETWORK_TICKLE_RECEIVED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">int</td>
            <td style="WORD-WRAP: break-word">NEW_TASK_LAUNCH</td>
            <td style="WORD-WRAP: break-word">启动标记：设置以后，activity 将成为历史堆栈中的第一个新任务（栈顶）。</td>
            <td style="WORD-WRAP: break-word">4 0x00000004</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">int</td>
            <td style="WORD-WRAP: break-word">NO_HISTORY_LAUNCH</td>
            <td style="WORD-WRAP: break-word">启动标记：设置以后，新的 activity 不会被保存在历史堆栈中。</td>
            <td style="WORD-WRAP: break-word">1 0x00000001</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">PACKAGE_ADDED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：设备上新安装了一个应用程序包。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.PACKAGE_ADDED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">PACKAGE_REMOVED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：设备上删除了一个应用程序包。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.PACKAGE_REMOVED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">PHONE_STATE_CHANGED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：电话状态已经改变。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.PHONE_STATE"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">PICK_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：从数据中选择一个项目 (item)，将被选中的项目返回。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.PICK"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">PICK_ACTIVITY_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：选择一个 activity，返回被选择的 activity 的类（名）。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.PICK_ACTIVITY"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">PREFERENCE_CATEGORY</td>
            <td style="WORD-WRAP: break-word">类别：activity是一个设置面板 (preference panel)。</td>
            <td style="WORD-WRAP: break-word">"android.intent.category.PREFERENCE"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">PROVIDER_CHANGED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：更新将要（真正）被安装。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.PROVIDER_CHANGED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">PROVISIONING_CHECK_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：要求 polling of provisioning service 下载最新的设置。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.PROVISIONING_CHECK"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">RUN_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：运行数据（指定的应用），无论它（应用）是什么。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.RUN"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">SAMPLE_CODE_CATEGORY</td>
            <td style="WORD-WRAP: break-word">类别：To be used as an sample code example (not part of the normal user experience).</td>
            <td style="WORD-WRAP: break-word">"android.intent.category.SAMPLE_CODE"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">SCREEN_OFF_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：屏幕被关闭。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.SCREEN_OFF"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">SCREEN_ON_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：屏幕已经被打开。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.SCREEN_ON"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">SELECTED_ALTERNATIVE_CATEGORY</td>
            <td style="WORD-WRAP: break-word">类别：对于被用户选中的数据，activity 是它的一个可选操作。</td>
            <td style="WORD-WRAP: break-word">"android.intent.category.SELECTED_ALTERNATIVE"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">SENDTO_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：向 data 指定的接收者发送一个消息。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.SENDTO"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">SERVICE_STATE_CHANGED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：电话服务的状态已经改变。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.SERVICE_STATE"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">SETTINGS_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：显示系统设置。输入：无。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.SETTINGS"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">SIGNAL_STRENGTH_CHANGED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：电话的信号强度已经改变。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.SIG_STR"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">int</td>
            <td style="WORD-WRAP: break-word">SINGLE_TOP_LAUNCH</td>
            <td style="WORD-WRAP: break-word">启动标记：设置以后，如果 activity 已经启动，而且位于历史堆栈的顶端，将不再启动（不重新启动） activity。</td>
            <td style="WORD-WRAP: break-word">2 0x00000002</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">STATISTICS_REPORT_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：要求 receivers 报告自己的统计信息。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.STATISTICS_REPORT"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">STATISTICS_STATE_CHANGED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：统计信息服务的状态已经改变。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.STATISTICS_STATE_CHANGED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">SYNC_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：执行数据同步。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.SYNC"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">TAB_CATEGORY</td>
            <td style="WORD-WRAP: break-word">类别：这个 activity 应该在 TabActivity 中作为一个 tab 使用。</td>
            <td style="WORD-WRAP: break-word">"android.intent.category.TAB"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">TEMPLATE_EXTRA</td>
            <td style="WORD-WRAP: break-word">附加数据：新记录的初始化模板。</td>
            <td style="WORD-WRAP: break-word">"android.intent.extra.TEMPLATE"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">TEST_CATEGORY</td>
            <td style="WORD-WRAP: break-word">类别：作为测试目的使用，不是正常的用户体验的一部分。</td>
            <td style="WORD-WRAP: break-word">"android.intent.category.TEST"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">TIMEZONE_CHANGED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：时区已经改变。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.TIMEZONE_CHANGED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">TIME_CHANGED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：时间已经改变（重新设置）。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.TIME_SET"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">TIME_TICK_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：当前时间已经变化（正常的时间流逝）。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.TIME_TICK"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">UMS_CONNECTED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：设备进入 USB 大容量存储模式。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.UMS_CONNECTED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">UMS_DISCONNECTED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：设备从 USB 大容量存储模式退出。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.UMS_DISCONNECTED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">UNIT_TEST_CATEGORY</td>
            <td style="WORD-WRAP: break-word">类别：应该被用作单元测试（通过 test harness 运行）。</td>
            <td style="WORD-WRAP: break-word">"android.intent.category.UNIT_TEST"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">VIEW_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：向用户显示数据。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.VIEW"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">WALLPAPER_CATEGORY</td>
            <td style="WORD-WRAP: break-word">类别：这个 activity 能过为设备设置墙纸。</td>
            <td style="WORD-WRAP: break-word">"android.intent.category.WALLPAPER"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">WALLPAPER_CHANGED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：系统的墙纸已经改变。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.WALLPAPER_CHANGED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">WALLPAPER_SETTINGS_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：显示选择墙纸的设置界面。输入：无。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.WALLPAPER_SETTINGS"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">WEB_SEARCH_ACTION</td>
            <td style="WORD-WRAP: break-word">动作：执行 web 搜索。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.WEB_SEARCH"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">XMPP_CONNECTED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：XMPP 连接已经被建立。</td>
            <td style="WORD-WRAP: break-word">"android.intent.action.XMPP_CONNECTED"</td>
        </tr>
        <tr>
            <td style="WORD-WRAP: break-word">String</td>
            <td style="WORD-WRAP: break-word">XMPP_DISCONNECTED_ACTION</td>
            <td style="WORD-WRAP: break-word">广播：XMPP 连接已经被断开。</td>
        </tr>
    </tbody>
</table>
</span></span><a href="file:///E:/Android%20study/android-sdk-windows/docs/reference/android/content/Intent.html">
<p style="FONT-FAMILY: Comic Sans MS; FONT-SIZE: 8pt"><br><span style="FONT-SIZE: 14pt">原文地址：</span></a><a href="http://apps.hi.baidu.com/share/detail/4516043"><span style="FONT-SIZE: 14pt">http://apps.hi.baidu.com/share/detail/4516043</span></a><a href="file:///E:/Android%20study/android-sdk-windows/docs/reference/android/content/Intent.html"><br><span style="FONT-SIZE: 14pt">文档在：<br>file:///E:/Android%20study/android-sdk-windows/docs/reference/android/content/Intent.html</span></a> </p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/115092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-05-11 11:44 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/05/11/115092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android中开机自动运行程序（转）</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/05/11/115077.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Tue, 11 May 2010 02:18:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/05/11/115077.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/115077.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/05/11/115077.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/115077.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/115077.html</trackback:ping><description><![CDATA[原文地址：<a href="http://yueguc.javaeye.com/blog/620410">http://yueguc.javaeye.com/blog/620410</a><br>背景知识：当Android启动时，会发出一个系统广播，内容为ACTION_BOOT_COMPLETED，它的字符串常量表示为 android.intent.action.BOOT_COMPLETED。只要在程序中&#8220;捕捉&#8221;到这个消息，再启动之即可。记住，Android框架说：Don't call me, I'll call you back。我们要做的是做好接收这个消息的准备，而实现的手段就是实现一个BroadcastReceiver。 <br><br>代码解析： <br><br>1、界面Activity：SayHello.java <br><br>package com.ghstudio.BootStartDemo; <br><br>import android.app.Activity; <br>import android.os.Bundle; <br>import android.widget.TextView; <br><br>public class SayHello extends Activity { <br><br>&nbsp;&nbsp;&nbsp; @Override <br>&nbsp;&nbsp;&nbsp; public void onCreate(Bundle savedInstanceState) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.onCreate(savedInstanceState); <br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextView tv = new TextView(this); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tv.setText("Hello. I started!"); <br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setContentView(tv); <br>&nbsp;&nbsp;&nbsp; } <br>} <br><br>这段代码很简单，当Activity启动时，创建一个TextView，用它显示"Hello. I started!"字样。 <br><br>2、接收广播消息：BootBroadcastReceiver.java <br><br>package com.ghstudio.BootStartDemo; <br><br>import android.content.BroadcastReceiver; <br>import android.content.Context; <br>import android.content.Intent; <br><br>public class BootBroadcastReceiver extends BroadcastReceiver { <br><br>static final String ACTION = "android.intent.action.BOOT_COMPLETED"; <br><br>@Override <br>public void onReceive(Context context, Intent intent) { <br>&nbsp; <br>&nbsp; if (intent.getAction().equals(ACTION)){ <br>&nbsp;&nbsp; Intent sayHelloIntent=new Intent(context,SayHello.class); <br>&nbsp;&nbsp; sayHelloIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); <br><br>&nbsp;&nbsp; context.startActivity(sayHelloIntent); <br>&nbsp; } <br>} <br><br>} <br><br>该类派生自BroadcastReceiver，覆载方法onReceive中，检测接收到的Intent是否符合BOOT_COMPLETED，如果符合，则启动SayHello那个Activity。 <br><br>3、配置文件：AndroidManifest.xml <br><br>&lt;?xml version="1.0" encoding="utf-8"?&gt; <br>&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; package="com.ghstudio.BootStartDemo" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android:versionCode="1" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android:versionName="1.0"&gt; <br>&nbsp;&nbsp;&nbsp; &lt;application android:icon="@drawable/icon" android:label="@string/app_name"&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;activity android:name=".SayHello" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android:label="@string/app_name"&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;intent-filter&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action android:name="android.intent.action.MAIN" /&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;category android:name="android.intent.category.LAUNCHER" /&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/intent-filter&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/activity&gt; <br>&nbsp; &lt;receiver android:name=".BootBroadcastReceiver"&gt; <br>&nbsp; &lt;intent-filter&gt; <br>&nbsp;&nbsp;&nbsp; &lt;action android:name="android.intent.action.BOOT_COMPLETED" /&gt; <br>&nbsp;&nbsp; &lt;/intent-filter&gt; <br>&nbsp; &lt;/receiver&gt; <br>&nbsp;&nbsp;&nbsp; &lt;/application&gt; <br>&nbsp;&nbsp;&nbsp; &lt;uses-sdk android:minSdkVersion="3" /&gt; <br><br>&nbsp;&nbsp; &lt;uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"&gt;&lt;/uses-permission&gt; <br><br>&lt;/manifest&gt; <br><br>注意其中粗体字那一部分，该节点向系统注册了一个receiver，子节点intent-filter表示接收 android.intent.action.BOOT_COMPLETED消息。不要忘记配置 android.permission.RECEIVE_BOOT_COMPLETED权限。 <br><br>延伸思考：在多数情况下，要自动运行的不是有界面的程序，而是在后台运行的service。此时，就要用startService来启动相应的 service了。 <br><br><a href="http://www.cppblog.com/Files/AutomateProgram/autoStart.rar">代码下载 </a>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/115077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-05-11 10:18 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/05/11/115077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Android学习笔记（二）（转）</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/05/10/115029.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Mon, 10 May 2010 12:54:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/05/10/115029.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/115029.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/05/10/115029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/115029.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/115029.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://blog.csdn.net/lihaifeng555/archive/2009/11/02/4757323.aspx">http://blog.csdn.net/lihaifeng555/archive/2009/11/02/4757323.aspx</a><br>在苏联的谷歌，你的界面呈现 </p>
<p>在移动 UI 架构开发的混战中， Android 上升到首位。如果你有一些移动体验，你会发现它是一个 Java ME 的 Canvas / Screen 对象和 BREW 构建阶层的完美组合，通过一些 XML 布局工具启动。每项活动被放置在屏幕堆栈，当它从您的应用程序启动。 Android 是已经被配置处理关闭当前的活动，并激活它的下一个活动，当你要求或当用户按下 Back 。此设置允许您认为每个作为一个屏幕基地活动。 </p>
<p>每一项活动都可能包含不同的视图和视图组在一个层次树。你可以想像这样一个带有视图组的树，布局对象作为树干和树枝（因为视图组对象可以强制转换成对象），将视图或部件作为树叶。单一 view ，在其最基本的形式，是一个可以拖拽的矩形。一个视图组，在其最基本的形式，是一个包含一个或多个视图的对象。这个对象层次结构允许您布置复杂的用户界面，而不必经历计算视图矩形和组建重叠的错误过程。如果，另一种方法，这种事是你的袋子， Android 将退出的方式，让您呈现通过 Java ME 方法手绘游戏画布。 </p>
<p>在本章中，你就会开始基本的基于 XML-based 屏幕布局，转移到更复杂的自定义画布上绘制。为了本书，我会分解并讨论视图作为三个主要食物群： </p>
<p>&#216;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XML-defined widgets/views and view groups ： 良好的基本信息显示和菜单 </p>
<p>&#216;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Android native views ： TextViews, LayoutGroups, ScrollBars, and text entry </p>
<p>&#216;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Custom views ： 游戏程序员最好的朋友 </p>
<p>您将开始一个示例登录屏幕，并操纵和铺设移动出部件和代码的意见，最终使一个交互式动画与自定义视图。 </p>
<p>方便、快速的 XML 布局 </p>
<p>首先，使用 XML 的布局开始看似简单，但它会很快变得复杂。您将开始与你的布局和工作方式到的各个元素。 </p>
<p>布置 </p>
<p>大多 XML 屏幕将被封装在一个布局对象。布局对象来在许多不同的口味，每一个你看看实在是太快，然后检查了以下几节简单的例子了。 </p>
<p>注意：在编译时，这些 XML 配置文件解析和 Android 包装成一个紧凑的二进制格式。这样可以节省解析可怕的启动时间上的数额。但是，它意味着 XML 文件无法通 过您的代码在运行时改变。更具体地说，您可以在执行过程中改变这些 XML 文件，但它会完全没有应用程序的布局。此外，您必须支付夸大一个视图或从 XML 视 图组一小性能价格。您的里程可能会根据 CPU 负载和用户界面的复杂性。 </p>
<p>LinearLayout </p>
<p>所有元素被排列成递减的列，以在一个从上到下或从左到右的方式。每个元素可以有重力和体重的属性记，设置如何动态增长和缩小，以填补空间。元素自己排列成行或列的标示基于参数： android:orientation 。 For example (see Figure 3-1): </p>
<p>&lt;LinearLayout xmlns:android= </p>
<p>"<a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>" </p>
<p>android:orientation="vertical" </p>
<p>android:layout_width="fill_parent" </p>
<p>android:layout_height="fill_parent" </p>
<p>&gt;&nbsp; </p>
<p>&lt;TextView </p>
<p>android:layout_width="wrap_content" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:text="Element One" </p>
<p>/&gt; </p>
<p>&lt;TextView </p>
<p>android:layout_width="wrap_content" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:text="Element Two" </p>
<p>/&gt; </p>
<p>&lt;TextView </p>
<p>android:layout_width="wrap_content" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:text="Element Three" </p>
<p>/&gt; </p>
<p>&lt;/LinearLayout&gt; </p>
<p>RelativeLayout </p>
<p>每个子元素的布局是与子元素有关的。这种关系的建立使得在上一个子元素结束的地方元素才开始。子元素可以只涉及那些所列内容的面前。因此，建立从 XML 文件开始到结束的依赖。请注意， ID 是需要的，以便部件可以互相引用。例如（见图 3-2 ）： </p>
<p>&lt;RelativeLayout xmlns:android= </p>
<p>"<a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>" </p>
<p>android:layout_width="fill_parent" </p>
<p>android:layout_height="fill_parent" </p>
<p>&gt;&nbsp; </p>
<p>&lt;TextView </p>
<p>android:id="@+id/EL01" </p>
<p>android:layout_width="wrap_content" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:text="Element One" </p>
<p>/&gt; </p>
<p>&lt;TextView </p>
<p>android:id="@+id/EL02" </p>
<p>android:layout_width="wrap_content" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:text="Element Two" </p>
<p>android:layout_below="@id/EL01" </p>
<p>/&gt; </p>
<p>&lt;TextView </p>
<p>android:layout_width="wrap_content" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:text="Element Three" </p>
<p>android:layout_toRight="@id/EL02" </p>
<p>/&gt; </p>
<p>&lt;/RelativeLayout&gt; </p>
<p>AbsoluteLayout </p>
<p>每个孩子有一个一个特定的位置，必须在父母布局对象的范围内。 AbsoluteLayout 对象可能是最容易建立和可视化，但最难迁移到新的设备或屏幕尺寸上。例如（见图 3-3 ）： </p>
<p>&lt;AbsoluteLayout xmlns:android= </p>
<p>"<a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>" </p>
<p>android:layout_width="fill_parent" </p>
<p>android:layout_height="fill_parent" </p>
<p>&gt;&nbsp; </p>
<p>&lt;TextView </p>
<p>android:layout_width="wrap_content" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:text="Element One" </p>
<p>/&gt; </p>
<p>&lt;TextView </p>
<p>android:layout_width="wrap_content" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:text="Element Two" </p>
<p>android:layout_x="30px" </p>
<p>android:layout_y="30px" </p>
<p>/&gt; </p>
<p>&lt;TextView </p>
<p>android:layout_width="wrap_content" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:text="Element Three" </p>
<p>android:layout_x="50px" </p>
<p>android:layout_y="50px" </p>
<p>/&gt; </p>
<p>&lt;/AbsoluteLayout&gt; </p>
<p>TableLayout </p>
<p>TableLayout 是一个布局对象，允许您指定表中的行。 Android 试图安排进入正确的行和列的每一个子元素。例如（见图 3-4 ）： </p>
<p>&lt;TableLayout xmlns:android= </p>
<p>"<a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>" </p>
<p>android:layout_width="fill_parent" </p>
<p>android:layout_height="fill_parent"&gt; </p>
<p>&lt;TableRow&gt; </p>
<p>&lt;TextView </p>
<p>android:layout_width="wrap_content" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:text="Element One A" </p>
<p>/&gt; </p>
<p>&lt;TextView </p>
<p>android:layout_width="wrap_content" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:text="Element One B" </p>
<p>/&gt; </p>
<p>&lt;/TableRow&gt; </p>
<p>&lt;TableRow&gt; </p>
<p>&lt;TextView </p>
<p>android:layout_width="wrap_content" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:text="Element Two A" </p>
<p>/&gt; </p>
<p>&lt;TextView </p>
<p>android:layout_width="wrap_content" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:text="Element Two B" </p>
<p>/&gt; </p>
<p>&lt;/TableRow&gt; </p>
<p>&lt;/TableLayout&gt; </p>
<p>这些是主要布局对象，你将来会遇到。每个例子有几个简单的 TextView 元素，为每种布局类型示范布局怎样起作用的，同时一幅屏幕捕获每个 XML 文件将呈现。你可以在 Android 的文件更彻底的实例 <a href="http://code.google.com/android/samples/ApiDemos/src/com/google/android/samples/view/">http://code.google.com/android/samples/ApiDemos/src/com/google/android/samples/view/</a> 。 <br>注意：如果您是移动开发方面的新手，当决定如何布置您的应用程序时，您必须重复你的头一个座右铭： &#8220; 移植，移植，移植。 &#8221; 理想情况下，一个布局的设计将所有可能的工作设备。事实上，这永远不会奏效。如果你运行应用在多个电话上（如大多数运营商要求您这样做），将重点放在动态的，相对的布局结构。我保证，你的屏幕大小今后将以一种戏剧性的方式变化。减少绝对值 X/ Y 的数量，并保留那些你在方便使用找到的位置 . </p>
<p>接下来的任务是找到所有放置在一个布局元素，相关子元素的列表。这种资源是可以在纷繁复 杂表格 <a href="http://code.google.com/android/reference/android/R.styleable.html">http://code.google.com/android/reference/android/R.styleable.html</a> ＃ Menu 。 </p>
<p>从那里，你可以尝试第一个 UI 任务：在为 &#8220; 社交 &#8221; 应用程序的登录屏幕。这登录屏幕将成为 getSplashy 示例应用程序的一部分。 </p>
<p>&nbsp; </p>
<p>滚动、文字输入、按钮，以及所有在生活简单的事情 </p>
<p>现在是时候使用布局的一个类。 XML 的布局是完美的，在用户输入，信息传递，以及几乎任何屏幕的内容是相对静态地方。您将添加一个简单的登录屏幕显示前面提到的 &#8220; 社交 &#8221; 申请表（见代码清单 3-1 ）。第一项任务是来描述屏幕看起来的样子在一个新的视图中。您可以使用线性布局，使您可以只垂直地添加小工具。（请注意，这个 XML 需要 general_bg 图片和声明字符串被定义在 res 文件夹中。为此，从有关详细信息， Apress 网站下载该项目的一章。） </p>
<p>Code Listing 3-1. /res/layout/login.xml </p>
<p>&lt;ScrollView xmlns:android= </p>
<p>"<a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>" </p>
<p>android:layout_width="fill_parent" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:scrollbars="vertical"&gt; </p>
<p>&lt;LinearLayout </p>
<p>android:orientation="vertical" </p>
<p>android:layout_width="fill_parent" </p>
<p>android:layout_height="fill_parent" </p>
<p>android:background="@drawable/general_bg" </p>
<p>&gt;&nbsp; </p>
<p>&lt;TextView </p>
<p>android:text="Login Screen" </p>
<p>android:layout_width="fill_parent" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:textAlign="center" </p>
<p>/&gt; </p>
<p>&lt;TextView </p>
<p>android:text="Username:" </p>
<p>android:layout_width="wrap_content" </p>
<p>android:layout_height="wrap_content" </p>
<p>/&gt; </p>
<p>&lt;EditText </p>
<p>android:id="@+id/username" </p>
<p>android:layout_width="fill_parent" </p>
<p>android:layout_height="wrap_content" </p>
<p>/&gt; </p>
<p>&lt;TextView </p>
<p>android:text="Password:" </p>
<p>android:layout_width="wrap_content" </p>
<p>android:layout_height="wrap_content" </p>
<p>/&gt; </p>
<p>&lt;EditText </p>
<p>android:id="@+id/password" </p>
<p>android:layout_width="fill_parent" </p>
<p>android:layout_height="wrap_content" </p>
<p>/&gt; </p>
<p>&lt;Button </p>
<p>android:id="@+id/loginbutton" </p>
<p>android:layout_width="wrap_content" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:text="Login" </p>
<p>/&gt; </p>
<p>&lt;TextView </p>
<p>android:id="@+id/status" </p>
<p>android:layout_width="fill_parent" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:textAlign="center" </p>
<p>android:text="Enter Username and Password" </p>
<p>/&gt; </p>
<p>&lt;TextView </p>
<p>android:layout_width="fill_parent" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:text="@string/disclaimer" </p>
<p>/&gt; </p>
<p>&lt;/LinearLayout&gt; </p>
<p>&lt;/ScrollView&gt; </p>
<p>我将从原来的列举中撤出一些具体的线条并且解释他们的作用在下面部分。注意，你没有定义组成这个屏幕元素的任何位置。但是，因为您使用的是 LinearLayout 对象，每个连续的元素附加到以前的元素的底部。 </p>
<p>Scrolling </p>
<p>滚动一个超过你设备屏幕大小的视图，你只是需要在 ScrollView 中封装你的布局对象。为了使用垂直滚动条，你的 ScrollView 必须设置参数 android:scrollbars="vertical" ，当你向下翻屏时，将显示一个滚动条。为了使视图足够长以说明这个对象，我已经添加 TextView 作为假声明在线性布局结束处。你会发现，如果你设置原来的 XML 为活动视图，重点将是向下移动的对象，直到到达的按钮，此时滚动条将处理键和向下移动用户文本的底部。 </p>
<p>&nbsp; </p>
<p>窥探 TextView </p>
<p>两个主要 &#8220; 构件 &#8221; 工作在原来 XML. </p>
<p>注意：在 Android 中的一个小部件是指任何独立视图对象的子类。 </p>
<p>为了标题和文本输入标签，使用 TextView 对象。对于用户控制的文字输入，使用 EditText 对象。最显着的，因此，特别值得详细描述的是最后的 &#8220;status&#8221; 的文本： </p>
<p>&lt;TextView </p>
<p>android:id="@+id/status" </p>
<p>android:layout_width="fill_parent" </p>
<p>android:layout_height="wrap_content" </p>
<p>android:textAlign="center" </p>
<p>android:text=&#8221;Enter Username and Password&#8221; </p>
<p>/&gt; </p>
<p>首先，由于本书内容将被修改在某个时候，通过你的代码在运行的时候，所以你需要给它一个 ID 。这允许您使用 findViewById 方法后获得。 </p>
<p>@+id/status 将添加到您的 ID 状态在 R.java ，如果文件不存在了。这一点，你的 IDE 可能会错误当您在代码中引用它第一次。不要惧怕，但因为是第一次编译，将全部解决了。 </p>
<p>接下来，您用 TextView 设置其宽度达到其父类的宽度在这种情况下， LinearLayout 对象。你告诉它让它的高度是由文字大小范围内使用的 layout_height 参数 wrap_content 。您希望文字居住在屏幕的中心，因此您使用 textAlign ，因为你已经设置其宽度为整个屏幕。最后，您给它一些简单的文字显示在活动开始了。后来，你会改变这一案文以反映当前的状态。 </p>
<p>看到这个手艺的结果，只需创建活动，并设置这个 XML 的布局是主要内容视图。您应该能够看到屏幕上，在文本输入字段的类型，并选择框。这些行动，但是不会有任何结果。为配合该计划将他们，让他们互动你就必须继续阅读。 </p>
<p>&nbsp; </p>
<p>XML 的布局 </p>
<p>我们深刻体会了 XML 的布置方案既简单又强大。它提供了一个非编程接口的移动屏幕布局和设计。它给开发人员提供了工具去破解打开和修改运行时的飞行这些值，你会做探讨如何相互作用现在 Android 的内置部件。 </p>
<p>唤醒构建 </p>
<p>我已经说明了如何使用 Android 的 TextView ， button 和 EditText 部件。但如何有用的是一个文本输入字段，如果你不能摄取你的用户已经进入？ 这是一个反问，不要回答，我不能听你（我希望）。答案是显而易见的：没有目的和结果文本输入是没有用处的。要访问您的 EditText 部件先前定义的内容，你就必须做两件事： </p>
<p>1 。获取一个您在 XML 定义部件的对象句柄。 </p>
<p>2 。监听点击或选择事件在 Login 按钮部件上。 </p>
<p>获取的事情句柄 </p>
<p>第一个任务就是得到一个在您的 XML 配置文件中定义的元素指针。要做到这一点，你会确保您要访问的每个 XML 部件有一个 Android ： ID 参数。正如前面简单提到，使用符号 @+id/-id_name_here- 将确保您的 R.java 文件有你需要的 ID 。以下是如何获得一个视图对象指针，当您的应用程序启动时。在新的登录活动中，这是 OnCreate 方法，被添加到 GetSplashy 示例应用程序： </p>
<p>Button btn = null; </p>
<p>public void onCreate(Bundle args) </p>
<p>{ </p>
<p>super .onCreate(args); </p>
<p>setContentView(R.layout.login ); </p>
<p>btn = (Button) findViewById(R.id.loginbutton ); </p>
<p>} </p>
<p>在这里，您已经获得了登录按钮的指针，通过调用 findViewById 。这使您添加单击监听，会通知您当按钮被选中（在手写笔触摸屏）或选定中心软键。您将扩展 ClickListener 类的内联函数如下： </p>
<p>public class loginScreen extends Activity </p>
<p>{ </p>
<p>private OnClickListener buttonListener = </p>
<p>new OnClickListener() </p>
<p>{ </p>
<p>public void onClick(View v) </p>
<p>{ </p>
<p>grabEnteredText(); </p>
<p>} </p>
<p>}; </p>
<p>... </p>
<p>} </p>
<p>当一个选择通知发生，以前的内联函数定义调用 grabEnteredText 方法。现在你已经定义的点击侦听器，您可以使用 btn 对象在 OnCreate 方法中： </p>
<p>public void onCreate(Bundle args) </p>
<p>{ </p>
<p>//... </p>
<p>btn = (Button) findViewById(R.id.loginbutton ); </p>
<p>btn.setOnClickListener(buttonListener); </p>
<p>} </p>
<p>如果您放断点您的按钮监听的 onClick 方法中，断点开火当您移动焦点并选择登录按钮，当您用鼠标点击它在运行模拟器中。 </p>
<p>缫丝在文本 </p>
<p>现在剩下要做的就是定义 grabEnteredText 来做到这点，正如它名字的含义。在登录屏幕的最终产品的版本，您要提取输入的文本，开始一个网络登录的调用，发动一个载入对话框。现在，你只显示一个对话框，包含在登录名和密码域中输入的内容。下面 grabEnteredTex 的样子在更新的登录活动： </p>
<p>public void grabEnteredText() </p>
<p>{ </p>
<p>//Get a pointer to the status text </p>
<p>TextView status = </p>
<p>(TextView) findViewById(R.id.status ); </p>
<p>//Grab handles to both text-entry fields </p>
<p>EditText username = </p>
<p>(EditText) findViewById(R.id.username ); </p>
<p>EditText pwd = </p>
<p>(EditText) findViewById(R.id.password ); </p>
<p>//Extract Strings from the EditText objects </p>
<p>// and format them in strings </p>
<p>String usrTxt = username.getText().toString(); </p>
<p>String pwdTxt = pwd.getText().toString(); </p>
<p>//HTTP transaction would spin up a </p>
<p>//new thread here </p>
<p>status.setText("Login" + usrTxt + " : " + pwdTxt); </p>
<p>//Show dialog box that would eventually turn into </p>
<p>this .showAlert("Login Data", 0, "Login" </p>
<p>+ usrTxt + " : " + pwdTxt, "ok!", false ); </p>
<p>} </p>
<p>&nbsp; </p>
<p>首先，使用 findViewById ，为了 status 、 username 、 password 部件，您检索 TextView 和 EditText 指针。接下来，您提取 Text-Entry 构建的内容通过检索 TextEntry 对象，并将其转换成 String 类。最后，你把两个字段的内容在一起，他们都加入到状态文本对象，并弹出一个对话框还包含两个字符串。 <br>这就是它 —— 现在允许用户输入文字，你获取、操纵，甚至显示一个对话框包含了该信息。干得好！花一秒钟轻拍自己在背后，或任何胳膊可以拘着的地方。 <br>到目前为止，您探讨如何使用 XML 来做屏幕设计，仅仅使用 &#8220; 社交 &#8221; 画面屏幕。此时，你已经学会了如何使用两个的混合体在您的登录屏幕。最后一站关于 Android 部件表达，就需要单独使用代码建立屏幕布局的。 </p>
<p>Java 的部件 </p>
<p>当你看到我写的代码产生即使是很小的选择菜单，你可能会像我，有点吓呆了。等到熟悉的 XML 的屏幕布局，试图自己用 java 动手完成这一切，会感觉像是用一对破损的保龄球演奏古典音乐。被警告，它涉及许多打字，或许不仅仅是一点挫折。 </p>
<p>另一方面，可能有一个用户界面布局的具体元素，你要动态调整。因为正如我前面提到的，您不能在应用程序运行时编辑 XML 文件的布局，它必须有需要修改每一个用户界面的代码在运行时可能片断的工具。 Android 给你这个动力，只要你是舒适的打字以惊人速度。 <br>引擎盖下使用 </p>
<p>现在您可以在引擎盖下开始小小的修补，用最基本、最直觉式的方法检验 Android 的构建。你已经了解一个核心部分的基本外观，其中许多是您在 XML 形式探讨。正如在前面的例子中，为了说明起见，我将保持这种基本。我已经在这里讨论的界面布局，它应该很容易学以致应用到更复杂的问题。在后来，更多的高级例子，你会获得更多的其他 Android 部件。在下面的例子中，我将尽力确保使用很少你从前依赖没有的 XML 元素。它应该给你一个机会，获得良好的处理非 XML 布局，但要记住，实际上，你必须是疯狂的做所有的用户界面，这种方式。 </p>
<p>主菜单 </p>
<p>几乎所有的移动应用，至少在发行时，首先是图形主菜单。这个图形屏幕引导用户执行移动应用的各种功能。因为 &#8220; 主菜单 &#8221; 的概念是如此普遍的移动应用体验，它使一个很好的和实际的案例研究。在这个例子中，你的目标是将一个简单功能主菜单的放在一起。为了便于比较，你会使用其他的线性布局， 把一切融合在一起。这个例子将建立在三个主要阶段： </p>
<p>1 。布局：你会在屏幕上正确地安排所有的主菜单项。当然，这将只使用 Android 的大屏幕版面上的一小部分。但是，大多数应用程序菜单将使用大型图形，承担着更多的空间。 </p>
<p>2 。焦点：您需要建立一个焦点结构，使用户可以通过元素移动。当焦点移动时，你必须调整每个菜单元素的颜色。 </p>
<p>3 。选择活动：最后，您需要建立一个监听，以便当一个元素被选中或单击，你知情和可以在选定的项目基础上采取适当行动。 </p>
<p>当您完成所有这些任务的三个，你应该有建立主要输入屏幕的框架，这大约占整个移动应用的百分之 80 的工作。虽然不完全现实（即，我已经完全使用 XML 的零），它是极好示范，如何做事情以自定义运行时的驱动方式。当您添加更多的功能在你的 &#8220; 社交 &#8221; 应用程序中，您填写此主菜单将更加完善。 </p>
<p>布局， Java 风格 </p>
<p>在简单主菜单上的第一步是得到所有在屏幕上的菜单元素。正如我刚才所说，你将采用线性布局完成它。您需要在申请前做这一切提请第一次，所以就必须在新的 MainMenu 活动的 OnCreate 方法中。 （请参阅第 1 章，如果你忘记了如何创建并插入一个新的活动。）代码清单 3-2 显示了它的实例化和配置的模样。 </p>
<p>LinearLayout layout = new LinearLayout(this ); </p>
<p>layout.setBackground(R.drawable.general_bg ); </p>
<p>layout.setOrientation(LinearLayout.VERTICAL ); </p>
<p>layout.setLayoutParams( </p>
<p>new LayoutParams(LayoutParams.FILL_PARENT , </p>
<p>LayoutParams.FILL_PARENT )); </p>
<p>setContentView(layout); </p>
<p>之后，您通过什么迄今为止，这在概念上似乎应熟悉。您可以设置背景使用在 /res/drawable/ 文件夹中的图片，设置线性布局为垂直方向，并设置 LayoutParams 以填补父亲（在这种情况下，父亲是活动，控制全屏幕）。布局参数，在他们的基地，必须界定规定部件的高度和宽度。正如您后来可能会发现，在前布局参数设置之前试图放入一个部件在 ViewGroup 里，将抛出一个异常。但是，现在你有一个布局对象来填充，你可以开始建立了屏幕。 </p>
<p>添加标题 </p>
<p>接下来，添加一个简单的标题，在你的主菜单画面上方将为本。代码清单 3-3 显示的代码块，您需要它。 </p>
<p>Code Listing 3-3. Adding the Title </p>
<p>TextView title = new TextView(this ); </p>
<p>title.setText(R.string.man_menu_title ); </p>
<p>title.setLayoutParams( </p>
<p>new LinearLayout.LayoutParams( </p>
<p>LinearLayout.LayoutParams.FILL_PARENT , </p>
<p>LayoutParams.WRAP_CONTENT )); </p>
<p>title.setAlignment(Alignment.ALIGN_CENTER ); </p>
<p>layout.addView(title); </p>
<p>创建文本对象，并设置文本在 /res/values/strings.xml 中 。我知道我说我不会用任何 XML ，但我恐怕我会对此有些撒谎。在开发中，您需要将所有的字符串移到这个位置，而不是在代码中定义。如果你的客户是像我这样，你就不会想拉你的源代码编辑器并重新编译每次他们想改变对 screens.Now 之一的措词，你有一个标题，是时候添 加更多有趣的和积极的菜单元素。 <br>铺设菜单项 <br>现在您可以添加单个菜单元素。因为这将是第一个在相当重复，我将插入和解释的第一个元素，但其余的留给你的你自己的设备。随意抓取在 Apress 网站的完整项目，看到菜单项休息。同样地，你会填补他们更为您通过 Android 要素各地的发展。 <br>代码清单 3-4 显示的代码添加单个菜单项。 </p>
<p>Code Listing 3-4. Adding a Menu Item </p>
<p>TextView ItemOne = new TextView(this ); </p>
<p>ItemOne.setFocusable(true ); </p>
<p>ItemOne.setText("Login Screen"); </p>
<p>ItemOne.setTextColor(Color.WHITE ); </p>
<p>ItemOne.setLayoutParams( </p>
<p>new LinearLayout.LayoutParams( </p>
<p>LinearLayout.LayoutParams.FILL_PARENT , </p>
<p>LayoutParams.WRAP_CONTENT )); </p>
<p>//Give the menu item an ID for tracking reasons. </p>
<p>//The ID is a static int defined locally to the class </p>
<p>ItemOne.setId(IdOne ); </p>
<p>//Add it to our linear layout </p>
<p>layout.addView(ItemOne); </p>
<p>&nbsp; </p>
<p>天哪，你可能认为在仔细阅读代码，这看起来就像你已经添加标题。你完全正确，多么聪明的 you.The 的一个对象时表明的焦点是，当它被选中繁重还没有到，所以不要太自大还。下面是与以前的菜单项，上面列出的标题文字有差别： </p>
<p>&#216;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你需要告诉 TextView 它可以接受的方法调用 setFocusable 焦点。 </p>
<p>&#216;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 菜单上市项目将需要身份证，因此您可以区别开来，在选择处理程序菜单元素的其余部分。 </p>
<p>正 如我刚才简单，只要增加一个小部件到 ViewGroup 的 LayoutParams 对象必须明确这一观点内组定义的对象。例如，在过去 setLayoutParams 方法调用，你必须通过在 LinearLayout.LayoutParams 对象。你必须通过正确的子类的布局参数，或机 器人将你扔在运行时异常。 </p>
<p>正如我以前说过，为了使菜单，我将添加两个文本元素几乎完全一样，以前上市。为贪方便，我不会在这里一一列举。一定要参照整个项目，以满足你的好奇心。现在，你把所有的菜单项到位，是时候对其进行修改时，接收或失去焦点 </p>
<p>焦点年轻的草蜢 ... 。 <br>为了处理焦点改变事件，你必须创建一个 OnFocusChangeListener 抽象类的实现。该示例的版本，在主菜单内定义类的活动在当地，将类似于代码 3-5 。 </p>
<p>Code Listing 3-5. Creating a Focus Listener </p>
<p>OnFocusChangeListener focusListener = </p>
<p>new OnFocusChangeListener() </p>
<p>{ </p>
<p>public void onFocusChanged(View v, boolean hasFocus) </p>
<p>{ </p>
<p>adjustTextColor(v, hasFocus); </p>
<p>} </p>
<p>}; </p>
<p>private void adjustTextColor(View v, boolean hasFocus) </p>
<p>{ </p>
<p>//Dangerous cast. Be sure you are </p>
<p>//listening only to TextView focus changes </p>
<p>// or this could go horribly wrong. </p>
<p>TextView t = (TextView)v; </p>
<p>if (hasFocus) </p>
<p>t.setTextColor(Color.RED ); </p>
<p>else </p>
<p>t.setTextColor(Color.WHITE ); </p>
<p>} </p>
<p>此外，您必须添加以下行对应于每个菜单中选择元素附加焦点更改侦听器对象： </p>
<p>ItemOne.setOnFocusChangeListener(focusListener); </p>
<p>随 着地方听众，您现在每次通知一个菜单要素收益或失去焦点。在更先进的主菜单，这个方法可以增加地方的形象转变，动画，三维爆炸或其他奇才邦图形效果。在这 个例子中，您将不得不满足于仅仅改变文字的颜色。现在，用户可以告诉通过颜色的变化，其中菜单项，突出显示，您需要的时候作出反应，他们按中心键选择一个 项目。 </p>
<p>提示：它可能通过使用 setTextColor （ ColorStateList 颜色）方法，该方法是贯彻落实文本简单的方式为基础的主要 menu.There 一个 TextView 重点，没有重点，并选定颜色总是很多方法可以实现一个目标，一个很好的 IDE 中，我只是选择了更通用的（因为我 希望你的应用超越文本菜单）。有关使用 setTextColor 信息，请参阅文件 Android 在 <a href="http://code.google.com/android">http://code.google.com/android</a> /reference/android/widget/TextView.html ＃ setTextColor （整型）。 </p>
<p>单击并选择活动 <br>你已经看到如何登记在 oginscreen onClick 事件，所以你应该能够通过这一节 withouttrouble 的微风。代码清单 3 月 6 日 显示了示例代码获取选择的事件。 </p>
<p>Code Listing 3-6. Adding a Selection Listener </p>
<p>OnClickListener clickListener = new OnClickListener() </p>
<p>{ </p>
<p>public void onClick(View v) </p>
<p>{ </p>
<p>String text = "You selected Item: "; </p>
<p>switch (v.getId()) </p>
<p>{ </p>
<p>case IdOne : </p>
<p>text += "1"; </p>
<p>startActivity( </p>
<p>new Intent(MainMenu.this, Login.class)); </p>
<p>break; </p>
<p>case IdTwo : </p>
<p>text += "2"; </p>
<p>startActivity( </p>
<p>new Intent( </p>
<p>"com.apress.example.CUSTOM_VIEW")); </p>
<p>break; </p>
<p>case IdThree : </p>
<p>text += "3"; </p>
<p>break; </p>
<p>} </p>
<p>//We'll get to the following line in a bit </p>
<p>status.setText(text); </p>
<p>} </p>
<p>}; </p>
<p>以前的 switch 语句是调用 setID 回来的原因当您最初创建并铺设 TextView 部件。当一个菜单项被选中或指针点击，的 onClick 函数被调 用，并通过相应的视图是作为参数。您将负责审查，以确定哪些菜单项被选为通过视图 ID 。这使您可以采取的菜单中选择适当的行动。通过这种方式，您可以切换 到先前定义的登录屏幕，你即将会与 startActivity 方法调用写入自定义视图。 </p>
<p>还是有留下的一小步，如果你在示例代码中的 onCreatefuction 的底部，你会点它。你需要添加一个点击监听到视图。下面是应该运行在你建立的部件清单行： </p>
<p>ItemOne.setOnClickListener(clickListener); </p>
<p>回顾 <br>回顾 Java 驱动的主菜单，你做到了几个重要 things.First ，您执行功能以前只能通过 XML 文件的布局。虽然不完全切合实际的做一方面，它会给你足够的工具来改变和定制应用程序的同时运行 XML 视图。 <br>第二，你注册为您的所有菜单项的焦点改变事件。当焦点更改侦听叫，你改变了重点项目，以突出显示它的颜色。在实际应用中，要达到同样的事情更有效的方法，但我假设你想改变的东西代替文本颜色多，可以说，奢华。 <br>第 三，你学会了如何倾听和作出反应的选择事件，洞悉项目选中，并采取适当的行动是 selection.Again 基础上，对所有需要将重点放在手屏幕小部件 出代码，往往是相当昂贵，但是使用你刚刚学到的工具，你可以修改，增加，以及自定义菜单或工程清单数据和用户偏好为基础，同时应用程序正在运行。但是，如 果您需要获得更多的专业如何绘制到屏幕上，你需要较少微妙和更代码重的方法。 </p>
<p>自定义用户界面渲染的画布 </p>
<p>这 是你出芽部分游戏开发商一直在等待 for.Android 允许你定义一个自定义视图对象只是通过扩展视图类和执行 OnDraw 方法。为了演示自定义视图在 动画循环中运行，我已经从旧金山市的探索展示一些启示我们如何看待动画和声音。您可以在 <a href="http://www.exploratorium.edu/">http://www.exploratorium.edu</a> /listen/index.php 更多关于博物馆和有关的展览。你可以购买 <a href="http://www.nature.com/neuro/journal">http://www.nature.com/neuro/journal</a> /v7/n7/full/nn1268.html 科学白皮书。 <br>这个例子将动画两个球对对方旅游，然后或者或弹跳和移动距离通过。这个例子是为了表明反弹声音可以看到之间的传递对象，看他们相互弹球人的区别。代码方面，我将演示了一个自定义视图几个重要方面： </p>
<p>&#216;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实施意见的 Android </p>
<p>&#216;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 绘制到屏幕上使用 Canvas 对象 </p>
<p>&#216;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建动画循环 </p>
<p>&#216;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 修改，并从活动自定义视图交互 </p>
<p>自定义视图 <br>您 可以自定义在两个方面视图窗口。第一，是将 View 类。这使您可以通过滚动自己创造一个 android.View 可行的子类的 &#8220; 工具 &#8221; 。另一种方法，您就 必须对自己的探索，是子类，如 TextView ，进度条，或 ImageView 和修改其行为受保护的方法使用现有的部件。这个例子显示了第一个选择，因为 它的范围广泛，比较容易理解。 <br>在最基本的层面，一个自定义部件重写保护 OnDraw 方法。代码清单 3-7 显示了这样一个方法的一个示例。 </p>
<p>Code Listing 3-7. Simple Custom View Declared in the </p>
<p>CanvasExample Activity </p>
<p>protected class CustomView extends View </p>
<p>{ </p>
<p>public void onDraw(Canvas canvas) </p>
<p>{ </p>
<p>Paint p = new Paint(); </p>
<p>p.setColor(Color.WHITE ); </p>
<p>canvas.drawText("Yo!", 0, 25, p); </p>
<p>} </p>
<p>} </p>
<p>祝贺！输入文字这几句，你现在是自己的自定义部件骄傲的所有者。当然，它只是打招呼，像我 17 岁朋克表妹，但我想你必须从某个地方开始。对于那些你在与 GameCanvas 的经验对象的 Java ME ，这应该很熟悉。要接收 OnDraw 中呼叫，您需要设置作为样本活动的主要内容查看。你必须仪式代码，将实例化，并使其成为当前视图。代码清单 3-8 显示了 CanvasExample 活动的外观。 </p>
<p>Code Listing 3-8. Activating a Custom View </p>
<p>CustomView vw = null; </p>
<p>public void onCreate(Bundle args) </p>
<p>{ </p>
<p>super .onCreate(args); </p>
<p>vw = new CustomView(this ); </p>
<p>setTitle("Bounce or Pass, sounds changes everything"); </p>
<p>setContentView(vw); </p>
<p>} </p>
<p>你为你的样品活动的名称，因为你没有给它一个应用程序的名称。然后，它只是一个创建新 CustomView 对象，并设置它为当前内容视图的问题。这将调用 您的自定义部件内的 OnDraw 方法，并显示您的有点不合常规的问候。您现在有一个掌握在非常基本的绘画方式到屏幕上。您现在应该可以进入更复杂的渲染和 动画的循环开始。 <br>创建游戏循环 <br>由于所有游戏程序员会告诉你，大多数游戏，其核心，一个不断循环 onsist 。用户输入的循环检查，并 在此输入和任何其他游戏行动，届时将制订新的框架 / 帧在您的示例应用程序 screen.The 循环将不会赢得的复杂性和独创性的任何奖项，但它会得到你开 始自己的 amerendering 循环。 </p>
<p>注 意：如果你想实现自己以外的浏览自己的动画循环 / ViewGroup 层次，并建立与 SurfaceView 循环研究对象。你可以找到这一 <a href="http://code.google.com/android">http://code.google.com/android</a> /reference/android/view/SurfaceView.html 对象文件。 </p>
<p>加载音频和图像 <br>在您将绘图 CustomView 得到，您需要加载初始化稍后将用于一些资源。代码清单 3-9 显示了新的构造 CustomView 包括局部类变量声明。 </p>
<p>Code Listing 3-9. Initializing the CustomView </p>
<p>protected class CustomView extends View </p>
<p>{ </p>
<p>Context ctx; </p>
<p>Paint lPaint = new Paint(); </p>
<p>int x_1=0,y_1=0; </p>
<p>MediaPlayer player = null; </p>
<p>Bitmap ball = null ; </p>
<p>boolean running = true ; </p>
<p>CustomView(Context c) </p>
<p>{ </p>
<p>super(c); </p>
<p>player = MediaPlayer.create (c, R.raw.bounce ); </p>
<p>BitmapDrawable d = (BitmapDrawable) </p>
<p>getResources().getDrawable(R.drawable.theball ); </p>
<p>ball = d.getBitmap(); </p>
<p>ctx = c; </p>
<p>} </p>
<p>... </p>
<p>} </p>
<p>在构造函数中，你通过 R.java 装载常数的反弹媒体资源从 / 水库 / 原始位置的文件。因为你做了几个其他资源类型此之前，你应该是一个老手了。您还需要加 载一个，将作为 &#8220; 球得出的形象。 &#8221; 你这样做的资源管理器使用对象，这是从上下文对象 etrieved 。虽然你没有明确从资源加载位置之前的形象，这好像几 乎任何其他资源负载的代码。 </p>
<p>实施环，实施循环，实施 ... <br>事不宜迟，代码清单 3-10 显示了 CustomView 对象的 OnDraw 方法样子。 </p>
<p>Code Listing 3-10. The Core of the Animation Loop </p>
<p>public void onDraw(Canvas canvas) </p>
<p>{ </p>
<p>//Draw the white background </p>
<p>Rect rct = new Rect(); </p>
<p>rct.set(0, 0, </p>
<p>canvas.getBitmapWidth(), </p>
<p>canvas.getBitmapHeight()); </p>
<p>Paint pnt = new Paint(); </p>
<p>pnt.setStyle(Paint.Style.FILL ); </p>
<p>pnt.setColor(Color.WHITE ); </p>
<p>canvas.drawRect(rct, pnt); </p>
<p>//Increment the X and Y value for the sprites </p>
<p>x_1+=2; </p>
<p>y_1+=2; </p>
<p>//Reset the loop when the balls drift offscreen. </p>
<p>if (x_1 &gt;= canvas.getBitmapWidth()) </p>
<p>{ </p>
<p>x_1 = 0; </p>
<p>y_1 = 0; </p>
<p>} </p>
<p>//Draw ball 1 </p>
<p>drawSprint(x_1, y_1, canvas); </p>
<p>//Draw ball 2 </p>
<p>drawSprint(canvas.getBitmapWidth() - x_1, y_1, canvas); </p>
<p>if (running) </p>
<p>invalidate(); </p>
<p>} </p>
<p>从顶部开始，您的第一个白色的背景使用 paintstyle 对象和调用 canvas.drawRect 。油漆对象，结合 Rectangle 对象，将告诉画 布画一个白色盒子，覆盖整个屏幕。接下来，您将递增 x 和你的球 Sprite 的 y 值。然后，您需要重新设置他们，如果他们已经漂过去屏幕的范围，并最终绘制 用自己的 drawSprite 给他们打电话。代码清单 3-11 显示了该函数的内容。 </p>
<p>Code Listing 3-11. Drawing a Bitmap </p>
<p>protected void drawSprint(int x, int y, Canvas canvas) </p>
<p>{ </p>
<p>canvas.drawBitmap(ball, x, y, lPaint); </p>
<p>} </p>
<p>这个功能，现在，只是一个简单的调用 drawBitmap 方法。我已经分离出来，这种方法只是因为绘制在另一场合雪碧可能需要比这个简单的例子功能。最 后，回到 OnDraw 函数，你会打电话给你的只有无效运行标志是真实的。调用无效的看法是 Android 的强迫重绘的首选方式。在这种情况下，您自己无效，这将调 用 OnDraw 中，整个过程中，再度开始。如果你简单地设置运行的标志虚假暂停或退出和无效时再恢复它的动画应该留在同其母公司活动的重点步骤。 </p>
<p>添加和控制声音 <br>由于听觉错觉需要能够打开和关闭两个反弹互相对象声音，您需要设置音频比赛，他们打，然后为用户建立一个机制，把这一声音的和关闭。 <br>要 播放的音频，在代码中添加代码清单 3 月 12 日 到以前的 OnDraw 函数，因为它也实际上，游戏控制回路。当我说 &#8220; 游戏循环， &#8221; 我指的是无效呼叫在 OnDraw 中结束，将设立一个重绘 Android 的 UI 事件循环。请记住， playSound 是一个布尔宣布 326-7524 自定义视图。 </p>
<p>Code Listing 3-12. Playing and Reloading Audio </p>
<p>if (playSound &amp;&amp; </p>
<p>canvas.getBitmapWidth() - x_1 -16 == x_1 + 16) </p>
<p>player.start(); </p>
<p>if (x_1 &gt;= canvas.getBitmapWidth()) </p>
<p>{ </p>
<p>x_1 = 0; </p>
<p>y_1 = 0; </p>
<p>player.stop(); </p>
<p>player.release(); </p>
<p>player = MediaPlayer.create (ctx, R.raw.bounce ); </p>
<p>} </p>
<p>正如您可能已经注意到，你开始音频播放时，小精灵， 16 像素远离对方。这是一个没有行贿的时间，让音频开始。我要指出，这更加证明我不能编辑音频文件而不 是针对一个缺乏效率的音频负荷和 Android 播放时间。您还必须确保以播放音频只有 playSound 布尔是真实的。这个变量是一类的活动在其中自定义视图定义 的成员。使用此布尔，你会得到了来自内部的屏幕活动自定义视图类的控制。要打开和关闭音频，您现在只需实施 <br>在代码的方法，在活动清单 3-13 。 </p>
<p>Code Listing 3-13. Reacting to Key Events </p>
<p>public boolean onKeyDown(int key, KeyEvent kc) </p>
<p>{ </p>
<p>if (key == KeyEvent.KEYCODE_DPAD_CENTER ) </p>
<p>{ </p>
<p>playSound = !playSound; </p>
<p>return true; </p>
<p>} </p>
<p>return super.onKeyDown(key, kc); </p>
<p>} </p>
<p>此代码应类似于你如何驳回了在第 2 章恶作剧的应用。 </p>
<p>把它同在一起 <br>如果您已经按照一直密切（或欺骗，只是下载完成的项目），您应该能够运行应用程序，看的幻觉。新闻中心方向键打开和关闭音频。与音频 起飞，它应该像他们通过互相进行表决，看起来他们反弹，即走各的路。在这个例子中，我演示了如何创建自己的视图类，如何用它来画在屏幕上，如何建立一个游 戏渲染循环，以及如何控制，简单的循环利用关键事件。 <br>使用用户界面 <br>在本章中，您已经了解，详细，如何布局屏幕使用 Android 的 XML 架构，以及如何相互作用和修改了一些 Java 的 code.Next 运行的模式，学习了如何 UI 部件布局和视图组使用源码单。这是一个不那么实际应用 的 Android 用户界面工具，但重要的是去理解的但为了通过。最后，您探索建设 gamerendering 循环的重要工具。您加入到把一些简单的多媒体和用户控 制，创建了一个简单的听觉幻想，应该让 yourvery 讨厌鬼的朋友。 </p>
<p>提示：使用所有你学到了在本章中，建立这种幻想，它包含了一些说明文字，以及边界使用 XML.When 活动开始了一个框架，但呈现的 XML 插入到适当的位置自定义视图。对于这项任务，我建议使用的解释，并为边境矩形相对布局， TextView 。 </p>
<p><br>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/lihaifeng555/archive/2009/11/02/4757323.aspx">http://blog.csdn.net/lihaifeng555/archive/2009/11/02/4757323.aspx</a></p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/115029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-05-10 20:54 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/05/10/115029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android 学习笔记（一）（转）</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/05/10/115027.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Mon, 10 May 2010 12:51:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/05/10/115027.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/115027.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/05/10/115027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/115027.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/115027.html</trackback:ping><description><![CDATA[<p>可参考下面的文章：<a href="http://www.ibm.com/developerworks/cn/opensource/os-cn-android-actvt/index.html">http://www.ibm.com/developerworks/cn/opensource/os-cn-android-actvt/index.html</a><br><br>原文地址：<a href="http://blog.csdn.net/lihaifeng555/archive/2009/09/27/4599691.aspx">http://blog.csdn.net/lihaifeng555/archive/2009/09/27/4599691.aspx</a><br><br>在Android里，应用程序是通过清单目录定义的。每个应用程序都是定义在AndroidManifest.xml里，其声明了其进入点（Entry Point）、通讯层（Communication Layer）、授权（Permission），以及活动（Activity）和意图（Intent）等。其中，有4个基础组件，我们称之为Android的主要组件，他们组成了丰富的Android应用程序。</p>
<p>Activity: Android 应用程序的UI(User Interface)基本组件。 </p>
<p>Intent receiver: 可随时被启动来处理Intent，并执行其任务。</p>
<p>Service: 非UI功能的后台处理组件。</p>
<p>Content provider: 跨程序的共享资料之存储者。</p>
<p>Android vs. Java ME vs. BREW </p>
<p>一个BREW应用程序，在所有绝大多数情况下，是由一个单独的小程序组成，这个小程序是通过接收和发送活动与手机的其他部分通信的。另一方面，你可以将一个Java ME应用看做Midlet类的扩展。这个Midlet有启动、停止、暂停、键处理（key handling）的功能，并且可以完成任何手机和应用的交互。一个Java ME应用程序通常由一个单独的Midlet组成。</p>
<p>Android应用程序有许多活动，通过AndroidManifest.xml文件，这些活动可以被注册在手机中。 在面向Android的开发与面向其他手机开发工具包的开发之间，Android的multiactivity架构或许是的他们之间主要的区别。正是这个事实使编写模块化、分割的代码（modular, compartmentalized code）更容易。在BREW和Java ME中，开发人员可以执行在Midlet或小程序范围内的大部分功能。在Android中，你可以写一个活动、内容处理程序（content handler）、意图接收器（intent receiver）、或服务以应对几乎任何东西。一旦你编写了编辑文本文件的活动，通过发送和接收意向的行动，您可以引用这个活动在您将来所有编写的应用中。这个这并不是说，这种架构在BREW或Java ME中是不能实现的，他们只是必须在Java和C或C++编程的基础上，或在BREW中通过繁琐的扩展实现，而不是被平滑地集成到应用框架中。</p>
<p>&nbsp;</p>
<p><br>Functionality </p>
<p>就像Midlet，活动使用了一系列的功能与外面的世界进行交换。在他的基础上，你编写的活动必须重写方法OnCreate，你还要重写其他功能，包括：onStop、onPause、onResume和onKeyDown。这几个功能可以让最大限度地将你开发的活动绑定到Android手机中。在默认情况下，在Eclipse中创建新的Android应用程序将执行一个&#8220;Hello，World&#8221;应用程序。我会告诉你如何从这个基本应用到功能齐全的画面。</p>
<p>如何添加图片(Image)资源 </p>
<p>首先将图片资源(例如menu_background.jpg)直接拷贝到/res/drawable文件夹中。此时，Eclipse的Android插件(Android Plug-In)会自动将一个新的ID值添加到R.java里。所以R.java文档中会多加了一行指令如下：</p>
<p>public static final int menu_background=0x7f020001;</p>
<p>在应用程序将就用此ID值来取得这个图标文件，并显示或处理它。</p>
<p>如何定义XML布局 (Layout) 文件 </p>
<p>刚才已经新增了一个图片资源文件。此时，在定义布局XML文件中，就可以引用此图片。这些布局XML文件都放在在/res/layout文件夹中，其中Eclipse的Android插件已经生成了一个main.xml文件。现在，你可利用Eclipse的 File&gt;New&gt;File菜单选项来生成新布局XML文件，例如：splash.xml。然后，以main.xml內容为模板，将之拷贝到新的splash.xml里，下一步移动&lt;TextView&gt;并且增加&lt;ImageView&gt;，内容如下：</p>
<p>&lt;ImageView android:src="@drawable/menu_background"<br>android:layout_width="fill_parent"<br>android:layout_height="fill_parent"&gt;<br>&lt;/ImageView&gt;</p>
<p>在Android的XML布局文件里，使用@drawable/就能轻松地引用/res文件夹中的资源，例如上面的的android:src="@drawable/menu_background"。此外，layout_width和layout_height 则说明这个ImageButton显示出來的大小(Size)。splash.xml也成為一項新的資源。所以在R.java裡也會自動產生新的一行，如下：</p>
<p>public static final int splash=0x7f030001; </p>
<p><br>绘制启动画面 </p>
<p>&nbsp; </p>
<p>现在，你的初始画面被定义完成，可以激活和显示。你现有的Android活动已制定了main.xml，所以你要转移到新的初始布局。为了切换，更改OnCreate方法中的代码： </p>
<p>setContentView（R.layout.main）； </p>
<p>为 </p>
<p>setContentView（R.layout.splash）； </p>
<p>运行应用程序，看着你新创建的启动画面。到目前为止，如果你得到了错误信息，检查以确认你的名字是否匹配。如果图片没有显示，确保它被正确地放置在res/rawable文件夹，并splash.xml应用了正确的名称和文件。 </p>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>时间可以解决任何问题 </p>
<p>&nbsp; </p>
<p>启动屏幕开始展现，但启动画面单独作无聊的应用程序，所以你需要进入主菜单。你会使用简单的内嵌定义线程来完成的定时器，有一些常数需要在定义线程前初始化。为了看上去完整，我将包括全部的OnCreate方法。代码如下。 </p>
<p>Code Listing 2-1. Timing the Splash Screen </p>
<p>long m_dwSplashTime = 3000; </p>
<p>boolean m_bPaused = false ; </p>
<p>boolean m_bSplashActive = true ; </p>
<p>public void onCreate(Bundle icicle) </p>
<p>{ </p>
<p>super .onCreate(icicle); </p>
<p>//Draw the splash screen </p>
<p>setContentView(R.layout.splash); </p>
<p>//Very simple timer thread </p>
<p>Thread splashTimer = new Thread() </p>
<p>{ </p>
<p>public void run() </p>
<p>{ </p>
<p>try </p>
<p>{ </p>
<p>//Wait loop </p>
<p>long ms = 0; </p>
<p>while (m_bSplashActive &amp;&amp; ms &lt; m_dwSplashTime) </p>
<p>{ </p>
<p>sleep(100); </p>
<p>//Advance the timer only if we're running. </p>
<p>if (!m_bPaused) </p>
<p>ms += 100; </p>
<p>} </p>
<p>//Advance to the next screen. </p>
<p>startActivity(new Intent( </p>
<p>"com.google.app.splashy.CLEARSPLASH")); </p>
<p>} </p>
<p>catch (Exception e) </p>
<p>{ </p>
<p>Log.e("Splash", e.toString()); </p>
<p>} </p>
<p>finally </p>
<p>{ </p>
<p>finish(); </p>
<p>} </p>
<p>} </p>
<p>}; </p>
<p>splashTimer.start(); </p>
<p>} </p>
<p>&nbsp;&nbsp; </p>
<p>到现在 ， 你才开始看到一些 Java 代码。这个简单的线程直到运行时间计数器超过 m_dwSplashTime 才停止。虽然有实现一个计时器多种方式，选择这种方式有两个原因： </p>
<p><br>此计数器可以暂停。该计时器只有m_bPaused标志为false时才推动。正如你将看到在一分钟内，如果你调用活动的OnPause方法，可以方便暂停计时器。这并不总是对启动画面的需求，这对其他以时间为基础的业务是重要的。 <br>&nbsp;</p>
<p><br>移动到下一个屏幕很简单，只要改变的m_bSplashActive标记为false。推进到下一个屏幕，如果你执行这在时尚，不要求你作出的行动，然后取消更传统的计时器。 <br>&nbsp;</p>
<p>有了这个代码，只要你以毫秒为单位设置m_dwSplashTime，你应该看到启动画面。当时间到了或用户使用按键中断了启动画面，startActivity将被调用。finish可以关闭启动活动，使用户不必通过从主菜单上选择Back返回。你需要执行一项活动，接受CLEARSPLASH意图的行动。与此同时，让我们回顾一些其他重要活动的方法你需要重写。 </p>
<p>&nbsp; </p>
<p>暂停，恢复，冲洗，重复 </p>
<p>由于呼入电话，短信或其他中断，你的活动被挂起时，暂停启动计时器，如下： </p>
<p>protected void onPause() </p>
<p>{ </p>
<p>super.onPause(); </p>
<p>m_bPaused = true; </p>
<p>} </p>
<p>对于这些大部分覆盖的方法 ， 在做任何事情之前 ， 你需要调用超类。如果你查看计时器线程，如果m_bPaused是true，你会看到负责跟踪时间的MS计数器保持时间没有前进。在这一点上，我相信你可以猜测onResume的样子： </p>
<p>protected void onResume() </p>
<p>{ </p>
<p>super.onResume(); </p>
<p>m_bPaused = false; </p>
<p>} </p>
<p>当你的应用程序恢复，计时器线程添加时间恢复到MS计数器。 </p>
<p>&nbsp; </p>
<p>基础的 Key Handling </p>
<p>在活动内，Key Handling是处理覆盖onKeyDown方法。我们将使用此功能允许用户取消你不完美的启动画面。正如在本节开始你看到的计时器线程，通过m_bSplashActive设置，你在计时器循环中了异常语句。为了异常处理，你只需要重写onKeyDown方法使之切换启动标记为false。下面的代码需要添加： </p>
<p>public boolean onKeyDown(int keyCode, KeyEvent event) </p>
<p>{ </p>
<p>//if we get any key, clear the splash screen </p>
<p>super .onKeyDown(keyCode, event); </p>
<p>m_bSplashActive = false ; </p>
<p>return true; </p>
<p>} </p>
<p>现在 ， 当用户按下任意键 ， 屏幕将被推进到下一个路程通过计时器循环。 </p>
<p>&nbsp; </p>
<p>Clear intent </p>
<p>有一件事你需要在启动画面之前做 ， 我相信你想知道有关 startActivity 方法调用。这里应该简单介绍一下intent。Intent是一个对象，在两个或两个以上活动、内容处理（content handlers）、意图接收器（intent receiver）、或服务之间，可以作为一个通讯事件。你会使用com.google.app.splashy.CLEARSPLASH调用 startActivity 。当startActivity被调用时，Android搜索所有配置清单文件，寻找已注册为CLEARSPLASH Intent action节点。 </p>
<p>你要增加一个新类MainMenu，其作为主菜单activity。它要继承Activity类，实现OnCreate方法，在R.layout.main中调用setContentView方法。你要打开的AndroidManifest.xml并增加新的 activity 元素。在 &lt;/activity&gt; 结束符之后， 你应该插入以下内容： </p>
<p>&lt;activity android:name=".MainMenu" </p>
<p>android:label="@string/app_name"&gt; </p>
<p>&lt;intent-filter&gt; </p>
<p>&lt;action android:name= </p>
<p>"com.google.app.splashy.CLEARSPLASH"/&gt; </p>
<p>&lt;category android:name= </p>
<p>"android.intent.category.DEFAULT"/&gt; </p>
<p>&lt;/intent-filter&gt; </p>
<p>&lt;/activity&gt; </p>
<p>确定活动的名称为 .MainMenu 。这会告诉 Android 加载和运行 Java 类。在 Intent filer 标签中 ， 注册为 com.apress.splash.CLEARSPLASH 的 Intent Action 。在现实中，名称意图可能是beef.funkporium.swizzle，只要名称在startActivity调用和前面的Android配置清单中一致，所有正确的事情应继续发生。 </p>
<p>&nbsp; </p>
<p>一项活动的生命周期 </p>
<p>Activity的生命周期被包括在Google的文档中。但是，如果你先仔细考虑生产Activity的底层原理，你不能错过这个重要的信息。在这一点，你的启动画面，你应该准备好推出。 </p>
<p>为了说明，我还增加了以功能在启动画面活动中： </p>
<p>protected void onStop() </p>
<p>{ </p>
<p>super.onStop(); </p>
<p>} </p>
<p>protected void onDestroy() </p>
<p>{ </p>
<p>super.onDestroy(); </p>
<p>} </p>
<p>如果你方断点在上面活动的所有功能，在调试模式下运行它，你会看到断点与下面顺序一致: </p>
<p>1. onCreate </p>
<p>2. onStart </p>
<p>3. onResume </p>
<p>4. 在这一点上，你的活动目前已经运行。在三秒钟内，计时器线程将达到结束，并调用startActivity结算的意图。下一步，它将调用finish，它告诉Android关闭启动画面活动。 </p>
<p>5. onPause </p>
<p>6. onStop </p>
<p>7. onDestroy </p>
<p>5. onPause </p>
<p>6. onStop </p>
<p>7. onDestroy </p>
<p>从开始到结束 Activity ， 这是一般的生命周期来。你可以找到对生命和时代的 Android 活动更全面地披露 ， 在谷歌的文档活动中 <a href="http://code.google.com/android/reference/android/app/">http://code.google.com/android/reference/android/app/</a> Activity.html 。你甚至可以找到漂亮图形。从本质上讲，手机使用了以前的组合功能提醒你的主要事件可以发生在你的应用程序：启动，关闭，暂停和恢复。我已经讨论过，Activity将要成为任何传统应用的的核心组件；他们给你控制了屏幕，能够接收用户输入。 </p>
<p>&nbsp; </p>
<p>总结 </p>
<p>到目前为止，我已经探讨了活动如何成在手机中，他们如何启动和停止，以及他们如何与基础层沟通。我演示了如何显示一个简单的XML视图屏幕，以及如何活性之间切换两个反应都在一个关键的事件和结束时的一个指定的时间量。在短期内，你需要了解更多有Android如何使用意向，意图接收器，过滤器和意图沟通。要做到这一点，你需要一个示例应用程序。 </p>
<p>&nbsp; </p>
<p>创建一个Intent Receiver </p>
<p>Intent Receiver是Android重要的组成部分，从它的名字可以看出其作用。它的作用是等待接收注册的Intent Action，Android是按照BREW的通知模式实现的。我们将使用一个简单的应用，展现一个复杂的Intent Receiver任务：输入文本消息的接收和响应。 </p>
<p>&nbsp; </p>
<p>事情的起因 </p>
<p>我们开始设想这样一幅画面：一天下午，当你回到你的办公桌，你发现你的办公桌，从地毯到天花板与可爱的粉红色的图片，铺满最令人讨厌的图画。你知道这是谁在做，现在是你报复的时候了。你也知道你的工程部副总裁最厌恶一首特殊的歌。这首歌是 &#8220; La Bamba &#8220; 。让你决定通过一个休眠程序操纵你同事的Android手机。我会告诉你如何制作一个Android应用程序，收到特定的短信后，播放这种耻辱效应的音频文件。这会使你的副总对你的新敌人产生强烈的愤慨。同时，你要给他一个机会关闭声音了。这种恶作剧程序要求Intent Receiver，Activity，Service，以及所有三种方式进行通信。 </p>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>这有什么实际的通途吗？这可能有吗？ </p>
<p>这是一个很好的问题。虽然表面上看来不是很实用应用，我相信，如果有一点想像力，你可以发现其很多重要的现实用途：从推送电子邮件通知到内部电话应用通信。 </p>
<p>你将向前迈进四个阶段。在每个阶段，你将了解更多关于Intent receives，services，所有这些应用程序之间的相互作用件： </p>
<p><br>通知收到一个短信 <br>&nbsp;</p>
<p><br>打开短信的内容和找到特殊的净荷 <br>&nbsp;</p>
<p><br>当短信到达Activity启动，并且意识到启动发生在接收器的控制下 <br>&nbsp;</p>
<p><br>开始一个新的服务，将播放音频文件 <br>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>使用Intent Receiver </p>
<p>在你开始编写Intent Receiver之前，你需要了解你为什么会使用他。Intent Receriver没有或几乎没有内存占用、linkage和系统开销。在启动时，一个活动必须将所有大量的引入的类加载，Intent Receriver则没有这些约束。由于某种类型的新Intent可以达到破碎频率（例如网络状态更新），一个轻量级的对象必须在分析数据的第一阶段。如果它是一个适当的时间唤醒一个更大的用户界面程序或大幅后台服务，意图接收机应采取这种行动。 </p>
<p>&nbsp; </p>
<p>提示：意图接收器可以经常的启动和关闭（这依靠他们的监听），试图让它们变地重量轻，使用尽可能少的类库。你的用户不会高兴，如果他们电话在缓慢地爬行，因为你已经插入到太多特定的事件处理开销。 </p>
<p>&nbsp; </p>
<p>编写Intent Receiver </p>
<p>第一件事首先你需要创建一个这个小恶作剧应用程序建立新项目。在源目录中，创建一个新类，将成为新的Intent Receiver。在第一阶段，它看起来应该像这样： </p>
<p>public class PrankSMSReceiver extends IntentReceiver </p>
<p>{ </p>
<p>public void onReceiveIntent </p>
<p>(Context context, Intent intent) </p>
<p>{ </p>
<p>return; </p>
<p>} </p>
<p>} </p>
<p>现在你已经设定了阶级 ， 你必须告诉你想要 Android 接收 SMS 事件。你可以通过修改 AndroidManifest.xml 文件给你许可和登记 RECEIVE_SMS 的 Intent action 。 </p>
<p>&nbsp; </p>
<p>权限 </p>
<p>运营商，用户，甚至开发人员可能不希望给Android应用自由支配，贯穿其手机和网络的特权层。因此，谷歌推出一种被移动发人员认可的权限概念。为了能够接收短信息，你需要通知手机你可以接收。 </p>
<p>在Android中，所有元素的权限声明在特别的配置文件中，你添加的权限在&lt;manifest&gt;标记后（代码2-2）。该示例应用程序将被称为PrankApp。其活动主要是rankActivity。 </p>
<p>Code Listing 2-2. Adding Permissions to Receive SMS Messages </p>
<p>&lt;?xml version="1.0" encoding="utf-8"?&gt; </p>
<p>&lt;manifest xmlns:android= </p>
<p>"<a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>" </p>
<p>package="com.apress.book.PrankApp"&gt; </p>
<p>&lt;uses-permission android:name= </p>
<p>"android.permission.RECEIVE_SMS" /&gt; </p>
<p>没有权限标志，Android将你的应用程序无法启动当它接收到一个短信。还有其他的权限我需要涵盖你向前看。在此期间 ， 你可以找到所有在列表的权限 Android 的文件资料 <a href="http://code.google.com/android/reference/android/">http://code.google.com/android/reference/android/</a> Manifest.permission.html 。 </p>
<p>&nbsp; </p>
<p>向我发送短信！ </p>
<p>现在，你已经允许进行与手机的SMS层交互，你必须告诉手机做什么，当一个新的文本信息到达时。要做到这一点，你必须打开AndroidManifest.xml文件，添加一个新的Intent Receiver。代码清单2-3显示了要插入的代码。 </p>
<p>Code Listing 2-3. Registering the New Intent Receiver for </p>
<p>Incoming SMSs </p>
<p>&lt;/activity&gt; </p>
<p>&lt;receiver android:name= </p>
<p>"PrankSMSReceiver"android:enabled="true"&gt; </p>
<p>&lt;intent-filter&gt; </p>
<p>&lt;actionandroid:name="android.provider.Telephony.SMS_RECEIVED" </p>
<p>/&gt; </p>
<p>&lt;categoryandroid:name="android.intent.category.DEFAULT" /&gt; </p>
<p>&lt;/intent-filter&gt; </p>
<p>&lt;/receiver&gt; </p>
<p>这就是你每次必须要接受的 Intent notification ， 当手机得到一个接收到的 SMS 。 </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>在 Action 中分析 Intent Receiver </p>
<p>要完成这个要比我们想象的有一点困难。一个进程必须在一个 DDMS 中运行 。但在大多数情况下，你不想让应用程序运行，除非新的事件触发它。这问题的解决方案在Eclipse IDE中只是一个小小的把戏。当你一步一步往下走时，这可能会一点一点变得复杂。 </p>
<p>在你的onReceiveIntent方法中放置一个断点。开始调试应用程序，并让模拟器位于&#8220;Hello World，PrankActivity&#8221;屏幕上。在Eclipse中，切换视图到DDMS。你可以按这命令+ F8键几次或选择菜单 Window 􀁨 Open Perspective 􀁨 DDMS 。 </p>
<p>&nbsp; </p>
<p>沿着左边窗口，在Device选项卡上，你现在应该看有一个绿色bug图标在你的应用旁边。这是DDMS告诉你调试器附加到你的PrankApp进程中。在它的下面是Emulator Control选项卡。在这里你可以发送短信消息。首先输入任何一个电话号码，选择SMS，键入一个测试消息，并按下Send。 </p>
<p>&nbsp; </p>
<p>如果你的配置正确，你应该看到Eclipse切换到Debug透视图，并停止在你的新设置断点上。 </p>
<p>&nbsp; </p>
<p>注意：如果没有发生，首先确保你设置了权限正确。如果他们不正确，你应该看到一个失败的权限信息显示在DDMS屏幕底部的LogCat标签中。此外，请确保你的应用程序已经在运行，并在Devices选项卡有绿色调试图标在它的旁边。如果所有这些都不奏效，比较你的项目与文中的示例。 </p>
<p>&nbsp; </p>
<p>目前为止，如果你正确地完成了。你的Intent的onReceiveIntent功能被调用，当每一个SMS消息发送到手机上。接下来，你就必须弄清楚如何得到短信的内容。 </p>
<p>&nbsp; </p>
<p>什么是在一个SMS中？ </p>
<p>可悲的是，到目前为止Android关于接收和过滤SMS信息的文档只不过是混乱的。我怀疑这不是一项需要告诉开发人员的重要功能。我不同意这些优先事项，但是使我有机会填补空缺。 </p>
<p>下面是methodonReceiveIntent的代码，功能是监听新的SMS信息： </p>
<p>public void onReceiveIntent </p>
<p>(Context context, Intent intent) </p>
<p>{ </p>
<p>SmsMessage msg[] = </p>
<p>Telephony.Sms.Intents.getMessagesFromIntent(intent); </p>
<p>for(int i = 0; i &lt; msg.length; i++) </p>
<p>{ </p>
<p>String msgTxt = msg[i].getMessageBody(); </p>
<p>if (msgTxt.equals("0xBADCAT0_Fire_The_Missiles!")) </p>
<p>{ </p>
<p>//Start the pranking here </p>
<p>} </p>
<p>} </p>
<p>return; </p>
<p>} </p>
<p>你还需要输入两个类库来完成这项工作： </p>
<p>Import android.telephony.gsm.SmsMessage; </p>
<p>Import android.provider.Telephony; </p>
<p>getMessageFromIntent 方法是在 Telephony 类中 ， 这将返回 SMS 信息的数组。现在剩下的就是得到短信的有效载荷。你要找的触发恶作剧活动的特殊代码为文本 </p>
<p>&#8220; 0xBADCAT0_Fire_The_Missiles ！ &#8221; </p>
<p>它必须是一个适当的独特组合，以便它不会被触发事故。你不会希望自己的恶作剧失火并提醒受害人太早的。 </p>
<p>注意：在Android里，没有记载的功能是很可能还没有完成。由于接收短信的文档几乎不存在，你应该会有些变化在如何处理手机简讯上。更可能的是整体的方法应该是相似的，但它有把握地认为其中的一些细节将改变SDK的前到达它的最终版本。这个例子是有关学习如何使用意图接收器多是有关文本的消息通信资料。 </p>
<p>&nbsp; </p>
<p>触发活动 </p>
<p>重要的是要记住，意图接收器的生命周期短，只有只要方法调用onReceiveIntent。一旦出于这一职能，Android是免费杀死进程中运行你的应用程序。任何异步功能会死去，如果是一个十分棘手的死亡开始。如果你想要做超越了简单的处理方法内的任何事情，你需要启动服务或活动。既然你要同时播放音乐和警报你的受害者，他们去过了，你需要启动的一项活动。你完成此情况如下： </p>
<p>if (msgTxt.equals("0xBADCAT0_Fire_The_Missiles!")) </p>
<p>{ </p>
<p>//Start the Activity </p>
<p>Intent startActivity = new Intent(); </p>
<p>startActivity.setLaunchFlags(Intent.NEW_TASK_LAUNCH); </p>
<p>startActivity.setAction("com.apress.START_THE_MUSIC"); </p>
<p>context.startActivity(startActivity); </p>
<p>} </p>
<p>你会看到这里是增补 NEW_TASK_LAUNCH 在 setLaunchFlags 。你需要做任何你要发送的 Intent action ， 将启动一项新的活动。此外，正如你在启动画面示例应用程序，你必须添加一个新的行动，你的Activity的Intent filter。那个过程应该看起来很熟悉： </p>
<p>&lt;intent-filter&gt; </p>
<p>&lt;action android:name="android.intent.action.MAIN" /&gt; </p>
<p>&lt;action android:name="com.apress.START_THE_MUSIC" /&gt; </p>
<p>&lt;category android:name= </p>
<p>"android.intent.category.LAUNCHER" /&gt; </p>
<p>&lt;category android:name= </p>
<p>"android.intent.category.DEFAULT" /&gt; </p>
<p>&lt;/intent-filter&gt; </p>
<p>现在 ， 如果你在前面正确地添加了代码 ， 当你从 DDMS 透视图中 发送 SMS 消息时 ， 你应该看到你的应用跳出到前台 ， 显示 &#8220;Hello World ，PrankActivity &#8221; 文本在屏幕上。 </p>
<p>&nbsp; </p>
<p>索具的活动 </p>
<p>一个最后的工作你需要添加 ， 在得到卑鄙的音乐播放服务之前 ： 装配 Activity ， 以回应你的 Intent Receiver 发送的活动 。如果应用程序正常启动，你要立即关闭了。同样，如果可以通过菜单启动，这样你的恶作剧的计划就会过早的曝光。要做到这一点，你必须检索发射的Intent，并调用getAction方法来计算出在什么情况下，它已经启动。该PrankActivity的OnCreate方法现在看起来应该代码2-4。 </p>
<p>Code Listing 2-4. Launching on a Specific Intent Action </p>
<p>public void onCreate(Bundle icicle) </p>
<p>{ </p>
<p>super .onCreate(icicle); </p>
<p>Intent i = getIntent(); </p>
<p>String action = i.getAction(); </p>
<p>if (action != null &amp;&amp; </p>
<p>action.equals("com.apress.START_THE_MUSIC")) </p>
<p>{ </p>
<p>setContentView(R.layout.pranked); </p>
<p>//We'll need to start the music service here </p>
<p>} </p>
<p>else </p>
<p>finish(); </p>
<p>} </p>
<p>&nbsp; </p>
<p>首先你会得到发起 Activity 的Intent 。使用目前得到的 Intent ， 你可以用 getAction 方法检索调用的行动。这个将返回一个包含启动事件的字符串，你核对你的著名音乐行动列在原来的XML。如果在启动事件为你的活动来自正常的方式（从菜单或从启动调试器），该行动字符串将是null。如果是这样的话，你要立即使用finish方法关闭活动。 </p>
<p>注意：OnCreate方法被调用当你的应用被首次启动时。如果你已经启动你的应用程序，然后退出（使用返回键），应用程序仍然在后台运行。如果在这时，你发送短信，你的活动将回到前台，但其OnStart方法将调用而不是OnCreat。 </p>
<p>&nbsp; </p>
<p>你今天想羞辱谁呢？ </p>
<p>虽然可能有些矫枉过正，你要使用Android的service对象来处理音乐播放。我打算这样做有因为另个原因： </p>
<p>n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 􀂃 这是一个好的机会来展示以简单的方式service的使用，在简单的环境。 </p>
<p>n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 􀂃 潜在的，它会让你启动音乐不用看到应用程序，使你的恶作剧的应用程序更卑鄙。 </p>
<p>神经与服务 </p>
<p>为什么你要使用的服务？从本质上讲，它意味着是一个对象，与用户界面分离的可运行地过程。这是完美的情况，当一个开发人员希望的功能（无论是网络或多媒体相关）能够独立运行。例子包括：音频播放，网络交易的后台，和邪恶的恶作剧程序。虽然服务允许多个应用程序（打开通信信道）与他们绑定，你会使用它作为一个简单的后台进程。同样，services有很多用途不只是这个简单的例子。 </p>
<p>创建service </p>
<p>添加一个新类的源码包。我已经再次调用PrankService（没有点创意）。在最基本的层面，service要重写onBind方法。要获得服务类编译，它必须看，至少有一点点，如代码2-5。 </p>
<p>Code Listing 2-5. A Stripped-Down Service </p>
<p>public class PrankService extends Service </p>
<p>{ </p>
<p>public IBinder onBind(Intent intent) </p>
<p>{ </p>
<p>return null; </p>
<p>} </p>
<p>} </p>
<p>在这个例子中，你不会使用该服务onBind方法进行互动。你可以简单地启动和停止服务在你的主要活动内。要做到这一点，你必须重写两个方法在服务类： </p>
<p>OnStart （Int startId ，Bundle argument ） <br>onDestroy（） </p>
<p>当OnStart被调用时，你会开始播放的媒体文件。当服务被破坏，就会明确地停止。这不是必然要求，但你会明白。 </p>
<p>启动服务 </p>
<p>开始一个新的服务应该类似于开始活动。自从你已经接触到这是几次，我就在给你一段代码，让你整理一下。 调用前面列出的PrankActivity OnCreate方法。简单替换注释&#8220; We&#8217;ll need to start the music service here &#8221;用下面的代码行： </p>
<p>startService(new Intent </p>
<p>("com.apress.START_AUDIO_SERVICE"), null ); </p>
<p>同样，这个看上去很熟悉。启动Activity和启动service之间唯一的区别是（除了不同的方法调用）是随Intent传递bundle（实际上是一个地图或哈希表）参数的能力。这bundle将被传递到OnCreate方法服务。 </p>
<p>启动音乐 </p>
<p>BREW和Java一样，Android的媒体播放（简单的播放/停止计算）非常简单易用。当你服务的OnStart函数被调用，你会加载和播放/res/raw 目录中的测试音频文件首先要做的是复制音频样本文件导入/res/raw（如果没有这个目录，继续并创建它）。下一步，放下羞辱，并复制写入尊重，音频文件原始文件夹。如果你使用Eclipse，你应该添加相应的元素R.raw。在你的情况下，它的R.raw.test。 </p>
<p>现在你有一个音乐文件的引用，你可以添加程序 PrankService 的要求如下 ： </p>
<p>public void onStart(int startId, Bundle arguments) </p>
<p>{ </p>
<p>MediaPlayer p; </p>
<p>super .onStart(startId, arguments); </p>
<p>player = MediaPlayer.create(this , R.raw.test); </p>
<p>player.start(); </p>
<p>} </p>
<p>请记住 ， 是一个重写的 OnStart 方法 ， 因此你必须调用父类同一函数或 Android 将变得不稳定。在这一点上，你需要用MediaPlayer的静态类创建一个新的媒体播放器对象。因为service是context的子类，你将一个指针传递给你当前的context和静态变量代表你的测试媒体。在这一点上，你可以调用play，现在你可以开始忙了。播放会继续在后台运行，直到stopService这个方法是由你的主Activity调用。 </p>
<p>当stopService被调用时，下面的方法将调用： </p>
<p>public void onDestroy() </p>
<p>{ </p>
<p>super.onDestroy(); </p>
<p>player.stop(); </p>
<p>} </p>
<p>&nbsp; </p>
<p>同情的行动 </p>
<p>既然你是一个不错的爱开玩笑的人 ， 你要给你的受害者一个台阶下。正如你之前见过的，Activity是由Intent Receiver触发的，在活动启动服务的时间点上。正如你刚才看到的，service是负责播放噪声激怒你副总工程师。同样，因为你是仁慈的在你的执行回报的同时，你必须为受害者设计关闭音乐方法。添加在你的PrankActivity下面的方法可以实现你善意的行动： </p>
<p>public boolean onKeyDown(int keyCode, KeyEvent event) </p>
<p>{ </p>
<p>stopService(new Intent( </p>
<p>"com.apress.START_AUDIO_SERVICE")); </p>
<p>finish(); </p>
<p>return true; </p>
<p>} </p>
<p>&nbsp; </p>
<p>配置文件 </p>
<p>下面是表现如下所示 ： </p>
<p>&lt;service android:name=".PrankService"&gt; </p>
<p>&lt;intent-filter&gt; </p>
<p>&lt;action android:name= </p>
<p>"com.apress.START_AUDIO_SERVICE" /&gt; </p>
<p>&lt;category android:name= </p>
<p>"android.intent.category.DEFAULT" /&gt; </p>
<p>&lt;/intent-filter&gt; </p>
<p>&lt;/service&gt; </p>
<p>&nbsp; </p>
<p>&nbsp; </p>
<p>禅宗和报复的艺术 </p>
<p>通过不光明正大的小恶作剧应用程序的使用 ， 你应该明白了 Intents ，Intent Receivers ，services 和Activities 如何 共同在先进的 、 主要是后台 的 应用程序中运行的。我现在要改变一下方式，一步一步做，你做了什么以及如何实现它。 </p>
<p>让我做的更好 </p>
<p>你做了以下内容： </p>
<p>1。你使用正确的权限和系统接收器的意图级短信的意图安排的对象是PrankSMSReciever每次实例化一个手机上的SMS到达。如果你的Intent Receiver发现一个非常特定的SMS的有效载荷，它将通过发送Intent将启动你的活动。 </p>
<p>2。这项活动名为PrankActivity，会监听被PrankSMSReceiver的特定intent action。当它收到确切intent action，你的活动将显示一个&#8220;gotcha&#8221;消息给受害者。同时，该活动将发出意图旨在启动服务。如果在任何时候受害人/用户按下一个电话上的键，应用程序将退出，音乐服务将终止。 </p>
<p>3。服务类，称为PrankService，监听PrankActivity的intent，将启动并开始播放令人讨厌，预定义的音频文件。它将继续播放，直到它被要求停止通过PrankActivity的调用方法stopService。 </p>
<p>注意：此示例应用程序不涉及手机的本地短信应用。因为所有的intent receiver传入的通知意图，你的应用将被争夺用户与Android的关注短信收件箱的应用。在生产中，这可能需要相当计时器也许触发文本有效载荷，这是一个微妙多一点 &#8220;0xBADCAT0_Fire_The_Missiles ！&#8221; </p>
<p>&nbsp; </p>
<p>在Android中移动数据 </p>
<p>最后，你需要把重点放在内容解析器。 Android不会给SDK特别的手机文件系统的访问权限，如Brew一样。它也没有提供一个RecordStore，像Java ME一样。在你的Activities、Intent&nbsp; Receiver和services之间，你传递数据的主要方法是必须通过ContentResolver超类。虽然你可以存储数据通过文件，参数，和其他数据库，可以采取许多形式，Android附带的几个重要内置content resovlers。这里有一个列表，Android的主要content resovlers，你可能要经常互动基础上： </p>
<p><br>浏览器 </p>
<p>书签 <br>搜索历史 </p>
<p><br>电话呼叫 <br>通话记录 <br>最近通话 </p>
<p><br>联系 </p>
<p>系统设置 <br>硬件设置（蓝牙，网络设置） <br>软件设置 </p>
<p>Android 的文档提供了非常好的示例 ：<a href="http://code.google.com/android/">http://code.google.com/android/</a> devel /data/contentproviders.html ＃usingacp 。马上我要给你演示怎样添加一个书签到手机浏览器的书签列表。首先，你要搜索当前的书签列表，查看你的链接是否存在。第二，你要添加书签，如果不存在。 </p>
<p>&nbsp; </p>
<p>注意：可以创建你自己的content provider，作为一种方式，为了公共访问封装Android的SQLite的执行。你将进入如何在后面的章节中这一点。现在你只是去处理content resolver交给的&#8220;client&#8221;方面。 </p>
<p>&nbsp; </p>
<p>Android采用了自定义的SQLite实现，来存储本地信息。如果你不熟悉SQL的基础知识，现在也许是一个学习的机会。为表述方便，我要假设你了解基本的SQL查询命令。如果你需要进一步提高，Apress上有一个很好的资源<a href="http://apress.com/book/">http://apress.com/book/</a> catalog?category=145 。 </p>
<p>&nbsp; </p>
<p>无耻的自我推销 </p>
<p>让我们说一下你的应用程序中&#8220;about&#8221;部分，你想有一个按钮，添加你的商业软件网页到用户的web书签。你要确保它不添加两次，如果你的用户有再次点击该按钮意外。为了使这个实例简单，你将触发这个事件在你示例应用程序中，当用户按下一个键。 </p>
<p>注意：在一个有趣的注意，如果你需要证明，作为一个开发人员，Android是还没有完全成熟的，你只要看看比对下文件的android.content.ContentResolver方法getDataFilePath，其中规定： &#8220; 请不要使用此功能！有人说这一点，他们不应该。你没有直接的访问文件内的内容提供商。不要碰这个。走开。 &#8220; 这是好，知道即使是对Android的文档技术作家有幽默感。 </p>
<p>&nbsp; </p>
<p>获取用户的书签 </p>
<p>这应该是显而易见的，至少在这一点，开发人员可以做一些非常邪恶的事情，访问用户的书签。目前还不清楚，在这一点，Android会做什么以防止发生这类事情。我想这得由运营商来锁定或监视此行为。在任何情况下，你将使用一个调用方法managedQuery，它将返回一个列表用户的书签： </p>
<p>&nbsp; </p>
<p>Cursor bookmarks = </p>
<p>android.provider.Browser.getAllBookmarks </p>
<p>(getContentResolver()); </p>
<p>int urlColumn = bookmarks.getColumnIndex( </p>
<p>android.provider.Browser.BookmarkColumns.URL ); </p>
<p>Cursor results; </p>
<p>String[] proj = new String[] </p>
<p>{ </p>
<p>android.provider.BaseColumns._ID, </p>
<p>android.provider.Browser.BookmarkColumns.URL, </p>
<p>android.provider.Browser.BookmarkColumns.TITLE </p>
<p>}; </p>
<p>results = </p>
<p>managedQuery(android.provider.Browser.BOOKMARKS_URI, </p>
<p>proj, null , </p>
<p>android.provider.Browser.BookmarkColumns.URL </p>
<p>+ " ASC"); </p>
<p>现在我将分解每一个操作。你首先要书签网址列索引。再次，因为Android通过SQL格式提供其多数内部数据的访问，你应该习惯于用数据库的方式引你保存的信息。接下来，你将设置游标，一个类似Java ME中RecordStore枚举对象，设置字符串数值的映射。因为你只关心列包含的网址，它保存非常简单。方法调用managedQuery是调用将返回你的数据。你可以通过URI中为书签存储字符串，交给你了简单的映射数值，不需要where语句，并告诉它按降序排列的网址。 </p>
<p>&nbsp; </p>
<p>搜索结果 </p>
<p>搜索结果很简单只要迭代游标对象，是通过简单的光标迭代对象和退出一列从URL字符串ID你检索前 ： </p>
<p>Cursor results = </p>
<p>android.provider.Browser.getAllBookmarks </p>
<p>(getContentResolver()); </p>
<p>int urlColumn = </p>
<p>results.getColumnIndex </p>
<p>(android.provider.Browser.BookmarkColumns.URL); </p>
<p>results.first(); </p>
<p>do </p>
<p>{ </p>
<p>//url is a method param </p>
<p>//containing what we're looking for </p>
<p>if(results.getString(urlColumn).equals(url)) </p>
<p>return false; </p>
<p>} while (results.next()); </p>
<p>你可以做更多的基于 URL 的内容 ， 但现在你会只是看你的 <a href="http://www.apress.com/">www.apress.com</a> 链接。很明显，如果此代码的运行是上述Apress网址，你不会找到它。因为用户希望添加贵公司的网址在虚拟的&#8220;About&#8221; &#8221; 部分中，你也要给他们。 </p>
<p>使用Content Resolver添加邪恶公司网址 </p>
<p>也许他们不是邪恶，但你加入他们。由于Apress也许是公司最邪恶那里（不是我有偏见，记住），你让他们摆脱它，只此一次。下面是一个美丽的ContentReceiver方式添加书签记录： </p>
<p>ContentValues inputValues = new ContentValues(); </p>
<p>inputValues.put </p>
<p>(android.provider.Browser.BookmarkColumns.BOOKMARK, </p>
<p>"1"); </p>
<p>inputValues.put </p>
<p>(android.provider.Browser.BookmarkColumns.URL, </p>
<p>"<a href="http://www.apress.com/">http://www.apress.com/</a>"); </p>
<p>inputValues.put </p>
<p>(android.provider.Browser.BookmarkColumns.TITLE, </p>
<p>"Apress, the not so evil company"); </p>
<p>ContentResolver cr = getContentResolver(); </p>
<p>Uri uri = </p>
<p>cr.insert </p>
<p>(android.provider.Browser.BOOKMARKS_URI, </p>
<p>inputValues); </p>
<p>想大多数软件开发工具包，有不止一种方法来完成相同的任务。早些时候，你有更复杂的方法加书签。这个方法是有用的，因为它给你一个参考如何添加元素通过ContentResolver不具有辅助功能。现在，这里的简单的方法：android.provider.Browser.saveBookmark（this，&#8220;Apress&#8221;，url）；帮助函数会启动一个对话框，要求用户确认增加书签。这可能是最用户友好的方式来添加书签，除非你想控制对话框的模样。 </p>
<p>平衡早餐的组成 </p>
<p>在过去的三个例子你探讨了Android的所有主要构建模块。一开始你看到了实用的启动画面。这让你探索了基本知识关于启动、维护和移动通过Activity对象。这是你学习intents and interprocess/object communication迈出的第一步。使用和传递意图在活动，服务，内容处理，接收器和意图之间可能是一个最重要的事情，这是Android与其他移动环境的区别。 </p>
<p>对于Activity和通信基础知识，你已经有了经验，你继续学习服务和意图接收器。要使用这两个组成部分，你烹调了 狡猾的 恶作剧应用程序，既能强迫你使用所有3个组建（活动，服务，和意图的接收器），使所有三个互相沟通。几乎是旁注，你研究什么需要得到通知时，短信在手机上到达。最后，你探讨如何检索和写入的内容是解析器本机设备：浏览器的书签数据库。事情的证明并非总是按计划进行，Android拒绝加入你在一个新的尝试通过传统的书签内容解析方法，该方法forcedthat我已经介绍的基本知识，现在是时候让手机用户在权衡多一点。 </p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/lihaifeng555/archive/2009/09/27/4599691.aspx">http://blog.csdn.net/lihaifeng555/archive/2009/09/27/4599691.aspx</a></p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/115027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-05-10 20:51 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/05/10/115027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android模拟器入门[转]</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/04/29/113953.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Thu, 29 Apr 2010 06:13:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/04/29/113953.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/113953.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/04/29/113953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/113953.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/113953.html</trackback:ping><description><![CDATA[原文地址：<a href="http://blog.csdn.net/kome2000/archive/2009/07/23/4374684.aspx">http://blog.csdn.net/kome2000/archive/2009/07/23/4374684.aspx</a><div><div class="tit" style="font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">Android模拟器入门[转]</div><div class="date" style="font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">2009-06-15 17:31</div><table border="0" style="table-layout: fixed; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><tbody><tr><td><div id="blog_text" class="cnt"><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">要玩google 手机 G1的模拟器，当然需要先去google上面下载Android的SDK，解压出来后在SDK的根目录下有一个tools文件夹，里面就是模拟器和一些非常有用的工具。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">双击&#8220;emulator.exe&#8221;，直接启动模拟器，简单吧。当然，如果要对模拟器进行一些定制，还是要从命令行调用，带上参数启动。下面就来介绍一下启动是常用的几个参数：</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">1.模拟器外观的定制：<br>480x320, landscape: emulator -skin HVGA-L<br>320x480, portrait : emulator -skin HVGA-P (default)<br>320x240, landscape: emulator -skin QVGA-L<br>240x320, portrait : emulator -skin QVGA-P</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">2.为模拟器加上SD卡：<br>emulator -sdcard D:\sdcard.img</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">下面我们再来说说如何创建"sdcard.img"文件：<br>&#8220;tools&#8221;目录下还有另外一个很好用的工具&#8220;mksdcard.exe&#8221;，一看名字就知道——make sdcard。对，就用它来创建一个&#8220;SD卡&#8221;。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">命令为：<br>mksdcard 1024M D:\sdcard.img</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">OK,这样一个容量为1G的SD卡就创建完毕了。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">使用SDCard:</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">创建: mksdcard &lt;1024M&gt; &lt;sdcard.img&gt;<br>(bytes(default)，K，M)</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">连接到模拟器: emulator -sdcard &lt;目录/sdcard.img&gt;</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">传文件到SDCard: adb push &lt;目录/audio.mp3&gt; &lt;/sdcard/audio.mp3&gt;</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">&nbsp;</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">玩过手机模拟器的人一般最感兴趣的当然是模拟器能做什么呢？下面一一道来：</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">GPhone的模拟器有个特有的号码：15555218135，这个就类似我们实体手机的SIM卡号码啦。要实现拨号，用手机？当然不行！</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">更简单，三步：<br>1.运行 cmd<br>2.连接: telnet localhost 5554<br>3.命令:gsm call 15555218135</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">look！是不是模拟器上显示来电了？接听/挂断和实体手机一样。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">发短信也一样简单，重复上面1，2两步，第三部命令改一下：<br>sms send 15555218135 Hello,this is a Message.</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">来说说PC与模拟器文件传输的方法吧。这里需要用到另一个重要工具，也在&#8220;tools&#8221;目录下，&#8220;adb.exe&#8221;。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; "><strong>adb:</strong></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">adb(<span class="t_tag" style="line-height: 19px; ">Android</span>&nbsp;Debug Bridge)是<span class="t_tag" style="line-height: 19px; ">Android</span>&nbsp;提供的一个通用的调试工具，借助这个工具，我们可以管理设备或<span class="t_tag" style="line-height: 19px; ">手机</span>&nbsp;<span class="t_tag" style="line-height: 19px; ">模拟器</span>&nbsp;的<span class="t_tag" style="line-height: 19px; ">状态</span>&nbsp;。还可以进行以下的操作：<br>1、快速更新设备或手机模拟器中的代码，如应用或Android系统升级；<br>2、在设备上运行shell命令；<br>3、管理设备或手机模拟器上的预定端口；<br>4、在设备或手机模拟器上复制或粘贴文件</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">一些常用的操作：</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">进入Shell: adb shell</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">通过上面的命令，就可以进入设备或模拟器的shell环境中，在这个<span class="t_tag" style="line-height: 19px; ">Linux</span>&nbsp;Shell中，你可以执行各种<span class="t_tag" style="line-height: 19px; ">Linux</span>&nbsp;的命令，另外如果只想执行一条shell命令，可以采用以下的方式：<br>adb shell [command]<br>如：adb shell dmesg会打印出内核的调试信息。<br>(Android的linux shell做了大量精简，很多linux常用指令都不支持)</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">上传文件: adb push &lt;PC文件&gt; &lt;/tmp/...&gt;<br>下载文件: adb pull &lt;/tmp/...&gt; &lt;PC文件&gt;</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">安装程序: adb install &lt;*.apk&gt;<br>卸载软件: adb shell rm /data/app/&lt;*.apk&gt;</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">补充一点，通过adb安装的软件(*.apk)都在"/data/app/"目录下，所以安装时不必制定路径，卸载只需要简单的执行"rm"就行。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">结束adb: adb kill-server</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">显示android模拟器状态:<br>adb devices (端口信息)<br>adb get-product (设备型号)<br>adb get-serialno (序列号)</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">等待正在运行的设备: adb wait-for-device</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">端口转发: adb forward adb forward tcp:5555 tcp:1234&nbsp;<br>(将默认端口TCP 5555转发到1234端口上)</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">查看bug报告: adb bugreport</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">adb shell sqlite3 访问数据库SQLite3&nbsp;<br><span style="line-height: 19px; color: rgb(160, 82, 45); "><span style="line-height: 19px; color: rgb(0, 0, 0); "><span style="line-height: 19px; color: rgb(0, 0, 0); ">adb shell logcat -b radio 记录无线通讯日志：</span></span>&nbsp;</span>一般来说，无线通讯的日志非常多，在运行时没必要去记录，但我们还是可以通过命令，设置记录：</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">应用程序配置文件:<br>"AndroidManifest.xml"中<br>"&lt;category android:name="android.intent.category.LAUNCHER" /&gt;"<br>决定是否应用程序是否显示在Panel上</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">-----------------------------------------------------------------------------------</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">am指令(在shell内使用am来加载android应用):<br>am [start|instrument]&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>am start [-a &lt;ACTION&gt;]&nbsp;<br>&nbsp;&nbsp; [-d &lt;DATA_URI&gt;]<br>&nbsp;&nbsp; [-t &lt;MIME_TYPE&gt;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; [-c &lt;CATEGORY&gt; [-c &lt;CATEGORY&gt;] ...]&nbsp;&nbsp;<br>&nbsp;&nbsp; [-e &lt;EXTRA_KEY&gt; &lt;EXTRA_VALUE&gt; [-e &lt;EXTRA_KEY&gt; &lt;EXTRA_VALUE&gt; ...]<br>&nbsp;&nbsp; [-n &lt;COMPONENT&gt;] [-D] [&lt;URI&gt;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">am instrument [-e &lt;ARG_NAME&gt; &lt;ARG_VALUE&gt;]&nbsp;<br>&nbsp;&nbsp; [-p &lt;PROF_FILE&gt;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; [-w] &lt;COMPONENT&gt;</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">启动浏览器:<br>am start -a android.intent.action.VIEW -d&nbsp;<a href="http://www.google.cn/" style="text-decoration: none; color: rgb(29, 88, 209); ">http://www.google.cn/</a></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">拨打电话:<br>am start -a android.intent.action.CALL -d tel:10086</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">启动google map直接定位到北京:<br>am start -a android.intent.action.VIEW geo:0,0?q=beijing</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">-----------------------------------------------------------------------------------</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; "><strong>目录：</strong><br># ls<br>ls<br>sqlite_stmt_jou<br>cache<br>sdcard<br>etc<br>init<br>init.goldfish.r<br>init.rc<br>data<br>system<br>proc<br>sys<br>sbin<br>default.prop<br>root<br>dev</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">这里要说明下，从andorid中得到的文件流的字符串的顺序是按&#8220;类型+权限+拥有者+数组+大小+日期+名称+链接到&#8221;顺序排列的，其中类型&#8220;d&#8221;表示的是文件夹，"l"表示的是链接,'-'表示的是文件。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">例如d rwxrwx--- system&nbsp;&nbsp; cache&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2009-01-09 11:46&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cache</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">上面的目录就是通过解析ls命令返回的字符串进行解析的。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">-----------------------------------------------------------------------------------</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; "><strong>数据库:</strong></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">联络人(含通话记录)数据库：/data/data/com.android.providers.contacts/databases/contacts.db<br>媒体库(貌似记录铃声设置等信息): /data/data/com.android.providers.media/internal.db<br>系统设置: /data/data/com.android.providers.settings/databases/settings.db<br>短信库: /data/data/com.android.providers.telephony/databases/mmssms.db<br>Web设置: /data.data/com.android.settings/databases/webview.db<br>地图搜索历史记录:/data/data/com.google.android.apps.maps/databases/search_history.db<br>帐号库?(内含androidId信息) : /data/data/com.google.android.googleapps/databases/accounts.db</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">铃声: /system/media/audio<br>时区设置: /data/property/persist.sys.timezone</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">-----------------------------------------------------------------------------------<br><strong>目前的安装模式<br></strong>　　安装前：<br>　　1. emulator -wipe-data<br>　　2. adb push busybox ./<br>　　3. adb shell ./busybox tar -cf /tmp/data.tar /data<br>　　4. adb pull /tmp/data.tar .<br>　　5. mkdir original<br>　　6. cd original<br>　　7. tar -xf ../data.tar</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">　　安装后：<br>　　1. adb shell ./busybox tar -cf /tmp/data.tar /data<br>　　2. adb pull /tmp/data.tar .<br>　　3. mkdir after_install<br>　　4. cd after_install<br>　　5. tar -xf ../data.tar<br>　　<br>&nbsp;&nbsp;&nbsp; 目前来看，就是/data/app和data/data下多了两个相关文件，同时在/data/system/packages.xml中增加了安装的程序信息。似乎菜单也是从这个文件中得到是否新安装程序，以及如何显示相关信息比如名称什么的。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; "><strong>android模拟器和真机的不同之处：</strong></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; ">&nbsp;&nbsp;&nbsp; * 不支持呼叫和接听实际来电；但可以通过控制台模拟电话呼叫(呼入和呼出)<br>&nbsp;&nbsp;&nbsp; * 不支持USB连接<br>&nbsp;&nbsp;&nbsp; * 不支持相机/视频捕捉<br>&nbsp;&nbsp;&nbsp; * 不支持音频输入(捕捉)；但支持输出(重放)<br>&nbsp;&nbsp;&nbsp; * 不支持扩展耳机<br>&nbsp;&nbsp;&nbsp; * 不能确定连接状态<br>&nbsp;&nbsp;&nbsp; * 不能确定电池电量水平和交流充电状态<br>&nbsp;&nbsp;&nbsp; * 不能确定SD卡的插入/弹出<br>&nbsp;&nbsp;&nbsp; * 不支持蓝牙</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; font-size: 13px; line-height: 19px; "><strong>andoroid模拟器使用注意：<br></strong>平时使用emulator测试开发的网友注意应该定期清理下C:\Documents and Settings\sh\Local Settings\Temp\AndroidEmulator文件夹，由于Android模拟器每次运行时会临时生成几个.tmp后缀的临时文件，没有几个月功夫简单一看竟然占用磁盘空间高达5GB之多。这些文件网友可以安全的删除</p></div></td></tr></tbody></table></div><img src ="http://www.cppblog.com/AutomateProgram/aggbug/113953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-04-29 14:13 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/04/29/113953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android 中驱动的自动安装。</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/04/27/113712.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Tue, 27 Apr 2010 06:56:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/04/27/113712.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/113712.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/04/27/113712.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/113712.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/113712.html</trackback:ping><description><![CDATA[今天看过了apkok.exe的apk安装软件，能自动的帮你安装驱动，<br>之前没有怎么做过，在codeproject中找了篇文章：<a href="http://www.codeproject.com/KB/system/DevMgr.aspx"><br>http://www.codeproject.com/KB/system/DevMgr.aspx</a>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/113712.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-04-27 14:56 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/04/27/113712.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android全屏显示</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/04/26/113647.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Mon, 26 Apr 2010 13:35:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/04/26/113647.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/113647.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/04/26/113647.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/113647.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/113647.html</trackback:ping><description><![CDATA[<p>android中全屏显示<br>1.设置为无通知栏<br>2.设置为无标题栏<br><br>package com.pp.myAdu.util;</p>
<p>import android.app.Activity;<br>import android.view.Window;<br>import android.view.WindowManager;</p>
<p>public class ActivityUtil {<br>&nbsp;public static void noTitleBar(Activity activity){<br>&nbsp;&nbsp;activity.requestWindowFeature(Window.FEATURE_NO_TITLE); <br>&nbsp;}<br>&nbsp;<br>&nbsp;public static void noNotificationBar(Activity activity){<br>&nbsp;&nbsp;final Window win = activity.getWindow(); <br>&nbsp;&nbsp;win.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);<br>&nbsp;}<br>&nbsp;public static void fullScreen(Activity activity){<br>&nbsp;&nbsp;noTitleBar(activity);<br>&nbsp;&nbsp;noNotificationBar(activity);<br>&nbsp;}<br>}<br><br><br>奇怪的是2.0以上的版本，<br>要在.xml中设置<br>AndroidManifest.xml&nbsp; &nbsp;中activity 加 android:theme="@android:style/Theme.NoTitleBar"AndroidManifest.xml&nbsp; &nbsp;中activity 加 android:theme="@android:style/Theme.NoTitleBar"<br><br>屏幕大小 320 - 480 480-720</p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/113647.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-04-26 21:35 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/04/26/113647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android动画实现</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/04/26/113637.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Mon, 26 Apr 2010 12:35:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/04/26/113637.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/113637.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/04/26/113637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/113637.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/113637.html</trackback:ping><description><![CDATA[eoeAndroid中的文章：<a href="http://www.eoeandroid.com/thread-653-1-1.html">http://www.eoeandroid.com/thread-653-1-1.html</a>&nbsp; <br><a href="http://www.eoeandroid.com/viewthread.php?tid=4477&amp;highlight=%E5%B1%B1%E5%AF%A8">http://www.eoeandroid.com/viewthread.php?tid=4477&amp;highlight=%E5%B1%B1%E5%AF%A8</a> 
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/113637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-04-26 20:35 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/04/26/113637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何导入android中的sample例子</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/04/26/113617.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Mon, 26 Apr 2010 09:47:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/04/26/113617.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/113617.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/04/26/113617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/113617.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/113617.html</trackback:ping><description><![CDATA[<h1>
<h1>原文地址：<a href="http://www.chinaandroid.com/redirect.php?tid=123&amp;goto=lastpost&amp;styleid=13">http://www.chinaandroid.com/redirect.php?tid=123&amp;goto=lastpost&amp;styleid=13</a></h1>
<p>&nbsp;</p>
很多学习android的朋友都想看看安装目录里面sample的效果,但是使用file--&gt;import ... 选择了root directory 后 下面的project没有项目选择.试试这样做:File--&gt;new--&gt;android project --&gt;选择create project from existing source ...--&gt;选择目录,如果目录选择后Build target没有选择,自己勾选一下--&gt;finish,1.5的sdk一般导入时会自动勾选build target的,导入后也不会有什么问题,担不是1.5的,然后build target选择的是1.5的,项目导入进来后,src的包里面会有一个R.java文件,gen目录下面也有一个R.java文件,此时,删除掉src的包里面的那个R.java文件就可以了,1.0版本的一些功能1.5不支持,比如说Phone,1.0有Phone这个类,里面有挂掉电话的方法,但1.0以上的版本不支持这个了,有这种情况的话就用1.0的target喽 ...</h1>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/113617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-04-26 17:47 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/04/26/113617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android开源项目和web在线查看</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/04/24/113417.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sat, 24 Apr 2010 03:39:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/04/24/113417.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/113417.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/04/24/113417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/113417.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/113417.html</trackback:ping><description><![CDATA[android源代码web查看：<br><a href="http://www.netmite.com/android/mydroid/">http://www.netmite.com/android/mydroid/</a><br><a href="http://android.git.kernel.org/">http://android.git.kernel.org/</a><br><br>现在android的开源项目已经很多了，<br>在这个地址有详细的分类：<br><a href="http://www.androidosi.com/index.php">http://www.androidosi.com/index.php</a><br><br>rockon-android（android音乐播放器）<br><strong>svn 下载地址：</strong><a href="http://rockon-android.googlecode.com/svn/trunk/">http://rockon-android.googlecode.com/svn/trunk/</a><br>一个3d的播放器。 <br><br>进程管理器<br><font face="Courier New"><strong><em>http</em></strong>://freetaskmanager.googlecode.com/svn/trunk/</font> <br><br>code 上的代码：<br><a href="http://code.google.com/hosting/search?q=label%3aAndroid">http://code.google.com/hosting/search?q=label%3aAndroid</a> <br><br><br>
<h1>Android 1.5 天气widget示例<br><a href="http://code.google.com/p/android-sky/" target=_blank><u><font color=#0000ff>http://code.google.com/p/<span class=t_tag onclick=tagshow(event) href="tag.php?name=android">android</span>-sky/</font></u></a></h1>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/113417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-04-24 11:39 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/04/24/113417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>