Android应用程序组成

    一般来说,Android程序由以下四部分组成:Activity;Broadcast Intent Receiver;Service;Content Provider。


1.Activity

    Activity是Android最基本的模块之一。是Android应用中负责与用户交互的组件——可以想象成Swing编程中的JFrame控件(与JFrame的区别在于:JFrame本身可以设置布局管理器,不断向JFrame中添加组件,但Activity只能通过setContentView(View)来显示指定的组件)。

    在Activity中,可以添加一些View,并且可以对这些View做一些事件的处理。一般一个Android应用是由多个Activity组成,这多个Activity之间可以跳转。和网页跳转稍有些不一样的是,Activity之间的跳转可能有返回值。

当打开一个新的屏幕时,之前一个屏幕会被置为暂停状态,并且压入历史堆栈中。用户可以通过回退操作返回到以前打开过的屏幕。可以选择性的移除一些没有必要保留的屏幕,因为Android会把每个应用的开始到当前的每一个屏幕保存在堆栈中,当前活动的Activity位于栈顶。

    Activity是由Android系统进行维护的,它也有自己的生命周期。Activity包含了一个SetTheme(int resid)方法来设置其窗口的风格。


2.BroadcastReceiver

    BroadcastReceiver代表广播消息接收器,来让应用对一个外部的事件做出响应。例如,当电话呼入这个外部事件到来的时候,可以利用BroadcastReceiver进行处理。BroadcastReceiver不能生成UI,也就是说对于用户来说不是透明的,用户是看不到的。

    BroadcastReceiver非常类似于事件编程中的监听器。与普通事件监听器不同的是:普通事件监听器监听的事件是程序中的对象而BroadcastReceiver监听的事件源是Android应用中的其他组件。

    BroadcastReceiver通过NotificationManager来通知用户这些事情发生了。BroadcastReceiver既可以在AndroidMainfest.xml中注册,也可以在运行时的代码中使用Context.registerReceiver()进行注册。只要是注册了,当事件来临的时候,即使程序没有启动,系统也在需要的时候启动程序。各种应该还可以通过使用Context.sendBroadcast()将它们自己的intent Broadcasts广播给其他应用程序。


3.Service

    Service是一种程序,它可以运行很长的时间,但却没有用户界面。通过startService(Intent service)可以来启动一个Service,通过Context.bindService()可以绑定一个Service。

    Service与Activity的地位是并列的,它也代表了一个单独的Android组件。Service与Activity的区别在于:Service通常位于后台运行,它一般不需要与用户交互。与Activity组件需要继承Activity基类类似,Service组件需要继承Service基类。一个Service组件被运行起来之后,它将拥有自己独立的生命周期,Service组件通常用于为其他组件提供后台服务或监控其他组件的运行状态。


4.Content Provider

    数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据,以及一些其他类型的数据。一个Content Provider类实现了一组标准的方法接口,从而能够让其他应用保存或读取此Content Provider的各种数据类型。一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据暴露出去。外界根本看不到,这个应用暴露的数据在应用当中是如何存储的,而外界可以通过这一套标准且统一的接口和程序里的数据打交道。

    通常与ContentProvider结合使用的是ContentResolver,一个应用程序使用ContentProvider暴露自己的数据,而另一个应用程序则通过ContentResolver来访问数据。


5.Intent和Intent Filters

    严格来说,Intent并不是Android应用的组件,但它对Android应用的作用非常大——它是Android应用内不同组件之间通信的载体。当Android运行时需要连接不同的组件时,通常需要借助Intent来实现。

    Intent在Android的官方API文档里,是这样定义的:“An Intent is an abstract description of an operation to be performed”。一个Intent就是一次对将要执行的操作的抽象描述。通过Intent可以在多个Activity之间进行跳转。Intent中两个最重要的部分是Intent的动作(Action)和动作对应的数据(Data)。典型的动作类型有,MAIN(Activity的门户)、VIEW、PICK、EDIT等。而动作对应的数据则以URI的形式进行表示。

    Intent可以启动应用中另一个Activity,也可以启动一个Service组件,还可以发送一条广播消息来触发系统中的BroadcastReceiver。也就是说,Activity、Service、BroadcastReceiver三种组件之间的通信都以Intent作为载体,只是不同组件使用Intent的机制略有不同而已。

§当需要启动一个Activity时,可以调用Context的startActivity(Intent intent)方法,该方法中的Intent参数封装了需要启动的目标Activity的信息。

§当需要启动一个Service时,可以调用Context的startService(Intent intent)方法或者bindService(Intent service,ServiceConnection conn,int flags)方法,这两个方法中的Intent参数封装了需要启动的目标Service的信息。

§当需要触发一个BroadcastReceiver时,可调用Context的sendBroadcast(Intent intent)、sendStickyBroadcast(Intent intent)或sendOrderedBroadcast(Intent intent,String receiverPermission)方法来发送广播消息,这三个方法中的Intent参数封装了需要触发的目标BroadcastReceiver的信息。

    可以发现,Intent封装了当前组件需要启动或触发的目标组件的信息。

eg:

//实现从Activity A跳转到Activity B。

Intent in = new Intent(A.this, B.class);

startActivity(in);

    当一个组件通过Intent表示了启动或触发另一个组件的“意图”之后,这个意图就可以分为两类:(1)显式Intent,显式Intent明确指定需要启动或者触发的组件的名称;(2)隐式Intent,隐式Intent只是指定需要启动或者触发的组件应满足怎样的条件。对于显式Intent而言,系统无须对该Intent做任何解析,系统直接找到指定的目标组件,启动或者触发它即可。对于隐式Intent而言,系统需要对该Intent进行解析,解析出它的条件,然后再去系统中查找与之匹配的目标组件。如果找到符合条件的组件,就启动或触发它们。

    如果说Intent是一个有效请求,一个Intent Filters则用于描述一个Activity(或者Intent Receiver)能够操作哪些Intent,也可以判断被调用组件是否符合隐式Intent(组件可以通过IntentFilter来声明自己到底处理哪些隐式Intent)。一个Activity如果要显示一个人的联系方式时,需要声明一个Intent Filters,这个Intent Filters要知道怎么去处理VIEW动作和表示一个人的URI。Intent Filters一般在AndroidManifest.xml中定义。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值