Android 四大组件(进阶第一天)

2018-02-24  本文已影响0人  石头前行记

面试基础题


1 四大组件

首先我们可以回答 四大组件分别为Activity、Service(服务)、Content Provider(内容提供者)、还有最后一个就是BrocastReciver(广播)

这时你要自己主动的说下(切记不要让面试官让你介绍下)四大组件是什么的 是干什么的 有什么用?

那我们先从第一个也是我们经常用到的 Activity说起,比如你打开一个App的界面就相当于启动了一个单独的屏幕,可以通过Intent来进行数据之间的传递,并且每个Activity都有自己的生命周期 下面这张图就解释了6种状态 7中方法(不要忘记onRestart这个)  还有一个就是一步小心就会出现的 忘记在AndroidManifest注册 导致空指针的出现

Activity的生命周期

Service(服务) 首先服务是在后台处理完成用户指令的操作,比如我们用到最多的播放音乐,下载等,那它的特点:无用户界面、在后台运行、生命周期长。和activity一样有自己的生命周期,但是不同的是服务分为startService(启动服务)和(boundService)绑定服务 所以生命周期也就不同了。那么 启动服务和绑定服务有什么区别呢?下面我们先来从字面意思上说下  个人理解呀 启动服务 同生不同死 (只有服务调用本身的stopSelf()方法或者其他组件调用stopService()才能停止服务) 绑定服务 同生同死   注册也是在AndroidManifest 使用<service> </service>标签注册。下面这张图就是启动与绑定服务的生命周期(左边的是启动,右边的是绑定)。同时Service是运行在主线程中的,如果有什么耗时的操作,建议新建子线程去处理,避免阻塞主线程,降低ANR的风险。使用service出现的问题,隐式Intent启动去调用bindService()方法,系统会抛出异常。可以通过设置android:exported=false来确保这个Service仅能在本应用中使用。


左启动右绑定服务生命周期

咱们先来说下广播(BrocastReciver) 广播是用来异步接收广播Intent  分为两大类 正常广播和有序广播 。 正常广播是完全异步的,它们运行到一个没有定义顺序的状态下,但是不能得到我们所要的使用的结果或中止接受。 有序广播,就是每个receiver执行后可以传播到下一个receiver,也可以完全中止传播--不传播给其他receiver。 而receiver运行的顺序可以通过intent-filter 里面的android:priority来控制,当priority优先级相同的时候,Receiver以任意的顺序运行。避免系统超载,我们一次只能运行一个receiver。 通过广播onReceive我们发现当该函数返回,对象就已经无效了,结束了生命周期。所以我们在调用onReceive不能进行耗时操作,通过activity或者seciver来进行。注册广播也分为静态注册和动态注册 个人喜欢静态注册的 毕竟在Xml中方便观看,而动态注册,需要在退出程序前要记得调用Context.unregisterReceiver()方法。一般在activity的onStart()里面进行注册, onStop()里面进行注销。


最后就到我们最后一个组件 内容提供者(ContentProvider)平常用到的频率比较少。主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作。ContentProvider分为系统的和自定义的,系统的也就是例如联系人 图片 音视频等。使用ContentProvider共享数据的好处是统一了数据访问方式。比如说我们要对外进行文件共享 那么我们就需要一个文件操作的读写数据。什么情况下会用到?  当你需要在多个应用之间共享数据的时候就需要用到内容提供者。主要方法创建 增删改查,这个方法 getType(Uri) 用于返回指定的Uri中的数据的MIME类型。说到MIME类型我们先看下Uri我们把Uri分为三部分,第一部分"content://"可以看成是网址的"http://"。第二部分 是用来唯一标识这个ContentProvider  比如说是这样的shi.qianjin 也就是网址中的主机名。第三部分是路径名,用来表示将要操作的数据。可以看作网址中细分的内容路径。完整的ContentProVide的content://shi.qianjin/person/10。 第一部分为content:// 第二部分为shi.qianjin 第三部分为person/10。so我们看看刚刚提到的MIME类型是什么样子的。我们分为集合类型和非集合类型。如果操作的数据属于集合类型,MIME类型字符串应该以vnd.android.cursor.dir/开头。如果不是集合类型,那么MIME类型字符串应该以vnd.android.cursor.item/开头。

上一篇下一篇

猜你喜欢

热点阅读