原文:【Xamarin开发 Android 系列 7】 Android 结构基础(下)
*******前期我们不打算进行太深入的东西,省的吓跑刚进门的,感觉门槛高,so,我们一开始就是跑马灯一样,向前蹿*************
前一篇 我们从大概上知道了 Android的体系,我强调,我们的重点是Application,包括以后的开发 我们也都是开发Application,没有其他。
我们队APP有了大概了了接,知道 .apk的组成。
那么真正的app 包含哪些细节的东西呢,都是概念性的东西,但是必须知道。所以 我们一一罗列出来,并对照关系。
首先我们讲解的是其四大组件 Activity /BroadcastReceiver/ Service /Content Provider
1.Activity
一个Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务,例如拨号、拍照、发送email、看地图。每一个activity被给予一个窗口,在上面可以绘制用户接口。窗口通常充满屏幕,但也可以小于屏幕而浮于其它窗口之上。Android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity
一个应用程序通常由多个activities组成,他们通常是松耦合关系。通常,一个应用程序中的activity被指定为"main"activity,当第一次启动应用程序的时候呈现给用户的那个activity。每一个activity然后可以启动另一个activity为了完成不同的动作。每一次一个activity启动,前一个activity就停止了,但是系统保留activity在一个栈上(“back stack”)。当一个新activity启动,它被推送到栈顶,取得用户焦点。Back Stack符合简单“后进先出”原则,所以,当用户完成当前activity然后点击back按钮,它被弹出栈(并且被摧毁),然后之前的activity恢复。
2.Service
一个Service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序.类似 windows 服务。可以用来进行 缓存处理、大数据处理、音乐媒体文件播放等后台处理。
比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲。然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。在这个例子中,媒体播放器这个activity 会使用Context.startService()来启动一个service,从而可以在后台保持音乐的播放。同时,系统也将保持这个service 一直执行,直到这个service 运行结束。另外,我们还可以通过使用Context.bindService()方法,连接到一个service 上(如果这个service 还没有运行将启动它)。当连接到一个service 之后,我们还可以service 提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。
3.Content Provider
此组件提供数据内容分发共享,相当于自身的数据的对外一个接口Provider,android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式
4.Broadcast receivers
广播接收器,顾名思义,就是接受来自系统或者程序的事件通知,然后转发通知订阅者程序。相当于C#中的事件 订阅 广播模式。Broadcast receivers订阅自己需要的事件通知信息,进行自身的处理,比如 :电池电量过低,蓝牙打开,等等,系统推送消息到 系统的 事件总线,然后由订阅者获取事件,(Event-Bus)事件总线模式,是我推测的,不知道是不是这种模式,在 WCF基于 Azure开发的时候,提供事件总线,对来自不同来源 的消息进行推送通知,交由特定的订阅者进行消息的分发处理。
5.Views and ViewGroups
在程序界面上你能看到的程序控件 都是派生来自 View 类,例如:buttons, labels, textboxes, and radio
buttons are all examples of Views,
View是所有UI组件的基类,而ViewGroup是容纳这些组件的容器,其本身也是从View派生出来的。AndroidUI界面的一般结构可参见下面的示意图:
View 的创建 可以通过编程 或者xml布局的方式进行。我们通常都是在IDE下进行 View 控件的开发
6.User interface widgets
接口部件,Android提供基于部件的形式进行友好的界面体验式开发,部件集在 Framework下的android.widget
7. Common layouts 布局(五种布局模式)
1 LinearLayout 线性布局
线性布局,这个东西,从外框上可以理解为一个div,他首先是一个一个从上往下罗列在屏幕上。每一个LinearLayout里面又可分为垂直布局(android:orientation="vertical")和水平布局(android:orientation="horizontal" )。当垂直布局时,每一行就只有一个元素,多个元素依次垂直往下;水平布局时,只有一行,每一个元素依次向右排列。
linearLayout中有一个重要的属性 android:layout_weight="1",这个weight在垂直布局时,代表行距;水平的时候代表列宽;weight值越大就越大。
线形布局中预览和真机中完全一样。
TextView占一定的空间,没有赋值也有一定的宽高,要特别注意。
2 FrameLayout
FrameLayout是最简单的一个布局对象。它被定制为你屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象 — 比如,一张你要发布的图片。所有的子元素将会固定在屏幕的左上角;你不能为FrameLayout中的一个子元素指定一个位置。后一个子元素将会直接在前一个子元素之上进行覆盖填充,把它们部份或全部挡住(除非后一个子元素是透明的)。
3、AbsoluteLayout
AbsoluteLayout 这个布局方式很简单,主要属性就两个 layout_x 和 layout_y 分别定义 这个组件的绝对位置。 即,以屏幕左上角为(0,0)的坐标轴的x,y值,当向下或向右移动时,坐标值将变大。AbsoluteLayout 没有页边框,允许元素之间互相重叠(尽管不推荐)。我们通常不推荐使用 AbsoluteLayout ,除非你有正当理由要使用它,因为它使界面代码太过刚性,以至于在不同的设备上可能不能很好地工作。
4、RelativeLayout
相对布局可以理解为某一个元素为参照物,来定位的布局方式。
5、TableLayout
表格布局类似Html里面的Table。每一个TableLayout里面有表格行TableRow,TableRow里面可以具体定义每一个元素。每个TableRow 都会定义一个 row (事实上,你可以定义其它的子对象,这在下面会解释到)。TableLayout 容器不会显示row 、cloumns 或cell 的边框线。每个 row 拥有0个或多个的cell ;每个cell 拥有一个View 对象。表格由列和行组成许多的单元格。表格允许单元格为空。单元格不能跨列,这与HTML 中的不一样。
TabRow只论行,不论列(列自定义)。
(布局参考来自:http://www.cnblogs.com/chiao/archive/2011/08/24/2152435.html)
8.Adapter layouts 自适应布局
List View
Grid View
两个自适应布局
9.XML layout files
页面布局文件,一个xml文件,包含 Tags 来进行布局 控件的 声明,每个控件对应的是 对应 的控件类,属性进行控件的初始化赋值。每个控件都有唯一的ID,
如:android:id="@+id/searchButton",@ 告诉解析器 这是控件的Id,+ 表示注册到资源文件到R.java,在资源文件中,对应的整数数字ID标识到控件。
10.Intents
消息传递承载容器,用来在Android的各个部件间进行通讯的时候,消息承载。
主要用于:1、窗体Activity的数据传递 2、服务数据通知 3、组件间进行通讯数据传递 等
11. Resources
实现对程序的资源文件 ,图像 、音频、视频、文件、动画菜单、样式 的操作管理。
12. R.java 文件
当编译项目的时候,程序包中的资源文件ID标识被放置到程序的R.Java文件中,R class 文件中包含各个资源的int 类型的标识ID。如下图:
看完以上的内容,我们对app 的开发的认知基本完毕。再次提示:不会进行过深的层次的讲解。待熟练后,可以对各个部件 概念进行更深入的学习。