Android物语:Android四大组件

Android四大组件及其作用

  • 活动(activity)

Activity可以看成是安卓系统的根本,在这个根本上才可以进行其他的工作,因为在安卓系统里运行的所有的程序,它的流程都必须在【活动】中运行,所有他是最基本的模块。它的作用是一个框架或页面,每个程序会有多个【活动】组成。

  • 服务(Service)

Service是安卓里非常很重要的组件,它的地位和优先级别是与活动相似的,不过Service不能够自己运行,它只能在安卓的后台运行。它的作用就是与安卓的其他逐渐进行交互,举个简单例子:当我们打开手机上音乐播放器并将它放到后台,此时播放的音乐就是由Service在负责控制。

  • 广播接收器(BroadcastReceiver)

在安卓系统中,广播接收器并不是直接就可以看到的,它是程序之间传递信息时的一种机制,作用就是接收或者发送通知。通俗的来说广播接收器更像是一种传递组件,它能够将信息接收,甚至还可以对它进行过滤然后进行响应。

  • 内容提供商(Content Provider)

内容提供商这个组件是专门为第三方应用而设计的,它非常的灵活,而且相当重要,它会为所有的应用准备一个内容窗口,并且保留数据库、文件,作用就是我们在使用这些第三方软件的时候,可以有效的访问,并且保护里面的数据。

Activity

Activity的生命周期

image.png

Activity的简单生命周期流程为:
onCreate();→onStart();【注:此时Activity处于不可见状态】
→onResume();【注:此时Activity处于运行状态】
→onPause();【注:此时Activity处于暂停状态】
→onStop();【注:此时Activity处于停滞状态】
→onDestroy();【注:调用了此方法后Activity生命周期结束】
其中当Activity正在重新启动的时候,从不可见变为可见的时候,会调用到onRestart();也就是说一个Activity包含七个生命周期流程

  • Activity被其他Activity覆盖其上,系统会调用onPause()方法,暂停当前Activity的执行,若用户取消了覆盖,系统会调用onResume()方法,重新进入到运行状态。

  • Activity跳转到了新的Activity界面或者被后台了或者锁屏时,系统会调用onPause();然后调用onStop();使Activity进入到停滞状态,如果重新回到了该Activity界面(上一个Activity或者从后台变为了前台时或者解开锁屏时),系统会调用onRestart();再调用onStart();最后调用onResume()方法使该Activity进入到运行状态

  • 当用户退出Activity时会调用onPause();然后调用onStop();最后调用onDestory();结束Activity生命周期

  • 当Activity中弹出dialog对话框的时候,Activity不会调用onPause();只有当Activity启动了dialog风格的Activity时才会调用

  • 当Activity是由于异常情况下终止的,系统会调用onSaveInstance来保存当前Activity状态,这个方法调用的时机是在onStop之前的,当Activity重新创建后,系统会调用onRestoreInstanceState,并且把Activity销毁时的onSaveInstanceState方法保存的bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法

Activity的四种启动模式
Activity有四种启动模式,我们可以在清单文件的

  • standard模式:在这种模式下,activity默认会进入启动它的activity所属的任务栈中。这也是默认的一种模式
  • singleTop模式:栈顶复用模式。如果新activity位于任务栈的栈顶的时候,activity不会被重新创建,同时它的onNewIntent方法会被回调。
  • singleTask模式:栈内复用模式。只要activity在一个栈中存在,那么多次启动此activity不会被重新创建单例,系统会回调onNewIntent。这种模式可以称为单例模式,只会存在一种,有则直接从栈中调用,没有则创建并且压入栈中
  • singleInstance模式:单实例模式。这种模式的activity只能单独地位于一个任务栈中,这种与singleTask有点类似,其实也是有则直接调用,没有则创建并且放入栈中,只不过singleTask是可以和其他的Activity放在同一个栈中,singleInstance则是只会将创建的Activity放在一个栈中,并且这个栈中只会有这一个Activity实例

Service

  • Service分为两种,一种是Service(这一种是运行在主线程中的,如果要执行耗时操作,可在service中创建一个异步来执行),一种是IntentService(这是一种异步服务,是继承于Service的子类),所以推荐当要执行耗时操作时使用IntentService,如果不耗时,我们可以使用Service
  • Service 负责与UI无关的工作 【后台】执行的操作
    Android的后台就是指,它的运行是完全不依赖UI的。即使Activity被销毁,或者程序被关闭,只要进程还在,Service就可以继续运行。

Service的两种启动方式

  • 通过start方法开启服务
  • 通过bind的方式启动服务

Broadcast

android中的广播就像我们平时说的电台广播,一个广播可以有多个接受者,广播机制是一个典型的发布-订阅模式(观察者模式)。广播机制最大的特点就是发送方并不关心接受方是否接受或是如何处理数据的,这样接收双方完全解耦合。

广播机制主要包含三个要素,发送广播的BroadCast 、接收广播的BroadCastReceiver、用于传递信息的Intent。

1.注册方式

  • 静态注册 AndroidManifast.xml中,只要app在运行就一直能接收到广播。

  • 动态注册 在activity或service中注册,它们若被销毁,广播也就接受不到了。

2.生命周期
onReceive()
生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报ANR 程序无响应的错误信息。

如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由Service 来完成。

不要在广播接受者中创建子线程,因为它的生命周期非常短,子线程可能还没有结束BroadcastReceiver 就先结束了,子线程相应也就结束了。

3.类型
Android广播主要分为普通广播、有序广播、本地广播、 Sticky广播。

  • 普通广播:
    sendBroadcast(Intent intent)发送广播
    优点:效率高
    缺点:一个接受者不能将处理结果传递给下一个接受者,并且无法终止广播的传播。完全异步,接收器的执行顺序不确定。

  • 有序广播:
    sendOrderedBroadcast(intent, receiverPermission)
    缺点:效率低
    优点:按优先级别由高到低依次传播,高级别的或同级别先接收到广播的可以通过abortBroadcast()方法截断广播使其他的接收者无法收到该广播。也可以通过setResultExtras(bundle)方法将处理结果存入bundle中,下一个接受可以通过getResultExtra(true) 方法获取上一个接受者传来的bundle数据。

  • 本地广播:
    LocalBroadcastManager 普通广播和有序广播都是全局广播,所有应用程序都可以接收到,这样就会带来安全隐患。但是有的时候我们并不需要把自己的应用内的信息广播给所有应用,而只是在进程内使用。所以使用本地广播就能实现限于应用内的广播。本地广播和普通广播只是操作的类不一样,其他接口都类似,只需把从前的registerReceiver()变成LocalBroadcastManager.getInstance(context).registerReceiver()。替换成本比较低,为了程序的安全性,建议在不需要其他进程接收广播的情况下使用本地广播。

  • Sticky广播:
    sendStickyBroadcast 用此函数发送的广播会一直滞留,当有匹配此广播的广播接收器被注册后,该广播接收器就会收到此条广播。(记得在AndroidManifest 里注册BROADCAST_STICKY权限)。sendStickyBroadcast只保留最后一条广播,并且一直保留下去,这样即使已经有广播接收器处理了该广播,当再有匹配的广播接收器被注册时,次广播仍然会被接收。如果你只想处理一遍该广播,可以通过removeStickyBroadcast()函数实现。

ContentProvider

  • ContentProvider 应用间数据共享 使用其对外共享数据的好处是统一了数据的访问方式,实际上是对SQliteOpenHelper 的进一步封装,通过Uri地址映射来判断选择需要操作数据库中的哪个表,并且进行增删改查处理。

  • Content Provider 内容提供者,用于对外提供数据

  • Content Resolver 内容解析者,用户获取提供者提供的数据(外部应用通过resolver来访问provider)

  • Content Observer 内容监听器,可以监听数据的改变状态

使用Content Provider对外共享数据的步骤:

定义一个类继承Content Provider,然后重写query、insert、delete、update方法等

附录
参考文档:https://www.jianshu.com/p/0f52a3defc1d

你可能感兴趣的:(Android物语:Android四大组件)