Android四大组件
分别为activity(界面)、service(服务)、content provider(数据交换)、broadcast receiver(广播)。
1.activity:
(1)一个Activity通常就是一个单独的屏幕(窗口)。
(2)Activity之间通过Intent进行通信。
(3)android应用中每一个Activity都必须要在AndroidManifest.xml
配置文件中声明,否则系统将不识别也不执行该Activity。
2.service:
(1)service用于在后台完成用户指定的操作。service分为两种:
(a)started(启动):当应用程序组件(如activity)调用startService()
方法启动服务时,服务处于started状态。
(b)bound(绑定):当应用程序组件调用bindService()
方法绑定到服务时,服务处于bound状态。
(2)startService()
与bindService()
区别:
(a)started service(启动服务)是由其他组件调用startService()
方法启动的,这导致服务的onStartCommand()
方法被调用。当服务是started状态时,其生命周期与启动它的组件无关,并且可以在后台无限期运行,即使启动服务的组件已经被销毁。因此,服务需要在完成任务后调用stopSelf()
方法停止,或者由其他组件调用stopService()
方法停止。
(b)使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
(3)开发人员需要在应用程序配置文件中声明全部的service,使用标签。
(4)Service通常位于后台运行,它一般不需要与用户交互,因此Service组件没有图形用户界面。Service组件需要继承Service基类。Service组件通常用于为其他组件提供后台服务或监控其他组件的运行状态
3.content provider:
(1)android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。
(2)只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式。
(3)ContentProvider实现数据共享。ContentProvider用于保存和获取数据,并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式,因为android没有提供所有应用共同访问的公共存储区。
(4)开发人员不会直接使用ContentProvider
类的对象,大多数是通过ContentResolver
对象实现对ContentProvider
的操作。
(5)ContentProvider使用URI
来唯一标识其数据集,这里的URI
以content://
作为前缀,表示该数据由ContentProvider来管理。
4.broadcast receiver:
(1)你的应用可以使用它对外部事件进行过滤,只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity
或service
来响应它们收到的信息,或者用NotificationManager
来通知用户。通知可以用很多种方式来吸引用户的注意力,例如闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
(2)广播接收者的注册有两种方法,分别是程序动态注册和AndroidManifest.xml
文件中进行静态注册。
(3)动态注册广播接收器特点是当用来注册的Activity关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用。
六大布局
六大界面布局方式包括:线性布局(LinearLayout)、框架布局(FrameLayout)、表格布局(TableLayout)、相对布局(RelativeLayout)、绝对布局(AbsoluteLayout)和网格布局(GridLayout)。
1. LinearLayout线性布局
LinearLayout容器中的组件一个挨一个排列,通过控制android:orientation
属性,可控制各组件是横向排列还是纵向排列。
LinearLayout的常用XML属性及相关方法
XML属性相关方法说明
android:gravitysetGravity(int)
设置布局管理器内组件的对齐方式
android:orientationsetOrientation(int)
设置布局管理器内组件的排列方式,可以设置为horizontal、vertical
两个值之一
其中,gravity
属性支持top, left, right, center_vertical, fill_vertical, center_horizontal, fill_horizontal, center, fill, clip_vertical, clip_horizontal
。也可以同时指定多种对齐方式的组合。
LinearLayout子元素支持的常用XML属性及方法
XML属性说明
android:layout_gravity
指定该子元素在LinearLayout中的对齐方式
android:layout_weight
指定子元素在LinearLayout中所占的权重
2. TableLayout表格布局
TableLayout继承自Linearout,本质上仍然是线性布局管理器。表格布局采用行、列的形式来管理UI组件,并不需要明确地声明包含多少行、多少列,而是通过添加TableRow、其他组件来控制表格的行数和列数。
每向TableLayout中添加一个TableRow就代表一行;
每向TableRow中添加一个一个子组件就表示一列;
如果直接向TableLayout添加组件,那么该组件将直接占用一行;
在表格布局中,可以为单元格设置如下三种行为方式:
Shrinkable:该列的所有单元格的宽度可以被收缩,以保证该表格能适应父容器的宽度;
Strentchable:该列所有单元格的宽度可以被拉伸,以保证组件能完全填满表格空余空间;
Collapsed:如果该列被设置为Collapsed,那么该列的所有单元格会被隐藏;
TableLayout的常用XML属性及方法
XML属性相关方法说明
android:collapseColumnssetColumns(int, boolean)
设置需要被隐藏的列的序号,多个序号间用逗号分隔
android:shrinkColumnssetShrinkAllColumns(boolean)
设置需要被收缩的列的序号
android:stretchColumnssetStretchAllColumns(boolean)
设置允许被拉伸的列的序号
3. FrameLayout帧布局
FrameLayout直接继承自ViewGroup组件。帧布局为每个加入其中的组件创建一个空白的区域(称为一帧),每个子组件占据一帧,这些帧会根据gravity属性执行自动对齐。
FrameLayout的常用XM了属性及方法
XML属性相关方法说明
android:foregroundsetForeground(Drawable)
设置该帧布局容器的前景图像
android:foregroundGravitysetForeGroundGraity(int)
定义绘制前景图像的gravity属性
4. RelativeLayout相对布局
RelativeLayout的XML属性及相关方法说明
XML属性相关方法说明
android:gravitysetGravity(int)
android:ignoreGravitysetIgnoreGravity(int)
设置哪个组件不受gravity属性的影响
为了控制该布局容器的各子组件的布局分布,RelativeLayout提供了一个内部类:RelativeLayout.LayoutParams
。
RelativeLayout.LayoutParams
里只能设为boolean
的XML属性
XML属性说明
android:layout_centerHorizontal
设置该子组件是否位于布局容器的水平居中
android:layout_centerVertical
android:layout_centerParent
android:layout_alignParentBottom
android:layout_alignParentLeft
android:layout_alignParentRight
android:layout_alignParentTop
RelativeLayout.LayoutParams
里属性值为其他UI组件ID的XML属性
XML属性说明
android:layout_toRightOf
控制该子组件位于给出ID组件的右侧
android:layout_toLeftOf
android:layout_above
android:layout_below
android:layout_alignTop
android:layout_alignBottom
android:layout_alignRight
android:layout_alignLeft
5. Android 4.0新增的网格布局GridLayout
GridLayout是Android4.0增加的网格布局控件,与之前的TableLayout有些相似,它把整个容器划分为rows × columns个网格,每个网格可以放置一个组件。性能及功能都要比tablelayout好,比如GridLayout布局中的单元格可以跨越多行,而tablelayout则不行,此外,其渲染速度也比tablelayout要快。
GridLayout提供了setRowCount(int)
和setColumnCount(int)
方法来控制该网格的行和列的数量。
GridLayout常用的XML属性和方法说明
XML属性相关方法说明
android:alignmentModesetAlignmentMode(int)
设置该布局管理器采用的对齐模式
android:columnCountsetColumnCount(int)
设置该网格的列数量
android:columnOrderPreservedsetColumnOrderPreserved(boolean)
设置该网格容器是否保留序列号
android:roeCountsetRowCount(int)
设置该网格的行数量
android:rowOrderPreservedsetRowOrderPreserved(boolean)
设置该网格容器是否保留行序号
android:useDefaultMarginssetUseDefaultMargins(boolean)
设置该布局管理器是否使用默认的页边距
为了控制GridLayout布局容器中各子组件的布局分布,GridLayout提供了一个内部类:GridLayout.LayoutParams
,来控制Gridlayout布局容器中子组件的布局分布。
GridLayout.LayoutParams
常用的XML属性和方法说明
XML属性说明
android:layout_column
设置该组件在GridLayout的第几列
android:layout_columnSpan
设置该子组件在GridLayout横向上跨几列
android:layout_gravity
设置该子组件采用何种方式占据该网格的空间
android:layout_row
设置该子组件在GridLayout的第几行
android:layout_rowSpan
设置该子组件在GridLayout纵向上跨几行
5. AbsoluteLayout绝对布局
即Android不提供任何布局控制,而是由开发人员自己通过X坐标、Y坐标来控制组件的位置。每个组件都可指定如下两个XML属性:
layour_x;
layout_y;
绝对布局已经过时,不应使用或少使用。
界面布局类型的选择和性能优化
首先得明确,界面布局类型的嵌套越多越深越复杂,会使布局实例化变慢,使Activity的展开时间延长。建议尽量减少布局嵌套,尽量减少创建View对象的数量。
1 . 减少布局层次,可考虑用RelativeLayout来代替LinearLayout。通过Relative的相对其他元素的位置来布局,可减少块状嵌套;
2 . 另一种减少布局层次的技巧是使用标签来合并布局;
3 . 重用布局。Android支持在XML中使用标签,通过指定android:layout
属性来指定要包含的另一个XML布局。