购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.3 5大核心组件

知识点讲解:光盘:视频\知识点\第4章\5大核心组件.avi

一个典型的Android应用程序通常由5个组件组成,这5个组件实现了Android应用程序的核心功能。本节将一一讲解这5大组件的基本知识,为学习本书后面的知识打下基础。

4.3.1 Activity界面组件

Activities是这5个组件中最常用的一个组件。程序中Activity通常的表现形式是一个单独的界面(screen)。每个Activity都是一个单独的类,它扩展实现了Activity基础类。这个类显示为一个由Views组成的用户界面,并响应事件。大多数程序有多个Activity。例如,一个文本信息程序有这么几个界面:显示联系人列表界面、写信息界面、查看信息界面或者设置界面等。每个界面都是一个Activity,切换到另一个界面就是载入一个新的Activity。某些情况下,一个Activity可能会给前一个Activity返回值—如一个让用户选择相片的Activity会把选择到的相片返回给其调用者。

打开一个新界面后,前一个界面就被暂停,并放入历史栈中(界面切换历史栈)。使用者可以回溯前面已经打开的存放在历史栈中的界面,也可以从历史栈中删除没有界面价值的界面。Android在历史栈中保留程序运行产生的所有界面:从第一个界面,到最后一个。

4.3.2 Intent切换组件

Android通过一个专门的Intent类来进行界面的切换。Intent描述了程序想做什么(Intent意为意图、目的、意向)。Intent类还有一个相关类IntentFilter。Intent是一个请求来做什么事情,IntentFilter则描述了一个Activity(或下文的IntentReceiver)能处理什么意图。显示某人联系信息的Activity使用了一个IntentFilter,就是说它知道如何处理应用到此人数据的VIEW操作。Activities在文件AndroidManifest.xml中使用IntentFilters。

通过解析Intents可以实现Activity的切换,我们可以使用startActivity(myIntent)启用新的Activity。系统会考察所有安装程序的IntentFilters,然后找到与myIntent匹配最好的IntentFilters所对应的Activity。这个新Activity能够接收Intent传来的消息,并因此被启用。解析Intents的过程发生在startActivity被实时调用时,这样做有如下两个好处。

(1)Activities仅发出一个Intent请求,便能重用其他组件的功能。

(2)Activities可以随时被替换为有等价IntentFilter的新Activity。

4.3.3 Service服务组件

Service是一个没有UI且长驻系统的代码,最常见的例子是媒体播放器从播放列表中播放歌曲。在媒体播放器程序中,可能有一个或多个Activity让用户选择播放的歌曲。然而在后台播放歌曲时无须Activity干涉,因为用户希望在音乐播放的同时能够切换到其他界面。既然这样,媒体播放器Activity需要通过Context.startService()启动一个Service,这个Service在后台运行以保持继续播放音乐。在媒体播放器被关闭之前,系统会保持音乐后台播放Service的正常运行。可以用Context.bindService()方法连接到一个Service上(如果Service未运行的话,连接后还会启动它),连接后就可以通过一个Service提供的接口与Service进行通话。对音乐Service来说,提供了暂停和重放等功能。

1.如何使用服务

在Android系统中有如下两种使用服务的方法。

(1)通过调用Context.startService()启动服务,调用Context.stopService()结束服务,startService()可以传递参数给Service。

(2)通过调用Context.bindService()启动,调用Context.unbindService()结束,还可以通过ServiceConnection访问Service。二者可以混合使用,比如说可以先startService()再unbindService()。

2.Service的生命周期

在startService()后,即使调用startService()的进程结束了,Service还仍然存在,一直到有进程调用stopService()或者Service自己灭亡(stopSelf())为止。

在bindService()后,Service就和调用bindService()的进程同生共死,也就是说当调用bindService()的进程死了,那么它绑定的Service也要跟着被结束,当然期间也可以调用unbindService()让Service结束。

当混合使用上述两种方式时,例如你startService()了,我bindService()了,那么只有你stopService()而且我也unbindService()了,这个Service才会被结束。

3.进程生命周期

Android系统将会尝试保留那些启动了的或者绑定了的服务进程,具体说明如下所示。

(1)如果该服务正在进程的onCreate()、onStart()或者onDestroy()这些方法中执行,那么主进程将会成为一个前台进程,以确保此代码不会被停止。

(2)如果服务已经开始,那么它的主进程的重要性会低于所有的可见进程,但是会高于不可见进程。由于只有少数几个进程是用户可见的,所以只要不是内存特别低,该服务就不会停止。

(3)如果有多个客户端绑定了服务,只要客户端中的一个对于用户是可见的,就可以认为该服务可见。

4.3.4 Broadcast/Receiver广播机制组件

当要执行一些与外部事件相关的代码时,比如来电响铃时或者半夜时就可能用到IntentReceiver。尽管IntentReceiver使用NotificationManager来通知用户一些好玩的事情发生,但是没有UI。IntentReceiver可以在文件AndroidManifest.xml中声明,也可以使用Context.registerReceiver()来声明。当一个IntentReceiver被触发时,如果需要,系统自然会自动启动程序。程序也可以通过Context.broadcastIntent()来发送自己的Intent广播给其他程序。

4.3.5 ContentProvider存储组件

应用程序把数据存放在一个SQLite数据库格式文件里,或者存放在其他有效设备里。如果想让其他程序能够使用我们程序中的数据,此时ContentProvider就很有用了。ContentProvider是一个实现了一系列标准方法的类,这个类使得其他程序能存储、读取某种ContentProvider可处理的数据。 lgeQXEyFgic/keAhviVt3WEBArAYivlHJ+x2XX9Hyj2A7B9KhaH9dXhHsKz2+4HW

点击中间区域
呼出菜单
上一章
目录
下一章
×