ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## Android应用的四大基本组件简介 Android应用通常由四部分组成,包括:Activity   Service   BroadcastReceiver   ContentProvider;本篇博客将对这四个组件做基本介绍,让大家对这些组件有一个大致的认识,后面的博客将还会对它们做详细讲解。 1. **Activity** Activity是android应用中负责与用户进行交互的的组件,就是我们android手机呈现界面的组件,你可以把它想象成相框,我们android应用呈现的画面都是在这个相框里面,而这个相框的大小就是我们手机屏幕的大小。他负责呈现画面给我们用户,并接受我们用户的点击 滑动等一系类响应事件。当我们把android应用要呈现的界面(XML文件)设计好后,然而activity只能通过setContentView(View) 来显示指定的界面,好比,我们把照片拍好后,选择用哪个相框来装载这张照片,因此这样 来为activity绑定显示界面。 setContentView(View)的使用一般是下面的形式: ~~~ <span style="font-size:14px;">setContentView(R.layout.main);</span> ~~~ 其中的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中使用<receiver.../>元素完成注册;         这里只对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有很多内容,后面的博客会做详细介绍。本次博客就介绍这么多。