Android开发之旅:应用程序基础及组件(续)

简介:

——成功属于耐得住寂寞的人,你离成功又近了一步了。

引言

上篇Android开发之旅:应用程序基础及组件介绍了应用程序的基础知识及Android的四个组件,本篇将介绍如何激活组关闭组件等。本文的主题如下:

  1. 1、激活组件:意图(Intents)
    1. 1.1、活动(Activity)组件的激活
    2. 1.2、服务(Service)组件的激活
    3. 1.3、广播接收者(Broadcast receiver)组件的激活
  2. 2、关闭组件
  3. 3、清单文件
  4. 4、Intent过滤器

1、激活组件:意图(Intents)

当接收到ContentResolver发出的请求后,内容提供者被激活。而其它三种组件——活动、服务和广播接收者,被一种叫做意图(intent)的异步消息激活。意图是一个保存着消息内容的Intent对象。对于活动和服务来说,Intent对象指明了请求的操作名称以及作为操作对象的数据的URI和其它一些信息。例如,它可以传递对活动的一个请求,让它为用户显示一张图片,或者让用户编辑一些文本。而对于广播接收者而言,Intent对象指明了广播的行为。例如当照相按钮被按下,它可以对所有感兴趣的对象广播。

对于每种组件来说,激活的方法是不同的。下面将分别介绍活动、服务、广播接收者组件的激活方法。

1.1、活动(Activity)组件的激活

通过传递一个Intent对象至Context.startActivity()Activity.startActivityForResult()以载入(或指定新工作给)一个活动。相应的活动可以看到初始的意图,这个意图通过getIntent() 方法来查看激活活动。Android调用活动的onNewIntent()方法传递任何后续的意图。

一个活动经常启动了下一个。如果它期望它所启动的那个活动返回一个结果,它会调用startActivityForResult()而不是startActivity()。例如,如果它启动了一个活动让用户挑选一张照片,它可能会返回被选中的照片。结果以一个Intent对象传递调用活动的onActivityResult() 方法。

1.2、服务(Service)组件的激活

通过传递一个Intent对象至Context.startService()以启动一个服务(或给予正在运行的服务以一个新的指令)。Android调用服务的onStart()方法并将Intent对象传递给它。

与此类似,一个Intent可以传递给Context.bindService()以在调用的组件和目标服务之间建立持续的连接。这个服务会在调用onBind() 方法中接受这个Intent对象(如果服务尚未启动,bindService()会先启动它)。例如,一个活动可以连接至前面讲到的音乐播放服务,并提供给用户一个可操作的(用户界面)以对播放进行控制。这个活动可以调用bindService()来建立连接,然后调用服务中定义的对象来控制播放。

1.3、广播接收者(Broadcast receiver)组件的激活

应用程序可以通过将Intent对象传递给

  1. Context.sendBroadcast()
  2. Context.sendOrderedBroadcast()
  3. Context.sendStickyBroadcast()

及其它类似方法来产生一个广播。Android会通过onReceive()方法将intent传递给所有对此广播有兴趣的广播接收者。

2、关闭组件

内容提供者仅在响应ContentResolver提出请求的时候激活。而一个广播接收者仅在响应广播信息的时候激活。所以,没有必要去显式的关闭这些组件。

而活动则不同,它提供了用户界面。与用户进行会话,所以只要会话依然持续,哪怕对话进程空闲,它都会一直保持激活状态。与此相似,服务也会在很长一段时间内保持运行。所以Android提供方法有序地关闭活动和服务。

  1. 可以通过调用它的finish()方法来关闭一个活动。一个活动也可以通过调用finishActivity()方法来关闭另外一个活动(它用startActivityForResult() 启动的)。
  2. 服务可以通过调用它的stopSelf()方法来停止,或者调用 Context.stopService()

当组件不再被使用的时候或者Android必须要为更多活跃的组件回收内存时,组件也可能会被系统关闭。

3、清单(manifest)文件

当Android启动一个应用程序组件之前,它必须知道那个组件是存在的。所以,应用程序会在一个清单(manifest)文件中声明它的组件,这个文件会被打包到Android包中。这个.apk文件还将包括应用程序的代码、文件以及其它资源。

这个清单文件是XML结构的文件,且所有的Android应用程序都把它叫做AndroidManifest.xml。为声明一个应用程序组件,它还会做很多额外工作,比如指明应用程序所需链接到的库的名称(除了默认的Android库之外)以及声明应用程序期望获得的各种权限。

但清单文件的主要功能仍然是向Android声明应用程序的组件。举例说明,一个活动可以如下声明:

 
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <manifest . . . >     
  3.     <application . . . > 
  4.          <activity android:name="com.example.project.FreneticActivity" 
  5.                    android:icon="@drawable/small_pic.png" 
  6.                    android:label="@string/freneticLabel" 
  7.                     . . .  >   
  8.          </activity> 
  9.           . . .   
  10.      </application> 
  11. </manifest> 

<activity>元素的name属性指定了实现了这个活动的Activity类的子类,iconlabel属性指向了包含展示给用户的此活动的图标和标签的资源文件。

其它组件也以类似的方法声明——<service> 元素用于声明服务,<receiver> 元素用于声明广播接收者,而<provider>元素用于声明内容提供者。清单文件中未进行声明的活动、服务以及内容提供者将不为系统所见,从而也就不会被运行。然而,广播接收者既可以在清单文件中声明,也可以在代码中动态的创建(作为BroadcastReceiver对象)且调用Context.registerReceiver()方式注册到系统。

4、Intent过滤器

Intent对象可以显式地指定目标组件。如果进行了这种指定,Android会找到这个组件(依据清单文件中的声明)并激活它。但如果Intent没有进行显式的指定,Android就必须为它找到对于intent来说最合适的组件。这个过程是通过比较Intent对象和所有可能对象的intent过滤器完成的。组件的intent过滤器会告知Android它所能处理的intent类型。如同其它关于组件的必要信息一样,它们在清单文件中进行声明的。这里是上面示例的一个扩展,其中加入了针对活动的两个intent过滤器声明:

 
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <manifest . . . >     
  3.     <application . . . > 
  4.          <activity android:name="com.example.project.FreneticActivity" 
  5.                    android:icon="@drawable/small_pic.png" 
  6.                    android:label="@string/freneticLabel" 
  7.                     . . .  >   
  8.               <intent-filter . . . > 
  9.                   <action android:name="android.intent.action.MAIN" /> 
  10.                   <category android:name="android.intent.category.LAUNCHER" /> 
  11.               </intent-filter> 
  12.               <intent-filter . . . > 
  13.                   <action android:name="com.example.project.BOUNCE" /> 
  14.                   <data android:mimeType="image/jpeg" /> 
  15.                   <category android:name="android.intent.category.DEFAULT" /> 
  16.               </intent-filter> 
  17.          </activity> 
  18.           . . .   
  19.      </application> 
  20. </manifest> 

示例中的第一个过滤器——action:“android.intent.action.MAIN”和category:“android.intent.category.LAUNCHER”的组合,是常见的。它标记这个活动显示在应用程序启动器中,用户在设备上看到的可启动的应用程序列表。换句话说,这个活动是应用程序的入口,是用户选择运行这个应用程序后所见到的第一个活动。第二个过滤器声明了这个活动针对特定类型的数据。

一个组件可以拥有任意数量的intent过滤器,每个声明一系列不同的能力。如果它没有包含任何过滤器,它将只能被显式声明了目标组件名称的意图激活。

对于广播接收者,它在代码中创建并注册intent过滤器,直接作为IntentFilter的对象实例化。其它过滤器则在清单文件中设置。

如果您现在对这些概念还没有完全理解,没关系这里我仅是让大家有个印象,知道这些概念或术语的存在,知道他们大概是做什么的。后面我还将陆续更详细地到这些东西并结合一些实例,到时候您就会清楚地知道这些东西。





     本文转自Saylor87 51CTO博客,原文链接:http://blog.51cto.com/skynet/365389,如需转载请自行联系原作者






相关文章
|
2月前
|
Web App开发 移动开发 前端开发
uniapp环境H5运行及发行(入门必学)
uniapp环境H5运行及发行(入门必学)
284 5
|
4月前
|
前端开发 C# 开发者
WPF开发者必读:MVVM模式实战,轻松构建可维护的应用程序,让你的代码更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,MVVM(Model-View-ViewModel)模式通过分离关注点,提高了代码的可维护性和可扩展性。本文详细介绍了MVVM模式的三个核心组件:Model(数据模型)、View(用户界面)和ViewModel(处理数据绑定与逻辑),并通过示例代码展示了如何在WPF项目中实现MVVM模式。通过这种模式,开发者可以更高效地构建桌面应用程序。希望本文能帮助你在WPF开发中更好地应用MVVM模式。
260 1
|
4月前
|
C# Windows IDE
WPF入门实战:零基础快速搭建第一个应用程序,让你的开发之旅更上一层楼!
【8月更文挑战第31天】在软件开发领域,WPF(Windows Presentation Foundation)是一种流行的图形界面技术,用于创建桌面应用程序。本文详细介绍如何快速搭建首个WPF应用,包括安装.NET Framework和Visual Studio、理解基础概念、创建新项目、设计界面、添加逻辑及运行调试等关键步骤,帮助初学者顺利入门并完成简单应用的开发。
162 0
|
4月前
|
前端开发 程序员 API
从后端到前端的无缝切换:一名C#程序员如何借助Blazor技术实现全栈开发的梦想——深入解析Blazor框架下的Web应用构建之旅,附带实战代码示例与项目配置技巧揭露
【8月更文挑战第31天】本文通过详细步骤和代码示例,介绍了如何利用 Blazor 构建全栈 Web 应用。从创建新的 Blazor WebAssembly 项目开始,逐步演示了前后端分离的服务架构设计,包括 REST API 的设置及 Blazor 组件的数据展示。通过整合前后端逻辑,C# 开发者能够在统一环境中实现高效且一致的全栈开发。Blazor 的引入不仅简化了 Web 应用开发流程,还为习惯于后端开发的程序员提供了进入前端世界的桥梁。
504 0
|
4月前
|
前端开发 开发者 C#
WPF开发者必读:MVVM模式实战,轻松实现现代桌面应用架构,让你的代码更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,MVVM(Model-View-ViewModel)模式通过分离应用程序的逻辑和界面,提高了代码的可维护性和可扩展性。本文介绍了MVVM模式的三个核心组件:Model(数据模型)、View(用户界面)和ViewModel(处理数据绑定和逻辑),并通过示例代码展示了如何在WPF项目中实现MVVM模式。通过这种方式,开发者可以构建更加高效和可扩展的桌面应用程序。
221 0
|
4月前
|
数据处理 开发者 C#
WPF数据绑定实战:从零开始,带你玩转数据与界面同步,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用开发中,数据绑定是核心技能之一,它能实现界面元素与数据源的同步更新。本文详细介绍了WPF数据绑定的概念与实现方法,包括属性绑定、元素绑定及路径绑定等技术,并通过示例代码展示了如何创建数据绑定。通过数据绑定,开发者不仅能简化代码、提高可维护性,还能提升用户体验。无论初学者还是有经验的开发者,都能从中受益,更好地掌握WPF数据绑定技巧。
105 0
|
前端开发 UED
「前端游戏开发体验」我用react实现网页游戏的全过程(包括规则设计)
用技术实现梦想,用梦想打开创意之门。游戏开发体验挺新奇的,我用react实现网页游戏的全过程(包括规则设计)。
787 1
|
缓存 Java 测试技术
移动设备交互应用 实验一 熟悉Android编程开发环境
移动设备交互应用 实验一 熟悉Android编程开发环境
324 0
移动设备交互应用 实验一 熟悉Android编程开发环境
|
JavaScript 前端开发 小程序
HaaS UI小程序解决方案基础教学之二: 搭建第一个UI页面
AliOS Things: 阿里云智能IoT团队自研的物联网操作系统,目前已获得国家 HaaS:全称是Hardware as a Service,阿里云智能IoT团队基于AliOS Things系统推出的硬件即服务 HaaS UI:全称是Hardware as a Service User Interface,是源自AliOS Things操作系统上的一套应用&图形解决方案,支持C/C++和 JS两种开发语言
HaaS UI小程序解决方案基础教学之二: 搭建第一个UI页面
|
数据可视化 定位技术 Android开发
可视化炫技利器诞生——VISLAB交互动画组件包发布,附详细介绍
VISLAB交互组件包的出现极大地拓展了DataV的展示与交互能力,本文作者—阿里云MVP陈琦将详细介绍此组件包的应用场景,并分享一些可视化数据分析案例与可视化心得。
4740 0