《Android 应用案例开发大全(第二版)》——6.6节Android源代码与过滤器

本节书摘来自异步社区《Android 应用案例开发大全(第二版)》一书中的第6章,第6.6节Android源代码与过滤器,作者李宁,更多章节内容可以访问云栖社区“异步社区”公众号查看

6.6 Android源代码与过滤器
Android开发权威指南(第二版)
第X问1 源代码目录:src/ch06/AndroidSrcFilter

只从Android官方文档中获取所有的过滤器、Action等信息是不可能的,因为这些文档的编写者未必参与了Android的设计,所以并不一定对Android相关方面的细节描述得特别清楚,而且还有不少错误。因此这就需要我们从其他地方来获取这些知识,例如Android源代码、反编译APK程序等。本节只讨论如何利用Android源代码获取与过滤器相关的信息,在下一节会介绍如何通过反编译的方式获取同样的信息。在本书的其他章节还会继续与读者一起通过分析Android源代码、反编译各种资源的方式获取更多、更权威的信息。

6.6.1 系统内置程序有哪些窗口可以利用
到现在为止已经可以使用多种方式调用另一个应用程序的窗口了,但可能很多读者一直有一个疑问,如果是调用其他应用程序(不是自己编写的程序)中的窗口,又是如何得知这些程序中哪些窗口提供了Action,哪些窗口可以通过显式方式调用呢?这些问题的答案将在本节和下一节为读者揭晓。

在Intent类中定义了一些Action常量,这些常量用来调用系统的一些窗口或接收系统广播。通常选中某一个常量后会在弹出的提示信息框中显示与该窗口相关的解释,如图6-8所示。


7914764f70771c84b280f830c8c128259c5a5324

尽管Intent类中定义了用于调用系统窗口的常量,但并没有为全部的Action定义常量,而且可能有一些解释不太清楚,所以需要采用下面的方法获取更详细的信息。

由于任何Android应用程序的所有窗口都必须在AndroidManifest.xml文件中声明,所以只要获取相应内置程序的AndroidManifest.xml文件的源代码即可。虽然可以通过获取APK文件的方式得到AndroidManifest.xml文件的内容1。但由于系统内置程序的APK文件都在系统的目录中(/system/app),如果没有root权限根本访问不了该目录,更别提获取APK文件了2。尽管熟悉Linux的读者知道可以用su或sudo命令暂时将用户权限提升到root。但很多手机安装的Android系统根本就没有su或sudo命令,所以为了方法更通用,本节采用了直接查看Android源代码的方法(为了方便读者,在随书光盘中已经包含了最新的Android源代码)获取我们需要的信息。

Android系统内置应用程序的源代码都放在了如下的目录:

/packages/apps
每一个应用以一个单独的目录存放,例如,下面是一些常用内置应用的目录。

Browser:浏览器。
Calculator:计算器。
Calendar:日历。
Camera:照相机。
Contacts:联系人。
PackageInstaller:APK安装器。有很多文件管理器在单击APK文件时可以进行安装,就是调用了PackageInstaller中的某个负责安装程序的窗口。
Phone:电话管理,包括拨号、来去电记录等窗口。
Settings:系统设置。
Launcher2:Android系统的启动程序。在系统启动后第一个运行的就是该程序,主要包括桌面、图标、程序列表等。经常提及的定制ROM,UI部分主要就是修改Launcher2。
下面几节会选一些典型的过滤器进行分析,并通过Java代码调用这些过滤器所在的窗口。

6.6.2 显示计算器(Calculator)
计算器是笔者最喜欢的一个程序,因为Calculator可能是唯一没有使用Android SDK内部API的程序,也就意味着Calculator可以单独提出来作为独立的第三方程序,并通过常规的方法安装到系统中。

对于很多初学者来说,由于并没有在Intent类中找到带Calculator的Activity Action,可能第一反应是系统不允许调用Calculator。不过在这里可以肯定地告诉大家,系统中所有带UI的内置程序都允许调用相应的窗口,只是有的Action或Category不太好找罢了。

现在先不考虑Intent类中定义的常量,首先来看看Calculator中AndroidManifest.xml文件的源代码。Calculator程序只有一个窗口类(Calculator),因此AndroidManifest.xml文件的内容也很简单,下面是声明Calculator类的代码。

<activity android:name="Calculator" 
     android:theme="@android:style/Theme.Holo.NoActionBar"
     android:windowSoftInputMode="stateAlwaysHidden">
  <intent-filter>
     <action android:name="android.intent.action.MAIN" />
     <category android:name="android.intent.category.DEFAULT" />
     <category android:name="android.intent.category.LAUNCHER" />
     <category android:name="android.intent.category.APP_CALCULATOR" />
  </intent-filter>
</activity>

从这些声明代码可以看出,Calculator只有一个过滤器,在该过滤器中有1个Action和3个Category。读者可以对照6.5节介绍的过滤机制,想一想如何调用Calculator,然后再看下面的内容。

可能通常认为android.intent.action.MAIN是给系统用的,与第三方程序无关。实际上,该Action不仅系统可以调用,第三方程序同样也可以调用。后面定义的3个Category指定一个就可以,不过指定前两个,系统中肯定有重复的定义。所以通常使用下面的代码调用Calculator。

public void onClick_Calculator(View view)
{
  Intent intent = new Intent("**android.intent.action.MAIN**");
  intent.addCategory("**android.intent.category.APP_CALCULATOR**");
  startActivity(intent);
}
当然,android.intent.action.MAIN 和android.intent.category.APP_CALCULATOR在Intent类中已经定义了,所以也可以使用下面的代码调用Calculator。

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_APP_CALCULATOR);
startActivity(intent);

如果Intent类中已经为某些Action和Category定义了常量,应尽量使用这些常量,而不要直接使用字符串形式的Action和Category。因为如果应用程序中的相应Action和Category改变,可能会影响窗口的调用者,尽管发生这种情况的可能性并不大。在不知道具体的Action或Category定义的常量名的情况下,可以通过查看Android源代码获取相应的字符串形式的Action和Category,然后在Eclipse中跟踪进Intent类,并查找这些字符串,这样就可以很容易找到相应的常量。例如,Intent.ACTION_MAIN和Intent.CATEGORY_APP_CALCULATOR的定义代码如下:

public static final String ACTION_MAIN = "android.intent.action.MAIN";
public static final String CATEGORY_APP_CALCULATOR =
                "android.intent.category.APP_CALCULATOR";

在6.4节的例子中曾使用了显式的方式调用Calculator,这一点从本节给出的Calculator类的声明代码中更容易理解。不过笔者仍然建议尽可能使用隐式方式调用系统的窗口,除非别无选择,才使用显式的方式调用窗口。

注意

Calculator只能简单地显示主窗口,并不能向主窗口传递任何值。由于声明Calculator时未指定Data,所以自然无法传递Uri和Mime Type了。当然还可以通过Extra向主窗口传递数据,不过这就需要直接查看Calculator的源代码了。经过笔者查看,Calculator并没有处理Extra,所以自然也无法通过Extra传递数据了。

6.6.3 用浏览器(Browser)显示网页
在5.7.4小节曾使用下面的代码调用浏览器显示指定的页面。

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://blog.csdn.net/
nokiaguy"));
startActivity(intent);

在代码中使用了Intent.ACTION_VIEW作为Activity Action。Intent.ACTION_VIEW常量的值是android.intent.action.VIEW,在系统中的很多窗口都包含该Action。例如,Browser程序在声明主窗口类(BrowserActivity)时就定义了很多过滤器,这些过滤器有很多都指定了该Action。下面的代码就是其中一个过滤器,也是上面的代码能够匹配的过滤器。

<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="**android.intent.category.BROWSABLE**" />
  <data android:scheme="http" />
  <data android:scheme="https" />
  <data android:scheme="about" />
  <data android:scheme="javascript" />
</intent-filter>

在过滤器中除了前面提到的android.intent.action.VIEW外,还指定了两个Category,以及4个Data。现在先说说android.intent.category.BROWSABLE。由于android.intent.action.VIEW在系统中已经被很多过滤器指定了,这些过滤器可能属于不同的窗口。所以只使用该Action可能会有多个窗口符合条件,这也会增大出现选择列表的可能性。因此,调用浏览器时应加上android.intent.category.BROWSABLE,以便尽可能减小显示选择列表的可能性(因为多一个条件,系统中符合所有条件的过滤器就越少),代码如下:

public void onClick_Calculator(View view)
{
    Intent intent = new Intent("android.intent.action.MAIN");
    // Intent.CATEGORY_BROWSABLE是android.intent.category.BROWSABLE对应的常量
  intent.addCategory(Intent.CATEGORY_BROWSABLE);**
  startActivity(intent);
}

最后看一看过滤器中指定的4个Data。通过这4个Data指定了4个scheme:http、https、about和javascript。也就是说Uri必须以如下4个字符串中的一个作为前缀(scheme是以冒号结尾的)。

http:
https:
about:
javascript:

其中about:表示空的内容(什么也不显示),但浏览器地址栏中会显示“about:”,其他3个都需要跟实质性的内容,例如http://www.example.com/abc.html

我们会发现,使用这个过滤器必须要指定Uri,但如果不想指定Uri该怎么办呢?可能有的读者会将上面代码中Intent类的构造方法第2个参数去掉,不过执行代码后会发现抛出异常,说明声明BrowserActivity类时根本就没有定义这样的过滤器。不过BrowserActivity的过滤器还有很多,经过仔细查找,还是找到了如下的过滤器。

<intent-filter>
  <action android:name="android.intent.action.MAIN" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.LAUNCHER" />
  <category android:name="android.intent.category.BROWSABLE" />
  <category android:name="android.intent.category.APP_BROWSER" />
</intent-filter>

这个过滤器并没有指定Data,但却有用于启动程序的Action和Category。说明这个过滤器的功能之一是给系统用于单击浏览器程序图标时显示BrowserActivity窗口的。不过最后又定义了两个Category:android.intent.category.BROWSABLE和android.intent.category.APP_BROWSER。因此可以直接用android.intent.action.MAIN和这两个Category显示BrowserActivity,代码如下:

Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory(Intent.CATEGORY_BROWSABLE);
// Intent.CATEGORY_APP_BROWSER是android.intent.category.APP_BROWSER对应的常量
intent.addCategory(Intent.CATEGORY_APP_BROWSER);
startActivity(intent);

但要注意最好不要单独只用其中一个Category,否则可能会有多个过滤器满足过滤条件,这就有可能显示选择列表了。例如,只指定Intent.CATEGORY_BROWSABLE,可能会显示如图6-9所示的选择列表。可以看到,Browser、People和Phone程序中都有窗口满足过滤条件。

image

答疑解惑:为什么显式调用浏览器会导致Uri无效

在6.4节中曾在InvokeOtherActivity程序中使用显式的方式调用了WebBrowser中的主窗口用于显示指定的网页,在这个例子中程序可以完美地运行。但如果我们使用这种方法显式调用系统内置的浏览器会发现,尽管浏览器可以成功调用,但往里传入的Uri却无效了。究其原因是因为在我们实现的WebBrowser程序的主窗口类的onCreate方法中不管三七二十一都从Intent.getData方法中获取了Uri,所以无论何种情况,只要主窗口成功显示,就一定会获取传入的Uri。而系统内置的浏览器对Action进行了验证。只有在Action和Category符合要求的情况下才会继续读取Data中的数据。

系统浏览器在启动时会通过Intent.getAction方法返回一个Action,如果要让该方法返回非空值,必须使用下面两种方法调用窗口。>

隐式调用窗口。
单击程序图标启动程序。
第1种情况就不需要多讲了,因为已经为窗口指定了一个Action,Intent.getAction方法返回的就是这个Action。而第2种情况Intent.getAction方法返回了android.intent.action.MAIN。读者可以在onCreate方法中加入如下的代码,看看在启动程序时是否会在LogCat视图输出这个Action。

if (getIntent().getAction() != null)
  Log.d("action", getIntent().getAction());

如果直接使用显式方法调用窗口,Intent.getAction方法会返回null。而从本节前面给出的过滤器代码可知,要处理Uri,Action必须是android.intent.action.VIEW。所以如果显式调用浏览器的BrowserActivity窗口,根本不可能通过Action检测,因此当然不会执行到接收Uri的代码了,这也是为什么显式调用系统浏览器显示网页后,Uri会被忽略的原因。

6.6.4 拨打电话(Phone)与授权
拨打电话在5.7.1小节已经介绍过了,现在再来回顾一下拨号的过程,代码如下:

Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:12345678"));
startActivity(callIntent);

其中Intent.ACTION_CALL的值是android.intent.action.CALL。现在来研究一下具体哪个程序中的哪个窗口来响应上面代码的请求。

由于本功能是拨打电话,所以很自然就会想到是调用了Phone程序中的某个窗口。打开该程序的AndroidManifest.xml文件后,根据android.intent.action.CALL会找到如下的过滤器。

<intent-filter>
  <action android:name="android.intent.action.CALL" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="tel" />
</intent-filter>

从这段过滤器的代码中会看到除了指定Action和Category外,还指定了一个叫tel的scheme。所以通过Uri指定电话号时一定要指定“tel:”前缀(由于Uri区分大小写,所以不能写成TEL、Tel等形式)。

到这里还不算完,我们会发现只执行前面两行代码会抛出异常,异常的大概意思是没有权限调用拨号窗口。出现这个问题的关键是拨号盘的权限设置,也就是上面过滤器所在的窗口类,该类的声明代码如下:

<activity android:name="OutgoingCallBroadcaster"
    android:theme="@style/OutgoingCallBroadcasterTheme"
    android:permission="android.permission.CALL_PHONE**"**
    android:screenOrientation="portrait"
    android:configChanges="orientation|screenSize|keyboardHidden">
  ……
</activity>

从拨号盘类(OutgoingCallBroadcaster)的声明代码可以看出,在标签中设置了android:permission属性,并指定了android.permission.CALL_PHONE权限,所以在调用者的AndroidManifest.xml文件中要加入如下的代码才可以成功进行拨号。


9f9a1a4103f441be24cf9f979a1edb5cb13967b9

前面已经有很多代码涉及Uri。Uri的标准格式是“xxx://host:port/path”。但有的Uri并未指定“//”,例如“tel:12345678”。实际上这是由相应的程序进行处理的,因为如果不指定“//”,是无法通过Uri.getHost方法获取Host的,自然也就无法获取电话号的。不过处理来去电的程序(Phone)会从“tel:12345678”中解析出电话号。如果某些程序只能从Uri的host中获取数据,那就必须加“//”了。
1 APK文件就是zip压缩包,只要解压就可以得到APK文件中的资源。不过Java源代码和XML文件(包括AndroidManifest.xml)都是编译后的,需要一些工具反编译。在6.7节会介绍如何反编译AndroidManifest.xml文件。
2 Android模拟器默认就是有root权限的,所以可以从Android模拟器中获得大多数系统内置的APK程序(但有些程序没有包含在Android模拟器中,如Google Play),分析这些APK的方法会在6.7节详细讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
google android sdk开发范例大全 第二版 PDF 和 随书光盘代码 ISBN:9787115229649 目录 第1章 了解、深入、动手做   1.1 红透半边天的Android   1.2 本书目的及范例涵盖范围   1.3 如何阅读本书   1.4 使用本书范例   1.5 参考网站  第2章 Android初体验   2.1 安装Android SDK与ADT/DDMS   2.2 创建第一个Android项目(Hello Android!)   2.3 Android应用程序架构——从此开始   2.4 可视化的界面开发工具   2.5 部署应用程序到Android手机  第3章 用户人机界面   3.1 更改与显示文字标签   3.2 更改手机窗口画面底色   3.3 更改TextView文字颜色   3.4 置换TextView文字   3.5 取得手机屏幕大小   3.6 样式化的定型对象   3.7 简易的按钮事件   3.8 手机页面的转换   3.9 调用另一个Activity   3.10 不同Activity之间的数据传递   3.11 返回数据到前一个Activity   3.12 具有交互功能的对话框   3.13 置换文字颜色的机关   3.14 控制不同的文字字体   3.15 如iPhone拖动相片特效   3.16 自制计算器   3.17 关于(About)程序信息   3.18 程序加载中,请稍候   3.19 全屏幕以按钮重写   3.20 今晚到哪儿打牙祭   3.21 Android变脸   3.22 打勾显示输入的密码   3.23 Android多语系支持  第4章 史上超豪华的手机控件   4.1 EditText与TextView共舞   4.2 设计具有背景图的按钮   4.3 给圣诞老人的信息   4.4 我同意条款   4.5 消费券采购列表   4.6 向左或向右   4.7 专业相框设计   4.8 自定义下拉菜单模式   4.9 动态添加/删除的Spinner菜单   4.10 心爱小宝贝相片集   4.11 快速地搜索手机文件引擎   4.12 按钮也能随单击变换   4.13 具自动提示功能的菜单   4.14 数字及模拟小时钟设计   4.15 动态输入日期与时间   4.16 猜猜红桃A在哪儿   4.17 后台程序运行进度提示   4.18 动态文字排版   4.19 在Activity里显示列表   4.20 以动态列表配置选项   4.21 查找程序根目录下所有文件   4.22 加载手机磁盘里的图片文件   4.23 动态放大缩小ImageView里的图片   4.24 动态旋转图片   4.25 猜猜我在想什么   4.26 离开与关闭程序的弹出窗口   4.27 隐藏式抽屉   4.28 手机桌面上的小玩意   4.29 手机图片搜索 .管.理. 器   4.30 实时配置桌面上的AppWidget UI Layout  第5章 交互式通信服务与手机控制   5.1 具有正则表达式的TextView   5.2 ACTION!CALL!拨打电话   5.3 自制发送短信程序   5.4 自制发送E-mail程序   5.5 自制日历手机数据库   5.6 手机震动的奏   5.7 图文可视化提醒   5.8 状态栏的图标与文字提醒   5.9 搜索手机通讯录自动完成   5.10 取得联系人资料   5.11 制作有图标的文件资源 .管.理. 器   5.12 还原手机默认桌面   5.13 置换手机背景图   5.14 获取手机现存桌面   5.15 文件资源 .管.理. 器再进化   5.16 取得目前File与Cache的路径   5.17 打开/关闭WiFi服务   5.18 取得SIM卡内的信息   5.19 调用拨号按钮   5.20 DPAD按键处理   5.21 任务 .管.理. 器正在运行的程序   5.22 动态更改屏幕方向   5.23 系统设置更改事件   5.24 取得电信网络与手机的相关信息   5.25 建立自己的手写笔画图案  第6章 手机自动服务纪实   6.1 您有一条短信pop up提醒   6.2 手机电池计量还剩多少   6.3 群发拜年短信给联系人   6.4 开始与停止系统服务   6.5 通过短信发送E-mail通知   6.6 手机拨接状态   6.7 有来电,发送邮件通知   6.8 存储卡剩余多少容量   6.9 访问本机内存与存储卡   6.10 实现可定时响起的闹钟   6.11 黑名单来电自动静音   6.12 手机翻背面即静音震动   6.13 指定时间置换桌面背景   6.14 判断发送短信后的状态   6.15 后台服务送出广播信息   6.16 开机程序设计   6.17 双向短信常驻服务   6.18 测量电池温度   6.19 电池电量显示Widget小工具   6.20 取出通讯录数据及多组电话号码   6.21 电子精确罗盘   6.22 屏幕手写事件判断   6.23 画一颗心,打电话给HONEY  第7章  .娱.乐. 多媒体   7.1 访问Drawable资源的宽和高   7.2 绘制几何图形   7.3 手机屏幕保护程序   7.4 用手指移动画面里的照片   7.5 加载存储卡的Gallery相簿   7.6 取得手机内置媒体中的图片文件   7.7 相片导航向导与设置背景桌面   7.8 调整音量大小   7.9 播放mp3资源文件   7.10 播放存储卡里的mp3音乐   7.11 自制录音/播放录音程序   7.12 通过收到短信开始秘密录音   7.13 内置影片播放器载入3gp电影   7.14 自制3gp影片播放器   7.15 相机预览及拍照临时文件   7.16 拍照瞬间启动相机自动对焦   7.17 制作开场动画   7.18 我的手机会说话   7.19 手势触控屏幕控制   7.20 多点触控屏幕事件捕捉  第8章 当Android与Internet接轨   8.1 HTTP GET/POST传递参数   8.2 在程序里浏览网页   8.3 嵌入HTML标记的程序   8.4 设计前往打开网页功能   8.5 将网络图像网址放入Gallery中显示   8.6 即时访问网络图片文件展示   8.7 手机气象局,实时卫星云图   8.8 通过网络播放mp3   8.9 设置远程下载音乐为手机铃声   8.10 远程下载桌面背景图案   8.11 将手机文件上传至网站服务器   8.12 移动博客发布器   8.13 移动RSS阅读器   8.14 远程下载安装Android程序   8.15 手机下载看3gp影片   8.16 访问网站Login API   8.17 地震速报   8.18 通过Web API动态更改手机Spinner控件   8.19 网络语音搜索   8.20 网络下载过程中显示加载中   8.21 快照WebView加载的网页画面   8.22 网页的放大与缩小  第9章 Google服务与Android完美整合   9.1 Google账号验证Token   9.2 Google搜索   9.3 前端产生QR Code二维条形码   9.4 以经纬度查找目的地位置   9.5 GPS Google .地.图.    9.6 移动版Google Map   9.7 规划导航路径   9.8 移动设备上的Picasa相册   9.9 随身翻译机  第10章 创意Android程序设计   10.1 手机手电筒   10.2 GPS轨迹记录器   10.3 女性贴身看护   10.4 手机QR Code二维条形码生成器   10.5 Android QR Code二维条形码扫描仪   10.6 上班族今天中午要吃什么   10.7 掷杯筊   10.8 电蚊香   10.9 转转轮盘——Lucky!   10.10 任务 .管.理. 器   10.11 免费的云端发音字典   10.12 动起来!手机桌面上会动的动态桌布  附录 如何发布程序到Android Market   A.1 支付Google Android Market注册费   A.2 生成签署凭证 .keystore金钥档案   A.3 上传*.apk程序到Android Market上 
Google Android SDK开发范例大全(完整版)共4个分卷 目录 第1章 了解.深入.动手做. 1.1 红透半边天的Android 1.2 本书目的及涵盖范例范围 1.3 如何阅读本书 1.4 使用本书范例 1.5 参考网站 第2章 Android初体验 2.1 安装AndroidSDK与ADTplug-in 2.2 建立第一个Android项目(HelloAndroid!) 2.3 Android应用程序架构——从此开始 2.4 可视化的界面开发工具 2.5 部署应用程序到Android手机 第3章 用户人机界面 3.1 更改与显示文字标签——TextView标签的使用 3.2 更改手机窗口画面底色——drawable定义颜色常数的方法 3.3 更改TextView文字颜色——引用Drawable颜色常数及背景色 3.4 置换TextView文字——CharSequence数据类型与ResourceID应用 3.5 取得手机屏幕大小——DisplayMetrics取得画面宽高的方法 3.6 样式化的定型对象——Style样式的定义 3.7 简易的按钮事件——Button事件处理 3.8 手机页面的转换——setContentView的应用 3.9 调用另一个Activity——Intent对象的使用 3.10 不同Activity之间的数据传递——Bundle对象的实现 3.11 返回数据到前一个Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 3.13 置换文字颜色的机关——Button与TextView的交互 3.14 控制不同的文字字体——Typeface对象使用 3.15 如iPhone拖动相片特效——Gallery画廊 3.16 自制计算器——多按钮的整合应用 3.17 关于(About)程序信息——Menu功能菜单程序设计 3.18 程序加载中,请稍后——ProgressDialog与线程整合应用 3.19 全屏幕以按钮覆盖——动态产生按钮并最大化 3.20 今晚到哪儿打牙祭?——具选择功能的对话框 3.21 Android变脸——主题(Theme)实现 第4章 史上超豪华的手机控件 4.1 EditText与TextView共舞——setOnKeyListener事件 4.2 设计具有背景图的按钮——ImageButton的焦点及事件处理 4.3 给耶诞老人的信息——Toast对象的使用 4.4 我同意条款——CheckBox的isChecked属性 4.5 消费券采购列表——多选项CheckBox的应用 4.6 向左或向右——RadioGroup组与onCheckedChanged事件 4.7 专业相框设计——ImageView的堆栈应用 4.8 自定义下拉菜单模式——Spinner与setDropDownViewResource 4.9 动态添加/删除的Spinner菜单——ArrayList与Widget的依赖性 4.10 心爱小宝贝相片集——Gallery与衍生BaseAdapter容器 4.11 快速的搜索手机文件引擎——JavaI/O的应用 4.12 按钮也能随点击变换——ImageButton选择特效 4.13 具自动提示功能的菜单——AutoCompleteTextView与数组 4.14 数字及模拟小时钟设计——AnalogClock与DigitalClock的原理 4.15 动态输入日期与时间——DatePicker与TimePicker应用 4.16 猜猜红心A在那儿——ImageView点击事件与透明度处理 4.17 后台程序运行进度提示——ProgressBar与Handler的整合应用 4.18 动态文字排版——GridView与ArrayAdapter设计 4.19 在Activity里显示列表列表——ListView的布局 4.20 以动态列表配置选项——ListActivity与Menu整合技巧 4.21 查找程序根目录下所有文件——JavaI/O与ListActivity的结合.. 4.22 加载手机磁盘里的图文件——使用decodeFile方法 4.23 动态放大缩小ImageView里的图片——运用Matrix对象来缩放图文件 4.24 动态旋转图片——Bitmap与Matrix旋转ImageView 4.25 猜猜我在想什么——RadioButtonID 4.26 离开与关闭程序的弹出窗口——对话窗口上的ICON图标 第5章 交互式通信服务与手机控制 5.1 具有正则表达式的TextView——Linkify规则 5.2 ACTION!CALL!拨打电话——Intent.ACTION.CALL的使用 5.3 自制发送短信程序——SmsManager与PendingIntent对象 5.4 自制发送Email程序——Intent在Email上的使用 5.5 自制日历手机数据库——实现SQLiteOpenHelper 5.6 手机震动的奏——Vibrator对象及周期运用 5.7 图文可视化提醒——Toast与LinearLayoutView 5.8 状态栏的图标与文字提醒——NotificationManager与Notification对象的应用 5.9 搜索手机通讯录自动完成——使用ContentResolver 5.10 取得联系人资料——Provider.Contact的使用 5.11 制作有图标的文件资源管理器——自定义Adapter对象 5.12 还原手机默认桌面——重写clearWallpaper方法 5.13 置换手机背景图——Gallery与setWallpaper整合实现 5.14 撷取手机现存桌面——getWallpaper与setImageDrawable 5.15 文件资源管理器再进化——JavaI/O修改文件名及删除 5.16 取得目前File与Cache的路径——getCacheDir与getFilesDir 5.17 打开/关闭WiFi服务——WifiManager状态判断 5.18 取得SIM卡内的信息——TelephonyManager的应用 5.19 调用拨号按钮——打电话CALL_BUTTON 5.20 DPAD按键处理——onKeyDown事件与Layout坐标交互 5.21 任务管理器正在运行的程序——RunningTaskInfo 5.22 动态更改屏幕方向——LANDSCAPE与PORTRAIT 5.23 系统设置更改事件——onConfigurationChanged信息处理 5.24 取得电信网络与手机相关信息——TelephonyManager与android.provider.Settings.System的应用 第6章 手机自动服务纪实 6.1 您有一条短信popup提醒——常驻BroadcastReceiver的应用 6.2 手机电池计量还剩多少——使用BroadcastReceiver捕捉Intent.ACTION_BATTERY_CHANGED 6.3 群发拜年短信给联系人——ACTION_PICK与Uri对象 6.4 开始与停止系统服务——Service与Runnable整合并用 6.5 通过短信发送email通知——BroadcastReceiver与Intent整合 6.6 手机拨接状态——PhoneStateListener之onCallStateChanged 6.7 有来电,发送邮件通知——PhoneStateListener与ACTION_SEND 6.8 存储卡剩余多少容量——Environment加StatFs 6.9 访问本机内存与存储卡——File的创建与删除 6.10 实现可定时响起的闹钟——PendingIntent与AlarmManager的运用 6.11 黑名单来电自动静音——PhoneStateListener与AudioManager 6.12 手机翻背面即静音震动——SensorListener及AudioManager整合应用 6.13 指定时间置换桌面背景——多AlarmManager事件处理 6.14 判断发送短信后的状态——BroadcastReceiver聆听PendingIntent 6.15 后台服务送出广播信息——sendBroadcast与BroadcastReceiver 6.16 开机程序设计——receiver与intent-filter协同作业 6.17 双向短信常驻服务——Service与receiver实例 第7章 娱乐多媒体 7.1 访问Drawable资源的宽高——ContextMenu与Bitmap的应用 7.2 绘制几何图形——使用android.graphics类 7.3 手机屏幕保护程序——FadeIn/FadeOut特效与运行线程 7.4 用手指移动画面里的照片——onTouchEvent事件判断 7.5 加载存储卡的Gallery相簿——FileArrayList 7.6 取得手机内置媒体里的图文件——ACTION_GET_CONTENT取回InputStream 7.7 相片导航向导与设置背景桌面——ImageSwitcher与Gallery 7.8 调整音量大小声——AudioManager控制音量 7.9 播放mp3资源文件——raw文件夹与MediaPlayer的使用 7.10 播放存储卡里的mp3音乐——MediaPlayer.setDataSource 7.11 自制录音/播放录音程序——MediaRecorder与AudioEncoder 7.12 通过收到短信开始秘密录音——MediaRecorder与BroadcastReceiver实例 7.13 内置影片播放器载入3gp电影——VideoViewWidget 7.14 自制3gp影片播放器——MediaPlayer与实现SurfaceView 7.15 相机预览及拍照临时文件——Camera及PictureCallback事件 第8章 当Android与Internet接轨 8.1 HTTPGET/POST传递参数——HTTP连接示范 8.2 在程序里浏览网页——WebView.loadUrl 8.3 嵌入HTML标记的程序——WebView.loadData 8.4 设计前往打开网页功能——Intent与Uri.parse 8.5 将网络图像网址放入Gallery中显示——URL.URLConnection.BaseAdapter 8.6 即时访问网络图文件展示——HttpURLConnection 8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 远程下载桌面背景图案——URLConnection与setWallpaper()搭配 8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的应用 8.15 手机下载看3gp影片——Runnable混搭SurfaceView 8.16 访问网站LoginAPI——远程服务器验证程序运行权限 8.17 地震速报!——HttpURLConnection与Service侦测服务 第9章 Google服务与Android混搭 9.1 Google帐号验证Token——AuthSub 9.2 Google搜索——AutoCompleteTextView与GoogleSearchAPI 9.3 前端产生QRCode二维条形码——GoogleChartAPI 9.4 以经纬度查找目的地位置——GeoPoint与MapView的搭配运用 9.5 GPSGoogle地图——LocationListener与MapView实时更新 9.6 移动版GoogleMap——Geocoder反查Address对象 9.7 规划导航路径——DirectionsRoute 9.8 移动设备上的Picasa相册——GooglePicasaAPI 9.9 随身翻译机——GoogleTranslateAPI 第10章 创意Android程序设计 10.1 手机手电筒——PowerManager控制WakeLock并改变手机亮度 10.2 GPS轨迹记录器——利用LocationListener在地图上画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode二维条形码扫描仪——BitmapFactory.decodeByteArray 10.6 上班族今天中午要吃什么——热量骰子地图 10.7 掷杯筊——把手机放在空中甩事件处理...
《疯狂Android讲义(第2版)》.(李刚).源代码 疯狂Android讲义目录结构: 第2章、Android应用程序界面设计,即View 2.2、布局管理(Layout):LinearLayout、TableLayout、FrameLayout、RelativeLayout; 2.3、基本界面组件:TextView、EditText; Button、ImageButton; 9Patch; RadioButton、CheckBox; ToggleButton;AnalogClock、DigitalClock; ImageView; 2.4、高级界面组件:AutoCompleteTextView; Spinner; DatePicker、TimePicker; ProgressBar; SeekBar; RatingBar; TabHost; ScrollView; ListView、ListActivity; ExpandableListView; GridView、ImageSwitcher; Gallery; 2.5、对话框:AlertDialog; PopupWindow; DatePickerDialog、TimePickerDialog; ProgressDialog; 2.6、消息提示:Toast; Notification; 2.7、菜单:OptionMenu、SubMenu; ContextMenu; 第3章、Android事件处理,包括按键响应机制和消息传递机制 3.2、基于监听器的事件处理: 3.3、基于回调的事件的处理: 3.4、响应系统设置的事件: 3.5、Handler消息传递机制: 第4章、深入理解Activity 4.1、建立、配置和使用Activity: 4.2、Activity的回调机制: 4.3、Activity的生命周期: 第5章、使用Intent和IntentFilter进行通信 5.1、Intent对象详解: 5.2、Intent的属性及intent-filter配置:Component属性; Action、Category属性与intent-filter配置; Data、Type属性与intent-filter配置; Extra属性; 5.3、使用Intent创建Tab页面: 第6章、Android应用的资源 6.1、资源的类型及存储方式: 6.2、使用字符串、颜色、尺寸资源: 6.3、数组资源: 6.4、使用Drawable资源:图片资源; StateListDrawable资源; LayerDrawable资源; ShapeDrawable资源; ClipDrawable资源; AnimationDrawable资源; 6.5、使用原始XML资源: 6.6、使用Layout资源: 6.7、使用菜单(Menu)资源: 6.8、样式(Style)和主题(Theme)资源: 6.9、属性(Attribute)资源: 6.10、使用原始资源: 6.11、国际化和资源自适应: 第7章、图形与图像处理 7.1、使用简单图片:Drawable; Bitmap、BitmapFactory; 7.2、绘图:Canvas; Paint; Path; 7.3、图形特效处理:使用Matrix控制变换; 使用drawBitmapMesh扭曲图像; 使用Shader填充图形; 7.4、逐帧(Frame)动画:AnimationDrawable; 7.5、补间(Tween)动画:Interpolator; 位置、大小、旋转度、透明度; 7.6、使用SurfaceView实现动画: 第8章、Android的数据存储和IO 8.1、使用SharedPreferences:SharedPreferences; Editor; 8.2、File存储:openFileOutput和openFileInput; 读写SD卡文件; 8.3、SQLite数据库:SQL语句; SQLiteDatabase; SQLiteOpenHelper; sqlite3 tools; 8.4、手势(Gesture): 8.5、自动朗读(TTS): 8.6、网络存储: 第9章、使用ContentProvider实现数据共享 9.1、数据共享标准:ContentProvider; Uri; ContentResolver; 9.2、操作系统的ContentProvider:使用ContentProvider管理联系人和多媒体; 9.3、实现ContentProvider:创建ContentProvider的步骤; 9.4、监听ContentProvider的数据:ContentObserver; 第10章、Service与BroadcastReceiver 10.1、Service:Service的创建、配置、启动、停止、绑定和通信; Service的生命周期; 10.2、跨进程调用Service(AIDL服务):创建AIDL文件; 将接口暴露给客户端; 客户端访问AIDLService; 10.3、电话管理器:TelephoneManager; 10.4、短信管理器:SmsManager; 10.5、音频管理器:AudioManager; 10.6、振动器:Vibrator; 10.7、手机闹钟服务:AlarmManager; 10.8、接受广播信息:BroadcastReceiver; 10.9、接受系统广播消息: 第11章、多媒体应用开发 11.1、音频和视频的播放:MediaPlayer; SoundPool; VideoView; 11.2、使用MediaRecorder录制音频: 11.3、控制摄像头拍照:Camera; 第12章、OpenGL与3D应用开发 12.2、OpenGL ES基础: 12.3、绘制2D图形: 12.4、绘制3D图形: 第13章、Android的网络应用 13.1、基于TCP协议的网络通信(套接字Socket):Socket; ServerSocket; 13.2、使用URL访问网络资源:URL; URLConnection; 13.3、使用HTTP访问网络:HttpURLConnection; HttpClient; 13.4、使用WebView视图显示网页: 13.5、使用WebService进行网络编程: 第14章、管理Android手机桌面 14.1、管理手机桌面: 14.2、改变手机壁纸: 14.3、桌面快捷方式: 14.4、管理桌面小控件: 14.5、实时文件夹(LiveFolder): 第15章、传感器应用开发 15.2、Android的常用传感器:方向传感器Orientation; 磁场传感器Magnetic Field; 温度传感器Temperature; 光传感器Light; 压力传感器Pressure; 第16章、GPS应用开发 16.1、支持GPS的核心API: 16.2、获取LocationProvider: 16.3、获取定位信息: 16.4、临近警告: 第17章、使用Google Map服务 17.1、调用Google Map的准备: 17.2、根据GPS信息在地图上定位: 17.3、GPS导航: 17.4、根据地址定位: 第18章、疯狂连连看 第19章、电子拍卖系统

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值