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 完成这个动作。Android 屏幕跳转的关系和方式如下图所示:

                                                   图 屏幕跳转的方式    

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

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

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

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

注:上面两个图 是一个文件,由于截图原因         

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

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

点击“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!",这和桌面图标下面的文字以及活动启动后上面的 标题文字是一致的。本例没有指定图标,所以桌面上的图标使用的是默认图标。

在 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控制一组视图

Android开发入门要点记录:四大组件的更多相关文章

  1. 【Android开发艺术探索】四大组件的工作过程

    个人博客 http://www.milovetingting.cn 四大组件的工作过程 四大组件:Activity.Service.BroadcastReceiver.ContentProvider ...

  2. [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解

    原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...

  3. [译]:Xamarin.Android开发入门——Hello,Android深入理解

    返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...

  4. [译]:Xamarin.Android开发入门——Hello,Android快速上手

    返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...

  5. 教我徒弟Android开发入门(一)

    前言: 这个系列的教程是为我徒弟准备的,也适合还不懂java但是想学android开发的小白们~ 本系列是在Android Studio的环境下运行,默认大家的开发环境都是配置好了的 没有配置好的同学 ...

  6. Android开发入门经典【申明:来源于网络】

    Android开发入门经典[申明:来源于网络] 地址:http://wenku.baidu.com/view/6e7634050740be1e650e9a7b.html?re=view

  7. Android开发入门

    教我徒弟Android开发入门(一) 教我徒弟Android开发入门(二) 教我徒弟Android开发入门(三) 出处:http://www.cnblogs.com/kexing/tag/Androi ...

  8. Android学习笔记五:四大组件(转)

    转自:http://blog.csdn.net/shenggaofei/article/details/52450668 Android四大组件分别为activity.service.content ...

  9. android开发入门经验 ADT Bundle环境搭建

    现在有许多做开发的转做移动端开发,做J2EE的转做Android开发,我也把自己的一些入门经验与大家分享一下,希望能给你带来帮助. 工具/原料 JDK,ADT,JAVA 方法/步骤   开发工具的准备 ...

随机推荐

  1. 01_Flume基本架构及原理

    Flume消息收集系统,在整个系统架构中的位置 Flume概况1) Apache软件基金会的顶级项目2)存在两个大的版本:Flume 0.9.x(Flume-OG,original generatio ...

  2. stat用法:获取文件对应权限的数字

    题目:文件属性为-rw-r--r-- 对应权限为644,如何使用命令获取权限对应的数字?? 举例如下: [linuxidc@localhost ~]$ ll -l-rw-r--r-- 1 linuxi ...

  3. 【转】VMware网络连接模式—桥接、NAT以及仅主机模式的详细介绍和区别

    ☞ 本文主要介绍软件『VMware Workstation(虚拟机)』的相关内容:VMware网络连接模式—桥接.NAT以及仅主机模式的详细介绍和区别. 其下列版本/分支可以参考本文: 全部版本/分支 ...

  4. Spring AMQP 源码分析 07 - MessageListenerAdapter

    ### 准备 ## 目标 了解 Spring AMQP 如何用 POJO 处理消息 ## 前置知识 <Spring AMQP 源码分析 04 - MessageListener> ## 相 ...

  5. cocos2dx 在windows下开启console

    cocos2dx 3.10 1.在main函数中写入代码 AllocConsole(); freopen("CONIN$", "r", stdin); freo ...

  6. idea运行main方法报错,提示Shorten command line for xxx

    在Intell IDEA运行main函数的时候遇到了如下错误: Error running' xxxxxx': Command line is too long. Shorten command li ...

  7. linux编译安装mysql5.1.x

    安装mysql,安装前准备 如果mysql用户不存在,那么添加mysql用户 groupadd mysql useradd -g mysql mysql mysql编译安装 make时间特别长 wge ...

  8. 20170621xlVBA跨表转换数据

    Sub 跨表转置() Dim Wb As Workbook Dim Sht As Worksheet Dim oSht As Worksheet Dim Rng As Range Dim Index ...

  9. Linux Used内存到底哪里去了?

    原创文章,转载请注明: 转载自系统技术非业余研究 本文链接地址: Linux Used内存到底哪里去了? 前几天 纯上 同学问了一个问题: 我ps aux看到的RSS内存只有不到30M,但是free看 ...

  10. Android 列表使用(ListView GridView Gallery图片计时滚动)

    ListView 作用: 1.将数据填充到布局. 2.处理用户的选择点击等操作. 根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAd ...