您的位置:首页 > 移动开发 > Android开发

【Android】四大基本组件——Activity、Service、ContentProvider和BroadcastReceive

2017-01-25 03:25 651 查看
Android应用中通常由一个或多个基本组件构成整个应用程序APP,最常见的就是Activity了。Android有四大组件,六大布局(好像也有人说四大组件,五大布局)。Activity就是四大组件之一,除了Activity之外还有Service、ContentProvider和BroadcastReceive。

什么是Activity呢?它给我们最直接的感受就是我们打开APP之后我们所看到的就是一个Activity。每个Android App至少会有一个Activity。Activity主要负责屏幕显示画面,并处理与用户的互动。就是监听并对用户事件做出响应。起初我误认为,Activity还是各种控件的容器和载体,其实不对。控件的容器是View组件,Activity只能通过setContentView(view)显特定组件。而或许可以把Activity看成是view的容器,因为通过Activity可以讲View显示出来。

每个Activity或者说每次使用四大组件都应该跟获取权限一样在AndroidManifests.xml中声明。而且,我们发现Android开发过程中没有C语言或是C++语言中必须要有的main函数。同样是在AndroidMainfests.xml中声明了App启动哪个Activity,这个Activity就是这个App的入口。类似于main函数。

Service是没有界面的组件,它不能自己启动,只能由其他组件来启动它,当然Service也是可以启动其他Service的,它只能在后台运行,可以和其他组件进行交互。举例:我们进入音乐播放器的Activity中点击了播放音乐的Button,此时就开始播放音乐了。如果这时候,我们要和朋友聊天或是要使用别的App,那么我们就会切出去。此时能音乐并不会因此而停止,因为Sevice在后台运行并没有停止。Service有两种方式:

(1)Context.startService()

      启动时,startService –> onCreate() –> onStart()

       停止时,stopService –> onDestroy()

(2)Context.bindService():

       绑定时,bindService  -> onCreate() –> onBind()

       解绑定时,unbindService –>onUnbind() –> onDestory()

这两者的区别在于Service将自己的生命周期交给谁?如果是采用第一种方法,Service将生命周期控制在自己手中,即使启动它的组件例如Activity已经销毁了,但是Service并不会被销毁;如果采用第二种绑定的方式,就是将自己的生命周期和启动它的组件绑定在一起了。此时,如果启动它的组件销毁了,Service也会跟着被销毁。

ContentProvider:各个应用程序是相互独立的,但是有的时候对我们而言是很不方便的。比如,我们准备通过社交软件发送一张我们之前出去旅游时候用手机照相机拍摄的照片的时候,如果各个程序是相互独立的,那么社交软件是无法访问到我们拍摄的照片的。那么就有了ContentProvider这种机制来解决这个问题。它可以让App之间实现数据交换。通常情况下,ContentProvider与ContentResolver结合使用,一个应用程序使用ContentProvider暴露自己的数据,另一个应用程序使用ContentResolver来访问数据。Android为这种跨应用的数据交换提供了一个标准,当用户实现自己的ContentProvider时,需要实现如下抽象方法:

(1)insert(Uri,ContentValues):向ContentProvider插入数据

(2)delete(Uri,ContentValues):删除ContentProvider中指定的数据

(3)update(Uri,ContentValues,String,String[ ]):更新ContentProvider中指定的数据

(4)query(Uri,String[ ],String,String[ ],String):从ContentProvider查询数据

Broadcast是一种广泛应用在应用程序之间的传输信息的机制。而BroadcastReceive是对发送出来的Broadcast进行过滤并响应的一类组件。可以使用BroadcastReceive让应用对外部事件做出响应。比如:闹钟。BroadcastReceive在没到我们设定时间的时候是不会发生响应的,因此此时的时间事件不是它需要的,因此被它过滤了。当且仅当到了我们设定的时间的时候,此时的时间是有用的,那么BroadcastReceive就会对此做出响应。

而且,BroadcastReceive有别与前面三个组件的一点是:BroadcastReceive没有强制要求要在AndroidManifest.xml中声明。因为BroadcastReceive也可以在运行是的代码中使用Context.registerReceive()进行注册声明。不论使用哪种方法进行注册,当时间来临的时候,即使程序没有启动,系统也在需要的时候启动程序。各种应用还可以通过使用Context.sendBroadcast()将他们自己的Intent Broadcast广播给其他应用程序。应该也是利用了这一点,各种全家桶才能够相互唤醒,不断自启。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐