Android开发入门要点记录:四大组件

     cocos2dx跨平台开发中需要了解android开发,昨天快速的浏览了一本Android开发入门教程,因为之前也似懂非懂的写过Activity,Intent,XML文件,还有里面许多控件甚至编程思想都能在IOS中找到影子,所以看起来并不吃力,只求以后看见Android程序能看懂,现在记录下一些要点心得。

提到Android开发,当然要先搞明白它的四大组件分别代表什么,起什么作用:

(1)活动(Activity)
活动是最基本的
Android 应用程序组件,在应用程序中,一个活动通常就是一个单独的用户界面。每一个

活动都被实现为一个独立的类,并且从活动(Activity)基类中继承而来,活动类将会显示由视图(View)控 件组成的用户接口,并对事件(Event)做出响应。大多数的应用程序都会有多个用户界面,因此便会有多个相 应的活动。

Android 的一个活动一般对应界面中的一个屏幕显示,可以理解成一个界面,每一个活动在界面上可以包 含按钮、文本框等多种可视的 UI 元素。

                                           1 活动(Activity)的生命周期    

(2)广播接收器(BroadcastReceiver)

  广播接收器用于让应用程序对一个外部事件做出响应。例如:电话呼入事件、数据网络可用通知或者到了
晚上时进行通知。

广播接收器的生命周期

广播接收器有一个单一的回调方法 onReceive(),当广播消息到达接收器时,Android 将调用这个方法,并 传递给包含在这个消息中的 Intent 对象。

广播接收器只有在这个方法的执行过程中才处于活动状态,当 onReceive()返回后,广播接收器将不再处于 活动状态。广播接收器的功能类似于一个回调函数,只是单次运行时处于活动状态。 


(3)服务(Service)

  一个服务是一个具有一段较长生命周期但没有用户界面的程序。例如:一个正在从播放列表中播放歌曲的
媒体播放器在后台运行。

2 服务(Service)的生命周期    

使用 StartService 运行服务的情景:使用这种方法启动服务,服务的 onCreate()和 onStart()这两个方法将被 调用,服务会在后台运行直到退出,退出时将调用 onDestroy()方法。

使用 bindService 运行服务的情景:使用这种方法启动服务,调用者(也就是服务的客户端)将获得和服务 交互的类,通过其调用时服务的相关内容会处于活动状态。

 

(4)内容提供者(Content Provider)

应用程序能够将它们的数据保存到文件或 SQLite 数据库中,甚至是任何有效的设备中。当需要将数据与其 他的应用共享时,内容提供者将会很有用。一个内容提供者类实现了一组标准的方法,从而能够让其他应用程序 保存或读取此内容提供者处理的各种数据类型。 

(5)Intent

在一般情况下,Android 的每一个屏幕基本上就是一个活动(Activity),屏幕之间的切换实际上就是在活动间互 相调用的过程,Android 使用 Intent 完成这个动作。page62image46144Android 屏幕跳转的关系和方式如下图所示:

page62image6800
page62image7080
page62image7912
page62image8192
page62image8472
page62image8752
page62image9032
page62image9312
page62image9592
page62image9872
page62image10152
page62image10432
page62image10712
page62image10992
page62image11272
page62image11552
page62image11832
page62image12112
page62image12392
page62image12672
page62image12952
page62image13232
page62image13512
page62image14064
page62image14344
page62image14624
page62image14904
page62image15184
page62image15464
page62image15744
page62image16024
page62image16304
page62image16584
page62image16864
page62image17144
page62image17424
page62image17704
page62image17984
page62image18264
page62image18544
page62image18824
page62image19104
page62image19384
page62image19664
                                                   图 屏幕跳转的方式    

事实上,在 Android 中,屏幕使用一个活动来实现,屏幕之间是相互独立的,屏幕之间的跳转关系通过 Intent 来实现。 

实例:本示例是一个简单的屏幕之间的跳转,从一个屏幕跳转到另一个屏幕,在启动第二个屏幕后,前一个屏幕消失。   

布局资源代码:forward_target.xml 和 forwarding.xml    

本示例包含了两个活动,在 UI 上它们就是两个屏幕,分别为跳转的源和目的,因此在 AndroidManifest.xml 中 分别定义。 

page62image21936
page62image22216
page62image22496
page62image22776
page62image23056
page62image23336
page62image23616
page62image23896
page62image24176
page62image24456
page62image24736
page62image25016
page62image25296
page62image25576
page62image25856
page62image26136
page62image26416
page62image26696
page62image26976
page62image27256
注:上面两个图 是一个文件,由于截图原因         
page62image27808
page62image28088
page62image28368
page62image28648
page62image28928
page62image29208
page62image29488
page62image29768
page62image30048
page62image30328
page62image30608
page62image30888
page62image31168
page62image31448
page62image31728
page62image32008
page62image32288
page62image32568
page62image32848
page62image33128
page62image33408
page62image33688

两个活动的名称分别为 Forwarding ForwardTarget,由于第二个活动没有 intent-filter,因此在程序中只能由第 一个活动来启动。 

Forward 程序的运行结果如图所示:    

page62image34240
page62image34520
page62image34800
page62image35080
page62image35360
page62image35640
page62image35920
page62image36200
page62image36480
page62image36760
page62image37040
page62image37320
page62image37600
page62image37880
page62image38160
page62image38440
page62image38720
page62image39000
page62image39280
page62image39560
page62image39840
page62image40120
page62image40672
page62image40952
page62image41232
page62image41512
page62image41792
page62image42072
page62image42352
page62image42632
page62image42912
page62image43192
page62image43472
page62image43752
page62image44032
page62image44312
page62image44592
page62image44872
page62image45152
page62image45432

点击“Go”按钮从 Forward 跳转到 ForwardTarget,这个内容在 Java 源文件 Forward.java 的以下片段中处理:    
 

启动第二个活动需要使用 Intent,在其 setClass()函数中设置源和返回的内容,Intent android.content 包中的类, 用于启动活动、服务或者消息接收器。

这里使用的 Intent setClass()的方法的原型如下所示: 

第一个参数是当前的上下文类型 Context,因此把当前的活动设置过去即可(Activity 本身继承了 Context),第 二个是 Intent 所包含的 JAVA 类,直接设置 ForwardTarget.class 类即可。 

     本例中使用了 finish()函数表示当前的活动结束,这样在第二个活动(ForwardTarget)启动时,第一个活动 (Forward)已经不存在了。如果没有调用 finish()函数,第二个活动启动时,第一个活动就处于 OnPause 状态,当第二个活动退出后,第一个活动重新出现,也就是会调用活动的 onResume()函数。 

应用程序包含的各个文件   

1.Android.mk:统一工程文件,在SDK开发中可以不需要;

2.AndroidManifest.xml:工程描述文件,在其中定义了各种组件;

AndroidManifest.xml 文件是这个 Android 应用程序的工程描述文件,包含了宏观上的内容,如下所示:    

注解:

1.xmlns:xmlns是XML Namespaces的缩写,中文名称是XML命名空间。

XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:
xmlns:namespace-prefix="namespaceURI"。
当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。
注释:用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息
2.intent-filter
当Intent在组件间传递时,组件如果想告知Android系统自己能够响应和处理哪些Intent,那么就需要用到IntentFilter对象。
顾名思义,IntentFilter对象负责过滤掉组件无法响应和处理的Intent,只将自己关心的Intent接收进来进行处理。
 

3.android:layout_gravity(布局-重力)属性,其实就是当前view相对于父视图的位置

android:layout_gravity 可以在各个 View 中使用:top、bottom、left、right、 center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical、clip_horizontal,这些选项 用于处理竖直和水平方向的对齐方式。 

application(表示应用程序)标签中包含了一个 activity(表示活动)。活动是应用程序中的一个组件,一个应用 程序中也可以包含若干个组件。包名定义为 com.example. android.helloactivity,表示将从 src 目录的 com/example/android/helloactivity 中寻找程序中的 Java 源代码。活动名称将被定义为 HelloActivity,表示活动的 代码是上述源代码目录中的HelloActivity.java文件。intent-filter中的内容指定了程序的启动方式,这里category 中的 android.intent.category.LAUNCHER 表示活动将在 Android 的桌面(Android 默认的桌面程序名称也是 LAUNCHER)上出现。

这里指定 application android:label 为"Hello,Activity!",这和桌面图标下面的文字以及活动启动后上面的 标题文字是一致的。本例没有指定图标,所以桌面上的图标使用的是默认图标。

page42image11200
page42image11480
page42image11760
page42image12040
page42image12320
page42image12600
page42image12880
page42image13160
page42image13440
page42image13720
page42image14000
page42image14280
page42image14560
page42image14840
page42image15120
page42image15400
page42image15680
page42image15960
page42image16240
page42image16520
page42image16800
page42image17080
page42image17360
page42image17640
page42image17920
page42image18200
page42image18480
page42image18760
page42image19040
page42image19320
page42image19600
page42image19880
page42image20160
page42image20440
page42image20720
page42image21000
page42image21280
page42image21560
page42image21840
page42image22120
page42image22400
page42image22680
page42image22960
page42image23240
page42image23520
page42image23800
page42image24080
page42image24360
page42image24640
page42image24920
page42image25200
page42image25480
page42image25760
page42image26040
page42image26320
page42image26600
page42image26880
page42image27160
page42image27440
page42image27720
page42image28000
page42image28280
page42image28560
page42image28840
page42image29120
page42image29400
page42image29680
page42image29960
page42image30240
page42image30520
page42image30800
page42image31080
page42image31360
page42image31640
page42image31920
page42image32200
page42image32480
page42image32760
page42image33040
page42image33320
page42image33600
page42image33880
page42image34160
page42image34440
page42image34720
page42image35000
page42image35280
page42image35560
page42image35840
page42image36120
page42image36400
page42image36680
page42image36960
page42image37240
page42image37520
page42image37800
page42image38080
page42image38360
page42image38640
page42image38920
page42image39200
page42image39480
page42image39760
page42image40040
page42image40320
page42image40600
page42image40880
page42image41160
page42image41440
page42image41720
page42image42000
page42image42280
page42image42560
page42image42840
page42image43120
page42image43400
page42image43680
page42image43960
page42image44240
page42image44520
page42image44800
page42image45080
page42image45360
page42image45640
page42image45920
page42image46200
page42image46480
page42image46760
page42image47040
page42image47320
page42image47600
page42image47880
page42image48160
page42image48440
page42image48720
page42image49000
page42image49280
page42image49560
page42image49840
page42image50120
page42image50400
page42image50680
page42image50960
page42image51240
page42image51520
page42image51800
page42image52080
page42image52360
page42image52640
page42image52920
page42image53200
page42image53480
page42image53760
page42image54040
page42image54320
page42image54600
page42image54880
page42image55160
page42image55440
page42image55720
page42image56000
page42image56280
page42image56560
page42image56840
page42image57120
page42image57400
page42image57680
page42image57960
page42image58240
page42image58520
page42image58800
page42image59080
page42image59360
page42image59640
page42image59920
page42image60200
page42image60480
page42image60760
page42image61040
page42image61320
page42image61600
page42image61880
page42image62160
page42image62440
page42image62720
page42image63000
page42image63280
page42image63560
page42image63840
page42image64120
page42image64400
page42image64680
page42image64960
page42image65240
page42image65520
page42image65800
page42image66080
page42image66360
page42image66640
page42image66920
page42image67200
page42image67480
page42image67760
page42image68040
page42image68320
page42image68600
page42image68880
page42image69160
page42image69440
page42image69720
page42image70000
page42image70280
page42image70560
page42image70840
page42image71120
page42image71400
page42image71680
page42image72800
page42image73080
page42image73360

AndroidManifest.xml 文件中为一个活动指定 label(标签)和 icon(图标)的方法 方法如下:

android:label 指定为字符串、android:icon 指定为图标后,将使用 res/drawable 中对应名称的图片文件作为图 标(本例中将使用 icon_name.png)。

activity application 都具有 android:label android:icon 等属性,由于活动是程序的单元,且应用可以包 含多个活动,因此程序首先将使用 activity 中的这些标签,如果没有则使用上一级的 application 中标签的定义 


3.Java源代码:按照Java包的方式来组织目录结构,包括各个Java类的源代码;

这里的类 HelloActivity 继承实现了 Android 系统 API 提供的活动类(Activity),使用 setContentView(R.layout.hello_activity)指定了当前活动的布局,这里表示将从 res/layout 目录中找到 hello_activity.xml 文件作为本例的布局文件使用。 


4.资源文件:包含XML文件、图片、原始数据文件等,其中表示界面情况的布局(Layout)文件比较重要。 

hello_activity.xml 是本程序中的布局文件,在 Java 源文件中使用了此文件。本文件在 res/layout 目录中,其

内容如下所示: 

在这个布局文件中,只定义了一个 UI 元素——EditText,就是在界面上出现的占据全屏的可编辑文本框。 在这里定义了这个可编辑文本框的初始化字符串为"@string/hello_activity_text_text",这个值在另外的资源文件 中被定义,本例就是 string.xml。 

string.xml 是本例中的一个资源文件,其内容如下所示:    

这里定义了名称为“hello_activity_text_text”的字符串的内容为 Hello,World!,这就是出现在屏幕上的字 符串。 

HelloActivity 的运行情况    

下面再来个实例,加深理解

Android 中,在处理 UI 中的各种元素的时候,两个程序中的要点为: 得到布局文件(XML)中的控件句柄
设置控件的行为

本小节介绍在 Android 中几种基本的程序控制方法,要获得的效果是通过 2 个按钮来控制一个文本框的背 景颜色,其运行结果如图所示: 

本例构建一个应用程序,其在 AndroidManifest.xml 描述文件中的内容如下所示:    
本例定义了一个 Android 中基本的活动。    
 
布局文件(layout)的代码片段如下所示:   

根据以上的布局文件中定义的两个按钮和一个文本框,这个布局文件被活动设置为 View 后,显示的内容就如上 图所示,只是行为还没有实现。 

行为将在源代码文件 TestEvent1.java 中实现,这部分的代码如下所示:    

在创建的过程中,通过 findViewById 获得各个屏幕上面的控件(控件)的背景,这里使用的 R.id.button1 等和 布局文件中各个元素的 id 是对应的。实际上,在布局文件中,各个控件即使不写 android:id 这一项也可以正常显示, 但是如果需要在代码中进行控制,则必须设置这一项。 

根据 Button 控件的 setOnClickListener()设置了其中的点击行为,这个方法的参数实际上是一个 View.OnClickListener 类型的接口,这个接口需要被实现才能够使用,因此在本例的设置中,实现了其中的 onClick() 函数。这样既可实现点击的时候实现相应的功能,在点击的函数中,将通过 Text 的句柄对其进行控制。 

Android 的控件使用方面,这两个编程方面要点是:

使用findViewById()获取布局文件(XML)中控件的句柄;
使用setOnXXXListener()设置事件处理函数。 在获取句柄时需要转换成相应的控件类型,findViewById()函数的参数是一个整数,返回值是一个

android.view.View 类型。通过 R.id.XXX 找到布局文件中定义的 ID,然后通过将基础类转换成其实际的类获得真正的 句柄。注意:所转换类必须和布局文件中描述的控件一致。 

SetOnXXXListener()等函数是 android.view.View 类的函数,各种控件(包括 Button、EditText)都扩展这个类, 同族的函数包括: 

这些函数用于事件处理,它们由程序实现,通过设置这些内容也就设置了控件的行为。这些函数的参数都是所 对应的 android.view.View 类中的方法。 

Android UI 基本控制内容:使用 findViewById()联系布局文件中控件和句柄,并通过 OnClickListener()等定制 句柄的行为。 

最后还要提一下视图组(ViewGroup)和布局(Layout)的使用 

在屏幕中控件的组织上,可以将各个视图(控件)组成一个视图组(ViewGroup),视图组是一个包含了 其他视图的视图。 

android.view.ViewGroup 扩展了 android.view.View,它本身也具有 View 的特性,区别仅在于它可以包含其 他的控件。 

ViewGroup 视图组具有一系列的扩展者:AdapterView、AbsoluteLayout、FrameLayout、LinearLayout、 RelativeLayout、AdapterView<T extends android.widget.Adapter>。

Android GUI 程序的屏幕体系结构的组织遵循以下原则: 一个屏幕可以包含一个视图;
视图组本身也是一个视图;
视图组可以包含若干个视图。

Android 视图和视图组的关系如图所示: 

如图所示,外部最大的框表示整个屏幕,其中包含一个视图组 ViewGroup0,ViewGroup0 包含 3 个子视图, 即 View1、ViewGroup1、ViewGroup2。ViewGroup1 本身也是视图组,以水平布局的方式包含了 View2 View3; ViewGroup2 本身也是视图组,以垂直的方式包含了 View4、ViewGroup3 ViewGroup4;ViewGroup4 本身也 是视图组,以水平布局的方式包含了 View5 View6。 

布局(Layout)

布局(Layout)是各个控件在屏幕上的位置关系,视图组的几个扩展类与布局相关。在 Android 中布局通常有以 下几种不同的情况:

FrameLayout(框架布局):系统默认的在屏幕上就有空白区显示它;
LinearLayout(线性布局):让所有的子视图都成为单一的方向,即垂直的或者水平的; AbsoluteLayout(绝对布局):让子视图使用x/y坐标确定在屏幕上的位置;
RelativeLayout(相对布局):让子视图的位置和其他的视图相关;
TableLayout(表单布局):位置是它的子视图的行或列。

FrameLayout、LinearLayout、RelativeLayout、AbsoluteLayout、TableLayout 都是扩展了 ViewGroup 的类,因此 这些视图可以用于包含其他的控件,并可以控制其他的控件的位置关系。

布局的内容一般通过在布局文件中控制即可,在控制布局时 android:layout_width android:layout_height 等表示 尺寸属性,除了使用实际的尺寸值外,还有两个常用的选项:

"fill_parent":表示能填满父视图的最大尺寸;

"wrap_content":表示仅包裹子内容的最小尺寸。 这两个值既可以在视图组中使用,也可以在普通视图中使用,如果在视图中使用"wrap_content",表示包裹其中

的内容,例如按钮需要包裹上面的文字。 

由于Layout是视图组的子类,所以实际应用中通常都是使用Layout控制一组视图

原文地址:https://www.cnblogs.com/worldtraveler/p/3277020.html