Beginning Android Framework --Phone AndroidManifest.xml
本篇笔记将从AndroidManifest.xml文件着手来分析Contacts模块。
首 先,AndroidManifest.xml文件授予了Contacts程序某些权限,包括 CALL_PRIVILEGED,WRITE_CONTACTS,INTERNET,以及Google自己定义的Gmail权 限:"com.google.android.googleapps.permission.GOOGLE_AUTH.mail"等等。赋予了这些权 限,Contacts才能正常的工作,因此,<uses-permission>通常都定义在<application>之前, 当然,定义在<application>之后也是允许的。
其次,<application>的定义,其中定义 了一个android:process="android.process.acore"属性,告知用户,Contacts这个应用程序将运行在 android.process.acore这个进程中。我们可以打开模拟器,然后在命令行使用adb shell命令进入模拟器的命令终端,然后使用ps查看当前运行的进程,就可以看到android.process.acore这个进程了:
再次,<application>中定义了很多activity和一个service。
这里,对其中几个activity作简要说明。
1. TwelveKeyDialer
这 是下面将要讲到的拨号盘的Activity,拨号盘主要由12个按键组成,分别是0-9十个加上*和#。从LAUNCHER下选择Phone即可进入其 中,它的Intent分类是TAB,说明这是一个Tab Content,是组成Contacts应用程序的四个TAB之一。关于TwelveKeyDialer的详细说明留作以后细究。
2. RecentCallsListActivity
和上面的TAB一样,这也是四个TAB之一,负责通话记录的TAB。从HOME状态下我们按下拨号键即可进入到该TAB,这个TAB是一个ListActivity,关于它的详细介绍这里从略。
3. DialtactsActivity
这 是容纳4个TAB的容器类,它的intent分类是LAUNCHER,说明它可以从LAUNCHER界面启动进入,那么到底是LAUNCHER下的哪个图 标呢?通过它的android:icon="@drawable/ic_launcher_phone"属性我们知道,这正是Phone程序。 DialtactsActivity使用的布局文件是apps/Contacts/res/layout-finger /dialer_activity.xml,关于这点的详细说明,这里也从略。
4. DialtactsContactsEntryActivity
其实这并不是一个Activity,它只是第3个activity DialtactsActivity的别名。它的描述是这样的:
<activity-alias
android:name="DialtactsContactsEntryActivity"
android:targetActivity="DialtactsActivity"
android:label="@string/contactsList"
android:icon="@drawable/ic_launcher_contacts"
>
这也是一个LAUNCHER分类,它对应于LAUNCHER列表中的Contacts程序。
5. ContactsListActivity
联系人列表的activity,即四个TAB中第三个。其中定义了很多<intent-filter>属性,说明可以在联系人列表项上进行很多操作,例如短按列表,长按列表,短按联系人图像等。
6. ContactsListActivity$ContactsSearchActivity
这是负责联系人搜索功能的activity,这里的$是Java语言对静态内部类的表示法,即ContactsSearchActivity类是ContactsListActivity的一个静态类。
其他的N多activity此处均从略。
下面从TwelveKeyDialer这个activity来讲讲第一个TAB的布局。
首先,使用eclipse插件Hierarchy View(也可以从SDK的tools工具中选择hierarchyviewer.bat)来查看DialPad中的12键布局:
一般情况下我们可能认为这些按钮是按照GridView布局器来布局的,因为GridView完全可以胜任这份工作,但是,Android开发人员却没有这么使用,而是自定义了一种layout来布局DialPad。
从 TreeView中我们得知,这里使用的自定义布局文件的名字叫ButtonGridLayout,这个layout类和GridView一样,也是继承 自ViewGroup,定义在apps/Phone/src/com/android/phone/ButtonGridLayout.java中(注 意,这是Phone下面的)。从类的定义上看,该类属于轻量级的布局容器,而GridView则是重量级的,后者非常复杂,这可能是Android开发人 员抛弃GridView改用ButtonGridLayout的一个原因。ButtonGridLayout.java定义了DialPad的几个重要属 性,包括4行3列布局,按钮的数目,按钮的宽度高度,以及按钮之间的间隔等。
这个按钮的布局在文件res/layout-finger/dialpad.xml等中使用到,dialpad.xml中定义了容器的某些属性,例如paddingLeft,layout_gravity等,还分别定义了12个按键的属性,例如数字5的按钮属性:
<ImageButton
android:id="@+id/five"
android:layout_width="88dp"
android:layout_height="50dp"
android:src="@drawable/dial_num_5"
android:background="@drawable/btn_dial"
android:soundEffectsEnabled="false"
android:contentDescription="@string/description_image_button_five"
/>
这里的dial_num_5并不是dial_num_5.png图片,而是dial_num_5.xml文件。笔记一中说到这个xml文件定义了一 个<selector>用于根据按钮不同状态来选择不同的图片。其里面的dial_num_5_blk和dial_num_5_wht才是 png格式的图片,分别表示按钮按下去(黑色5)和正常情况下(白色5)的图片。
下面我们再来讨论DialPad界面中其他元素的布局,首先是顶部的TabWidget:
TabWidget是包含在TabHost容器中的,容纳上述TabWidget的TabHost定义在res/layout-finger /dialer_activity.xml中,而src/com/android/contacts/DialtactsActivity.java这个 TabActivity使用了这个布局,因此,DialtactsActivity.java是管理上面四个Tab的容器类。其中的四个方法就是用来定义 四个tab的:
// Setup the tabs
setupDialerTab();
setupCallLogTab();
setupContactsTab();
setupFavoritesTab();
这四个方法均设置了一个intent,用于按下Tab按钮时跳转到指定的Activity,例如:
Intent intent = new Intent("com.android.phone.action.RECENT_CALLS");
intent.setClass(this, RecentCallsListActivity.class);
这是第二个Tab定义的Intent,其对应的目标Activity是RecentCallsListActivity,即通话记录TAB。
再来看看号码显示区域的布局属性:
首先,这是一个EditText组件,定义在res/layout-finger/twelve_key_dialer.xml中,其定义如下:
<EditText android:id="@+id/digits"
android:layout_width="match_parent"
android:layout_height="67dip"
android:gravity="center"
android:maxLines="1"
android:scrollHorizontally="true"
android:textSize="33sp"
android:freezesText="true"
android:background="@drawable/btn_dial_textfield"
android:textColor="@color/dialer_button_text"
android:focusableInTouchMode="true"
android:editable="true"
android:cursorVisible="false"
android:layout_weight="0"
android:contentDescription="@string/description_digits_edittext"
/>
从属性中我们知道,它的背景图片是在btn_dial_textfield.xml中定义的几个9-patch图片,分别表示无号码时,有号码时, 按下时EditText的背景色变化。属性中还定义了文本的颜色dialer_button_text.xml文件,正常情况下是白色的,按下时变成了黑 色。其他的一些属性很容易从字面上理解,这里不作说明。
最底下的三个按钮分别叫做语音邮件按钮,拨号按钮和删除按钮。
上面的twelve_key_dialer.xml布局中,我们摘取中间几行:
<!– Keypad section –>
<include layout="@layout/dialpad" />
<!– Horizontal row of buttons (Voicemail + DialButton + Delete.) –>
<include layout="@layout/voicemail_dial_delete" />
这里的include关键字就是要引用外部已存在的xml文件作为子布局,这里的两个布局文件分别是dialpad.xml(前面已经讲过)和 voicemail_dial_delete.xml。最底下的三个按钮就是由voicemail_dial_delete.xml文件来控制显示的,我 们进去看看:
<!– Onscreen "Voicemail" button.
The width is 75 (from the mocks) + 12 of padding from the
9patch, total is 87.
–>
<ImageButton android:id="@+id/voicemailButton"
android:layout_width="87dip"
android:layout_height="50dip"
android:layout_gravity="center_vertical"
android:state_enabled="false"
android:background="@drawable/btn_dial_voicemail"
android:contentDescription="@string/description_voicemail_button"
android:src="@drawable/ic_dial_action_voice_mail"
/>
这只是语音邮件那个按钮的属性,其他两个按钮和这类似,从略。
这个ImageButton的背景用的是btn_dial_voicemail.xml文件,这里面定义了两个9-patch图片,那个耳机标志则是定义在drawable下的ic_dial_action_voice_mail.png透明图片。
—————————————————————————————-
最 终,上述的<EditText>,dialpad.xml,voicemail_dial_delete.xml,还有这里没有提到的一个 ListView,共同组成了Contacts四个TAB之一的拨号盘TAB的布局文件twelve_key_dialer.xml,该文件服务的 activity是TwelveKeyDialer.java,因为是Tab content,并不包含顶部的TabWidget,而TabWidget定义在dialer_activity.xml中。
Beginning Android Framework --Phone AndroidManifest.xml相关推荐
- Android 基础 一 AndroidManifest.xml
一.概述 AndroidManifest.xml是Android应用的入口文件,它描述了package中暴露的组件(activities, services, 等等),他们各自的实现类,各种能被处理的 ...
- android 文件分析,Android-Manifest.xml文件格式分析
获取AndroidManifest.xml erlin@erlin-Terrans-Force-S5:release$ apktool d -r app-release.apk I: Using Ap ...
- Android学习之AndroidManifest.xml
概述 每个应用项目必须在项目源设置的根目录中加入 AndroidManifest.xml 文件(且必须使用此名称). 清单文件会向 Android 构建工具.Android 操作系统和 Google ...
- android xml通知栏权限配置,Android开发中 AndroidManifest.xml配置之service,receiver标签配置详解...
本文主要来分享service,receiver标签配置.如有错误,欢迎指正. android:directBootAware=["true" | "false" ...
- Android基础篇 AndroidManifest.xml 中 exported属性的概念
1.android:exported 是 Android中的四大组件 Activity,Service,Provider,Receiver 四大组件中都会有的一个属性. 2.android:expor ...
- AndroidManifest.xml文件剖析
很多天翼空间社区的网友对于Android全局配置文件AndroidManifest.xml不是很熟悉,今天我们就一起看下它完整的结构以及每个节点的作用.在我们日常的开发中都少不了下面的配置,每创建一个 ...
- 报错 Entry name ‘AndroidManifest.xml‘
Entry name 'AndroidManifest.xml' 应用程序的 build.gradle android { packagingOptions { exclude 'AndroidMan ...
- Android学习笔记之AndroidManifest.xml文件解析
为什么80%的码农都做不了架构师?>>> 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整 ...
- Android之 AndroidManifest.xml 文件解析
一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...
最新文章
- linux读写文件实例,Linux在应用层读写寄存器的方法及实现实例
- WordPress 短代码集
- [Linux] 020 RPM 包的命名原则与其依赖性
- Silverlight反编译系列二常见代码(自动生成属性CompilerGenerated,代码)
- linux基础知识——IPC之管道
- 与非CCR代码互操作
- 算术移位的规则及逻辑移动的规则
- wifi卡慢延迟高_120平套三没网线,吃鸡延迟只有20ms,网件Orbi RBK50路由真香
- puppetmaster 、agent 证书管理相关
- 彻底抛弃脚本录制,LR脚本之使用web_custom_request函数自定义http请求
- (1小时数据结构)数据结构c++描述(三)--- 线性表间接寻址
- 论文阅读笔记(16):Doubly Stochastic Subspace Clustering,双重随机子空间聚类
- 【虚拟仿真】Unity3D中实现UI跟随3D模型旋转移动、UI一直面朝屏幕
- 各大调音阶之间的对应关系
- 再见安卓 你好鸿蒙,再见华为,你好鸿蒙
- eos区块链 java客户端_在EOS区块链上使用EOSJS和scatter开发dApp
- 【Vue知识点- No8.】网易云音乐案例(vant组件库的使用)
- AMD Opteron
- 乌班图linux分辨率不能调,ubuntu分辨率1024*768无法选择解决方法
- Java为啥比PHP快?
热门文章
- crashRpt用法
- DTCloud 第1天
- SPSS生成的图像修改坐标轴标题/名称
- 计算机的应用方式英语,【计算机英语论文】复合式制图中计算机技术的应用方式(共3520字)...
- opencv null pointer (null name string) in cvNamedWindow
- //众神云集、群魔乱舞、以一抵百、砥砺前行// 计数排序
- ShareSDK for Flutter
- 打开Xterm加中文新宋体 。
- 疫情不能出门,有什么在家就能做的项目吗?
- windows 10下VS2019编译mongoDB c、c++API(win10下vs2019编译mongo c++)