Android应用的四大基本组件简介
Android应用通常由四部分组成,包括:Activity Service BroadcastReceiver ContentProvider;本篇博客将对这四个组件做基本介绍,让大家对这些组件有一个大致的认识,后面的博客将还会对它们做详细讲解。
- Activity
A
ctivity是android应用中负责与用户进行交互的的组件,就是我们android手机呈现界面的组件,你可以把它想象成相框,我们android应用呈现的画面都是在这个相框里面,而这个相框的大小就是我们手机屏幕的大小。他负责呈现画面给我们用户,并接受我们用户的点击 滑动等一系类响应事件。当我们把android应用要呈现的界面(XML文件)设计好后,然而activity只能通过setContentView(View) 来显示指定的界面,好比,我们把照片拍好后,选择用哪个相框来装载这张照片,因此这样 来为activity绑定显示界面。
setContentView(View)的使用一般是下面的形式:
- "font-size:14px;">setContentView(R.layout.main);
其中的R.layout.main 是android资源文件中的一个布局文件,相当于是相片。
注意的是,实际上Actvity是Window的容器,Activity包含一个getWindow()方法,这个方法返回Activity所包含的窗口,对于Activity,作为开发者的我们是不用关心它的window对象,如果应用程序不用调用Activity的setContentView()方法来设置该activity的显示界面,那么该应用将显示一个空的窗口。
一个android应用包含很多个Activity,多个activity组成activity栈,存储方式为先进后出,就像箱子里面放书一样,先放进去的书放在最下面,最后放进去的在最上面,所以当前运行的activity位于栈顶。
还有一点就是我们Activity可以设计它自身的风格,就是主题,使用setTheme(int resouceId)就可以指定activity的使用风格,比如有些时候我们的activity不需要使用actionBar 或者以对话框的形式显示,就可以使用这个方法实现,也可以在AndroidManifest.xml指定activity的显示风格。
2.
Service
Service可以说 是和activity一样重要的,它只是没有显示界面而已,service通常运行在后台,因为没有界面显示,所以一般不需要与用户进行交互。
Service组件需要继承Service基类,Service运行之后拥有自己独立的生命周期,Service组件通常是用于为其他组件提供后台服务,或者监听其他组件的运行状态。其中典型的应用就是 音乐播放器,首页是activity呈现给用户的界面,后台播放音乐有Service来完成,Service播放了多少秒然后通知Activity更新界面。Activity的播放暂停按钮被用户点击了,然后通知Service停止或播放音乐。
3. BroadcastReceiver
BroadcastReceiver 是 android 应用 中一个非常重要的组件,根据这个名字,大家肯定知道了它其实就是广播消息接收器,与普通的监听器不同的是:普通的监听器监听的事件源氏程序中的对象,而BroadcastReceiver监听的事件源是Android应用中的其他组件(activity receiver)。
使用broadcastReceiver组件接受广播消息比较简单,我们只需要实现自己的BroadcatReceiver子类,并重写onRecerver(Context context,Intent intent)方法即可。当其他组件通过sendBroadcast() 或者sentStickyBroadcast() 或者sentOrderBroadcast()方法发送广播消息时,如果该BroadcastReceiver对这个消息感兴趣,通过IntentFilter配置(这是一个过滤器,设置一些条件,如果某个消息和这些条件匹配,则激活BroadcastReceiver),BroadcastReceiver的onReceive()方法就会被激活,这个方法中设置的一些动作就会被执行。就像Service中播放音乐播放完了之后,它就通过sendBroadcast()向activity发送消息,activity收到消息后,就会执行BroadcastReceiver中的onReceive()中的方法,activity就会在界面上做出相应的界面更新。
BroadcastReceiver有两种注册方式,只有注册之后才能启动,否则是不会有消息发送和接收的。如下两种方法:
(1). 在java代码中通过Context.registReceiver()方法注册BroadcastReceiver;
(2). 在AndroidManifest.xml中使用元素完成注册;
这里只对BroadcastReceiver做简短介绍,后面的博客中将会对它进行详细讲解,并教会大家怎样开发和使用它。
4. ContentProvider
对于Android应用程序,它们是单独运行在自己的Dalvik虚拟机实例中,如果这些Android应用之间需要进行实时的数据交换,则需要contentProvider来完成这个工作,当要获取手机联系人时,就会用到它;
ContentProvider是Android系统为跨应用的数据交换的一个标准,当用户实现自己的ContentProvider的时候,要实现它的以后4个方法:
(1) insert(Uri, ContentValues):向ContentProvider插入数据;
(2) delete(Uri, ContentValues):删除contentProvider中指定的数据;
(3) update(Uri,ContentValues,String,String[ ]):更新ContentProvider中指定的ContentProvider;
(4) query(Uri, String[ ], String ,String[ ],String): 从ContentResolver查询数据;
通常使用ContentProvider时都会结合使用ContentResolver,一个应用程序来暴露自己的数据给外界,而另一个程序则通过ContentResolver来访问数据;
5. Intent 和 IntentFilter
intent在android 应 用 程序 中的地位非常之高,作用非常之大。它是Android应用程序内部不同组件之间通信的载体。当android运行时需要链接不同的组件时,就需要Intent来实现。Intent可以启动一个Activity,也可以启动一个Service,也可以通过发送广播消息来触发系统中的BroadcastReceiver。也就是说,intent是Activity,Service,BroadcastReceiver 这3个组件之间通信的载体,只是它们使用Intent的方式机制有些不同罢了。
(1)当需要启动一个activity时,可调用Context的startActivity(Intent intent)或者 startActivityForResult(Intent intent,int requestCode)方法,这两个方法中的intent都封装了需要启动的目标activity的信息;
(2)当需要启动一个Service时,可调用Context的startService(Intent intent)或者bindService(Intent service, ServiceConnection conn,int flags)方法,这两个方法中的intent都封装了需要启动的目标service的信息;
(3)当需要触发一个BroadcastReceiver时,可调用Context的sendBroadcast(Intent intent) 或 sendStickyBroadcast(Intent intent) 或 sendOrderBroadcast(Intent intent,String receiverPermission) 方法来发送广播消息,这三个方法中的intent封装了需要触发的目标BroadcastReceiver 的信息
;
通过上面的介绍,可以看出,Intent封装了当前组件需要启动或触发的目标的信息,然而Intent分为两类:
(1) 显示 Intent :显示Intent明确指定需要启动或者触发的组件的类名;
(2) 隐示 Intent:隐示Intent只是指定了需要启动启动或者触发的组件需要应满足怎样的条件;
对于显示Intent,Android系统无需对该Intent做任何解析,系统直接找到指定的目标组件,启动会触发它即可;
对于隐示Intent,Android系统需要对该Intent进行解析,解析出它的条件,然后去系统中查找与之匹配的目标组件。如果有满足条件的组件就启动或触发它。
隐示Intent通过IntentFilter来实现的,被调用组件可以通过IntentFilter来声明自己所满足的条件,就是声明自己到底能处理哪些Intent。Intent和IntentFilter有很多内容,后面的博客会做详细介绍。本次博客就介绍这么多。