四大组件简介

Android的四大组件是Android开发者接触Android的第一步,所有android开发都离不开这四大基础组件。其可分为activity(活动)、service(服务)、content provider(内容提供者)、broadcast receiver(广播接受者)。

activity

Activity(活动)在Android中代表与用户交互的界面,一个Activity通常就是一个单独的屏幕(窗口),Android应用中多个页面(active)可相互跳转,需要注意的是需要将跳转前的active压入历史栈中进行状态保存;android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity。

Activity的生命周期就如同我们人类一样,对应出生、童年,青年,中年,老年、死亡分别有onCreate()、onStart()、onPause()、onResume()、onstop()、onDestroy():

  • onCreate():当这个界面(Activity)第一次创建的时候执行这个方法,且只运行一次,一般用于初始化操作,如:初始化view(setCountentView(view)),寻找控件 findViewById(id)等;
  • onStart():Activity在用户可见时调用;
  • onResume():当一个Activity和用户交互,获取到焦点的的时候执行(点击屏幕控件);
  • onPause():与onResume()方法对应,即activity不能和用户交互时(暂停时),activity失去焦点,界面上的view不能被点击的时候执行;
  • onRestart():从第一个activity跳转到第二个activity,再返回第一个 activity时,就会执行这个方法;
  • onstop():Activity不可见时调用,如Activity跳转;
  • onDestroy():与onCreate()方法相反,当一个activity销毁的时候调用。

其状态流转对应Activity四大状态:

  • 活动: Activity由用户启动,正在运行,并且在前台;
  • 暂停: Activity正在运行并且可见,但是被一个通知或者某个Activist覆盖了,用户可以看到,但不能与之交互;
  • 停止:Activity正在运行,但被已启动的另一个Activity所隐藏,应用程序无法直接向用户呈现任何有意义的内容,但可以通过通知的形式与用户通信;
  • 死亡: Activity从未启动或者被终止了。
  • android 在线ota android on_android

service

  • 一个Service 代表一段长生命周期的状态监控程序,service用于在后台完成用户指定的操作。例如,在音乐播放器中:各个播放状态的切换过程均由播放音乐的Service进行控制,同时,当用户切换至其它应用程序时,在后台进行继续播放,而不会导致音乐播放中断。
  • Service通常位于后台运行,它一般不需要与用户交互,因此Service组件没有图形用户界面。Service组件需要继承Service基类。Service组件通常用于为其他组件提供后台服务或监控其他组件的运行状态。

content provider

内容提供者(Content Provider)是Android提供的第三方应用数据的访问方案。在Android中,对数据的保护是很严密的,除了放在SD卡中的数据,一个应用所持有的数据库、文件等内容,都是不允许其他直接访问的。Android当然不会真的把每一个应用都做成一座“孤岛”,它为所有应用都准备可一扇窗,这就是Content Provider

  • android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。
  • 只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式。
  • ContentProvider实现数据共享。ContentProvider用于保存和获取数据,并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式,因为android没有提供所有应用共同访问的公共存储区。
  • 开发人员不会直接使用ContentProvider类的对象,大多数是通过ContentResolver对象实现对ContentProvider的操作。
  • ContentProvider使用URI来唯一标识其数据集,这里的URI以content://作为前缀,表示该数据由ContentProvider来管理。

broadcast receiver

  • 在Android中,广播是一种广泛运用的在应用程序之间传输信息的机制。而广播接收器是对发送出来的广播进行过滤接受并响应的一类组件。例如:音乐播放器会接收视频播放器、电话呼入、数据网络改变等外部事件进行响应,从而停止播放状态。而对于一般的事件则会进行过滤,不予响应。
  • 广播接收器没有用户界面,不可以直接显示状态,其通过启动一个activity或serice来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力,例如闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
  • 广播接收者的注册有两种方法,分别是程序动态注册和AndroidManifest文件中进行静态注册。
  • 动态注册广播接收器特点是当用来注册的Activity关掉后,广播也就失效了;
  • 静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用。
  • Android还有一套本地广播机制,就是为了解决广播的安全问题,因为系统全局广播可以被其他任何程序接收到,一些携带关键性数据的广播就可能被其他应用程序截获。而本地广播机制发出的广播只能在应用程序的内部进行传递,并且只能接收来自本应用程序的广播,这样就不存在安全问题了。
  • 今天了解了Android的静态注册和动态注册,Android在8.0以后,为了提高效率,删除了静态注册,防止关闭App后广播还在,造成内存泄漏。现在静态注册的广播需要指定包名,而动态注册就没有这个问题。并且,无论是静态注册广播还是动态注册广播,在接收广播的时候都不能拦截广播,否则会报错。
  • 谷歌官网的原文是:应用无法使用其清单注册大部分隐式广播。不过,是不能对大部分的广播进行注册,但还是有些广播可以进行静态注册的,比如对接收Android开机的广播通过静态注册还是能够正常接收的。