目录
1. Activity 组件 MainActivity 类
2.布局文件activity_main. xml
3.应用程序配置文件 AndroidManifest.xml
4. Android的应用程序组件
4.1 Activity——活动
4.2 Service——服务
4.3 Broadcast receiver——广播接收器
4.4 Content provider——内容提供者
在之前的文章中我们创建了一个Android项目Android_Demo01,实现了界面上显示一行文本信息“Hello world!”。下面我们将对这个项目中生成的代码及主要配置文件进行分析讲解,了解一个简单的Android应用程序的原理。
文章链接:手把手创建第一个 Android 项目-CSDN博客
Android_Demo01项目中主要包括1个布局文件(activity_main.xml),用于设计用户界面; 1个Activity组件(MainActivity类) ,用于实现用户界面交互功能及配置文件AndroidManifest.xml.
1. Activity 组件 MainActivity 类
代码如下:
package com.example.android_demo01;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.Menultem;
public class MainActivity extends Activity{
@Override
protected void oncreate (Bundle savedInstanceState) {
super.onCreate (savedInstancestate);
setContentView (R.layout.activity_main);
}
@Override
public boolean oncreateoptionsMenu (Menu menu){
// Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate (R.menu.main, menu)
return true;
}
@Override
public boolean onOptionsItemSelected (MenuItem item){
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int iditem.getItemId();
if (id == R.id.action_settings)
{
return true;
}
return super.onoptionsItemSelected(item);
}
}
上面代码中的 MainActivity 类继承于 Activity 类, Activity 类是专门负责控制视图View与用户进行交互的活动类,可以理解为一个与用户交互的界面。当MainActivity启动时会调用该类的onCreate方法,从上面代码可以看出,在onCreate方法中,首先调用了父类的onCreate 方法,然 后使用 setContentView 方法可以加 载布局文件 activity_main.onCreateOptionsMenu 方法可以初始化 Activity 中的菜单,即加载菜单布局文件 main.xml:当用户点击菜单项时,会调用onOptionsitemSelected方法,在此方法中可以处理用户的点击事件。
2.布局文件activity_main. xml
代码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_height-"match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="edimen/activity_vertical_margin"
tools:context="com.example.android_demo2_1.MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLavout>
上面代码中<RelativeLayout>标签表示界面顶层布局方式是相对布局,其属性"xmlns:android”指定命名空间,顶级元素必须指定命名空间。顶层布局内的<TextView>标签表示一个文本框控件,用来显示文本信息,其属性"layout_width"指定该元素的宽度,其中“match_parent”代表填满其父元素,对于顶级元素来说,其父元素就是整个手机屏幕。"wrap_content"代表该元素的大小仅包裹其自身内容;属性"android:text"表示文本框控件显示的内容。
3.应用程序配置文件 AndroidManifest.xml
代码如下:
<?xml version-"1.0" encoding-"utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android_demo2_1"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minsdkVersion="17"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon-"@drawable/ic_launcher" android-lahel="Getring/app_name"
android:theme="@style/AppTheme"
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
AndroidManifest.xml 是每个 Android 程序中必须的文件,它位于整个项目的根目录,描述了应用程序包中暴露的组件(Activity、 Service等),它们各自的实现类,各种能被处理的数据和启动位置.AndroidManifest.xml除了能声明程序中的Activity、 Service、ContentProviders和Intent Receivers之外,还能指定permissions(声明权限)和instrumentation(安全控制和测试)。
上面AndroidManifest.xml文件中各个标签的含义如下:
(1)第一层<Manifest>(属性)
xmlns:android
定义Android命名空间,一般为"http://schemas.android.com/apk/res/android" ,这样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。
package
指定本应用内 Java 主程序包的包名,也是一个应用进程的默认名称。
versionCode
用于设备程序识别版本(升级),必须是一个int类型的值,代表程序更新过多少次。
versionName
这个名称是给用户看的,你可以将你的应用程序版本号设置为 1.1 版,后续更新版本设置为 1.2、2.0 版本等。
(2)第二层<Application>属性
一个AndroidManifest.xml中必须含有一个<Application>标签,这个标签声明了每一个应用程序的组件及其属性(如icon、label、 permission等)。
android:description/android:label
此两个属性都是为许可提供的.均为字符串资源,当用户夫看许可列表(andrnid-lahel)或者某个许可的详细信息(android:description)时,这些字符串资源就可以显示给用户。
android:ico
声明整个应用程序的图标。
android:name
为应用程序所实现的Application子类的全名。当应用程序进程开始时,该类在所有应用程序组件之前被实例化。
android:theme
一个资源的风格,它定义了一个默认的土题风格给所有的 Activity,类似 style。
(3)第三层<Activity>属性
android:label
Activity 的名称
android:name
表示该Activity 显示的标题
(4)第四层<intent-filter>属性
<intent-filter>内会设定的内容包括 action、 data与 catcgory二种。
action 属性
只有“android:name”这个属性。常见的“android:name”值“android.intent.action.MAIN”,表明此 Activity 是作为应用程序的入口。
category 属性
常见的“android:name”值为"android.inent.category.LAUNCHER” ,决定应用程序是否显示在程序列表里。
(5)第二层<uses-sdk />属性
描述应用所需的API Level,即版本,在比属性中可以指定支持的最小版本, 目标版本以及最大版本。
4. Android的应用程序组件
Android 的一个核心特性就是一个应用程序可作为其他程序中的元素(那些允许这样的应用程序提供)。例如,如果你的程序需要用某些控件来编辑一些图片,另一个程序已经开发出了此项功能,且可供其他程序使用,你就可以直接调用那个程序的功能,而不是自己再开发一个。为了能够实现这样的功能, Android系统必须能够当在需要应用程序中任何一部分的时候启动它的进程,并且实例化那部分的Java 对象。为此,不像大多数其他系统中的程序, Android程序不是只有单一的进入点(如没有main方法),而是它们拥有系统实例化和运行必须的组件。
在之前文章我们学习了如何创建一个 Android 应用程序,并了解了 Android 的应用程序结构,接下来我们要学习Android应用程序中的四个重要组成部分,也就是我们一般所说的“应用组件” ,即Android的四大应用程序组件。
4.1 Activity——活动
Activity为用户提供了 个可视的用户界面。比如, 个短信程序可能有 个activity用来显示可以发送信息的联系人,第二个 activity 用来向选中的联系人写消息,其他的 activity用来查看以前的消息,或者更改设置。虽然应用程序中的各个activity所提供的用户界面聚合性很强,但是每个activity都独立于其他的activity,每一个实例化的activity都是Activity的子炎。
一个应用程序由一个或多个 activity 组成,需要多少个,取决于应用程序和它的设计。典型的,当应用程序启动的时候,activity 中的一个要首先、显示给用户。从一个activity移动到另一个,是用过当前的 activity 启动下一个来完成的。
每个activity都有一个默认的窗口。一般的情况是,这个窗口填满屏幕,但是他也可以小十屏幕和浮动到其他窗口的上面。窗口中的可视内容被一系列层次的视图(view,派生目View 类的对象)提供。每个视图都控制了窗口中的 一个矩形区域。父视图包含和组织子视图的布局。Android 提供了很多现成的视图供我们使用,包括按钮,文本框,滚动条,菜单项,复选框还有更多。整个视图层次通过 Activity.setContentView()方法放到 activity 的窗口上。
4.2 Service——服务
service没有用户界面,但它会在后台一直运行。例如, service可能在用户处理其它事情的时候播放背景音乐,或从网络上获取数据。每个 service 都扩展自类 Serivce。
多媒体播放器播放音乐是应用 service 的一个非常好的例子。多媒体播放器程序可能含有一个或多个 activity,用户通过这些 activity 选择并播放音乐。然而,音乐回放并不需要一个 activity 来处理,因为用户可能会希望音乐一直播放下去,即使退出了播放器去执行其它程序。为了让音乐一直播放,多媒体播放器 activity 可能会启动一个 service 在后台播放音乐。 Android系统会使音乐回放service一直运行,即使在启动这个service的activity退出之后。
应用程序可以连接到一个正在运行中的service。当连接到一个service后,可以使用这个service向外暴露的接口与这个 service 进行通信。对于上面提到的播放音乐的service,这个接口可能允许用户暂停,停止或重新播放音乐。与activity以及其它组件一样, service同样运行在应用程序进程的主线程中。所以它们不能阻塞其它组件或用户界面,通常需要为这些 service派生一个线程执行耗时的任务。
4.3 Broadcast receiver——广播接收器
broadcast receiver不执行任何任务,仅仅是接受并响应广播通知的一类组件。大部分广播通知是由系统产生的,例如改变时区,电池电量低,用户选择了一幅图片或者用户改变了语言首选项。应用程序同样也可以发送广播通知,例如通知其他应用程序某些数据已经被下载到设备上可以使用。
一个应用程序可以包含任意数量的boradcast reveiver来响应它认为很重要的通知。所有的 bvadcast icucivei 都扩展白类 DuadcastReucivei.
broadcast receiver不包含任何用户界面。然而它们可以启动一个 activity以响应接受到的信息,或者通过 NotificationManager 通知用户。可以通过多种方式使用户知道有新的通知产生,如闪动背景灯、震动设备、发出声音等。通常程序会在状态栏上放置一个持久的图标,用户可以打开这个图标并读取通知信息。
4.4 Content provider——内容提供者
应用程序可以通过content provider访问其它应用程序的一些私有数据,这是Android提供的一种标准的共享数据的机制。共享的数据可以是存储在文件系统中、SQLite 数据库中或其它的一些媒体中。content provider扩展自ContentProvider类,通过实现此类的一组标准的接口可以使其它应用程序存取由它控制的数据。然而应用程序开个会直接调用ContentProvider中的方法,而是通过类ContentResolver. ContentResolver能够与任何一个ContentProvider通信,它与ContentProvider合作管理进程间的通信。
任何时候当Android系统收到一个需要某个组件进行处理的请求的时候, Android会确保处理此请求的组件的宿主进程是否已经在运行,如果没有,则立即启动这个进程,当请求的组件的宿主进程已经在运行,它会继续查看清求的组件是否可以使用,如果不能立即使用,它会创建一个请求的组件的实例来响应请求。