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

最新文章

  1. sigaction和sigqueue
  2. neutron debug
  3. docker push到本地仓库失败
  4. DirectoryInfo类
  5. expect脚本
  6. diahosting的低配vps弱爆了
  7. 在ubuntu 10.04下编译ffmpeg
  8. 在现代渲染API下,封装跨平台渲染框架的尝试 - 资源管理
  9. HDU 4350 Card
  10. windows下npm scripts不能执行的问题
  11. java中 &quot;==&quot; 和 &quot;.equels&quot;的区别
  12. IBM SPSS 实习总结
  13. ELK简单安装
  14. web 页面间传值 js 封装方法
  15. [Oracle][DATAGUARD] 关于确认PHYSICAL STANDBY的同期状况的方法
  16. poj2386(简单的dfs/bfs)
  17. spring security 获取当前用户信息
  18. ActiveMQ新的Master/Slave存储共享机制Replicated LevelDB Store
  19. 使用 loop device 制作安装镜像
  20. 关于golang中包(package)的二三事儿

热门文章

  1. JDK tools之jps和jstack诊断Java程序
  2. git 代码冲突处理
  3. 【转】VC6在Win7下打开文件崩溃问题
  4. vmware 安装ubuntu
  5. android适配各种分辨率的问题
  6. 算法笔记--KMP算法 &amp;&amp; EXKMP算法
  7. Java多线程之内存可见性和原子性:Synchronized和Volatile的比较
  8. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 问题解决方法
  9. spring-cloud: eureka之:ribbon负载均衡自定义配置(二)
  10. PyQt5-GUI生成随机生成小工具