Android面试基础(三)——四大组件的介绍

谈谈对Android四大组件的认识

一、Activity 

二、Service 

三、Broadcast Receiver 

四、Content Provider 

 

一、Activity 活动

 

  • 使用activity需要在AndroidManifest.xml中注册
  • onCreate(Bundle):在此方法中做一些初始化操作,初始化activity、setContentView(int)加载布局、控件的初始化等(findViewById(int))

  • onStart():可见不可操作,显示界面

  • onResume():可见可操作,此时的activity处于栈顶位置用户可以愉快的玩耍了

  • onPause():可见不可交互,此时界面没有获取焦点(如在activity中弹出dialog、设备休眠也可从onresume()进入到 onPause()状态),官方建议在这里保存状态信息(数据),通常用contentprovider来保存

  • onStop():不可见,被覆盖或最小化

  • onDestroy():销毁前调用的最后一个方法,可在此做一些解绑、资源回收等操作

  • onRestart():重新返回,下一个调用的是onStart()方法
    当activity被强制回收了,在被杀死前会调用onSaveInstanceState(Bundle)方法,可以在此保存一些有用的信息

 

一个 Activity 的启动顺序:
onCreate()——>onStart()——>onResume()

当AActivity启动BActivity的生命周期

A -> onPause()

B ->onCreate(),onStart(),onResume()

此时B才完全覆盖A

这时A->onStop()


 

2.BroadcastReceiver 广播接收者

Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。

注册BroadcastReceiver有两种方式:

静态注册

 

AndroidManifest.xml中用标签注册,并在标签内用标签设置过滤器。

 <receiver android:name="myRecevice">    //继承BroadcastReceiver,重写onReceiver方法

    <intent-filter>    

      <action android:name="com.dragon.net"></action> //使用过滤器,接收指定action广播

      </intent-filter>

  </receiver> 

动态注册


一般:在onStart中注册,onStop中取消unregisterReceiver

 IntentFilter intentFilter = new IntentFilter();
   intentFilter.addAction(String);   //为BroadcastReceiver指定action,使之用于接收同action的广播
    registerReceiver(BroadcastReceiver,intentFilter);//注册
  Intent intent = new Intent(actionString);//指定广播Action:
  intent.putExtra("msg", "我通过广播发送消息了");//通过Intent携带消息 
  Context.sendBroadcast(intent );//发送广播消息

BroadcastReceiver的两种常用类型 

  • 标准广播:是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎同时都会在同一时刻受到这条广播消息,这种广播的效率比较高,但同时也意味着它是无法被截断的
  • 有序广播:是一个同步执行的广播,广播发出后,同一时刻只有一个广播接收器能够受到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所有此时的广播接收器是有先后顺序的,优先级高的先受到广播,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法接收到广播消息了
     

在标准广播下两种注册方式的比较

(1)两种注册方式均不设置优先级

未设置优先级的情况下,先动态后静态

(2)将动态优先级设置为最低-1000,静态优先级设置为最高1000

动态仍先于静态被接收到

在有序广播下两种注册方式比较

静态广播1(优先级为200),静态广播2(优先级为300),静态广播3(优先级为400),静态广播优先级为(-100),动态广播优先级为0。

出现顺序由优先级决定,由高到低分别为静态3-静态2-静态1-动-静态。

总结两种注册方式特点

广播接收器注册一共有两种形式:静态注册和动态注册.

两者及其接收广播的区别:

(1)动态注册广播不是常驻型广播,也就是说广播跟随Activity的生命周期。注意在Activity结束前,移除广播接收器。

静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

(2)当广播为有序广播时:优先级高的先接收(不分静态和动态)。同优先级的广播接收器,动态优先于静态

(3)同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。

(4)当广播为默认广播时:无视优先级,动态广播接收器优先于静态广播接收器。同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后册的。
 

3. Service 后台服务

service 可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了
其他 Activity 这个时候程序要在后台继续播放,比如检测 SD 卡上文件的变化,
再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。


Service 是在一段不定的时间运行在后台,不和用户交互应用组件。


Service 和其他的应用组件一样,运行在进程的主线程中。这就是说如果
service 需要很多耗时或者阻塞的操作,需要在其子线程中实现


service 的两种启动模式模式

采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。


采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的 onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方 法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致 多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用 unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。 
 

请描述一下 Service 的生命周期

Service 有绑定模式和非绑定模式,以及这两种模式的混合使用方式。不同的使用方法生命周期
方法也不同。
非 绑 定 模 式 : 当 第 一 次 调 用 startService 的 时 候 执 行 的 方 法 依 次 为 onCreate() 、
onStartCommand(),当 Service 关闭的时候调用 onDestory 方法。
绑定模式:第一次 bindService()的时候,执行的方法为 onCreate()、onBind()解除绑定的
时候会执行 onUnbind()、onDestory()。
上面的两种生命周期是在相对单纯的模式下的情形。我们在开发的过程中还必须注意 Service 实
例只会有一个,也就是说如果当前要启动的 Service 已经存在了那么就不会再次创建该 Service 当然
也不会调用 onCreate()方法。
一个 Service 可以被多个客户进行绑定,只有所有的绑定对象都执行了 onBind()方法后该
Service 才会销毁,不过如果有一个客户执行了 onStart()方法,那么这个时候如果所有的 bind 客户
都执行了 unBind()该 Service 也不会销毁。
 

4.ContentProvider 内容提供者

ContentProvider管理android以结构化方式存放的数据。他以相对安全的方式封装数据并且提供简易的处理机制。Content provider提供不同进程间数据交互的标准化接口。保证被访问数据的安全性。内容提供器可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏的风险。

android 中对数据操作包含有:
file, sqlite3, Preferences, ContectResolver 与 ContentProvider 前三
种数据操作方式都只是针对本应用内数据,程序不能通过这三种方法去操作别的
应用内的数据。
android 中提供 ContectResolver 与 ContentProvider 来操作别的应用程序
的数据。


使用方式:


一个应用实现 ContentProvider 来提供内容给别的应用来操作,
一个应用通过 ContentResolver 来操作别的应用数据,当然在自己的应用中
也可以

1.ContentProvider


Android 提供了一些主要数据类型的 ContentProvider,比如音频、视频、
图片和私人通讯录等。可在 android.provider 包下面找到一些 Android 提供的
ContentProvider。通过获得这些 ContentProvider 可以查询它们包含的数据,
当然前提是已获得适当的读取权限。


2.ContentResolver


当外部应用需要对 ContentProvider 中的数据进行添加、删除、修改和查询
操作时,可以使用 ContentResolver 类来完成,要获取 ContentResolver 对象,
可以使用 Context 提供的 getContentResolver()方法。


3.Uri


Uri 指定了将要操作的 ContentProvider,其实可以把一个 Uri 看作是一个
网址,我们把 Uri 分为三部分。
第一部分是"content://"。可以看作是网址中的"http://"。
第二部分是主机名或 authority,用于唯一标识这个 ContentProvider,外
部应用需要根据这个标识来找到它。可以看作是网址中的主机名,比如
"blog.csdn.net"。
第三部分是路径名,用来表示将要操作的数据。可以看作网址中细分的内容
路径
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章