zoukankan      html  css  js  c++  java
  • 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控制一组视图

  • 相关阅读:
    HDU 4492 Mystery (水题)
    UVA 10480 Sabotage (最大流)
    POJ 2446 Chessboard (二分匹配)
    VS2008下用MFC 的MSComm控件编写串口程序
    退役了~~~
    STL Algorithms 之 unique
    cocos2d中CCCallFuncND传参数的注意事项
    好太太晾衣架市场价格表(仅供参考)
    Linux VNC黑屏(转)
    C++ TinyXml操作(含源码下载)
  • 原文地址:https://www.cnblogs.com/worldtraveler/p/3277020.html
Copyright © 2011-2022 走看看