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

[基础] 3. Android四大组件

2018-03-13 13:35 176 查看

Android四大组件

四大组件:Activity,Service,Broadcast,ContentProvider

只有BroadcastReceiver可以在AndroidManifest或代码中册,其他都必须在AndroidManifest文件中注册

只有ContentProvider的调用不需要借助Intent,其他三个组件都需要借助Intent

Activity是一种展示型组件,户展示界面并和用户交互

对用户来说Activity就是一个Android应用的全部,其他三大组件对用户都是不可感知的

可由显式(package name + class name)或者隐式Intent(action)来启动

只有一种运行模式:启动状态

可以通过finish方法结束(最上面的Activity移出了栈)

Service是一种计算型组件,用于在后台执行计算任务

有两种运行模式:启动状态和绑定状态

启动状态:Service内部可以做一些后台计算,并且不需要和外界有直接的交互

绑定状态:Service内部可以做一些后台计算的同时,外界可以很方便地和Service组件进行通信

Service的onBinde只会执行一次除非Service被终止了,其他会调用onRebind

特别注意service本身是运行在主线程中的,因此耗时任务需要在单独的线程中去完成。

超过20 seconds会提示ANR,建议使用线程池

停止需要灵活采用stopService和unBindService两个方法

BroadcastReceiver广播是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息

广播有两种注册方式:静态注册和动态注册

静态注册是在AndroidManifest中注册,在应用安装的时候会被系统解析,不需要应用启动就可以收到相应的广播。

动态注册需要通过Context.registerReceiver()来注册,需要应用启动才能注册并接收广播

通过Context的一系列send发送广播,发送和接收过程匹配都是通过广播接收者额来描述

低耦合的观察者模式

不适合执行耗时操作,10 seconds就会ANR

BroadcastReceiver组件一般来说不需要停止,它也没有停止的概念

默认广播不会发给已停止的应用(好像是Android 3.1开始)

ContentProvider是一种数据共享型组件,用于向其他组件乃至其他应用共享数据。

内部需要实现增删改查四种操作

一版来说ContentProvider都应该是单例的(默认android:mulitprocess 为false)

内部维持一份数据集合可以通过数据库实现,也可以采用其他任何类型(比如List,Map等)。对数据集没有任何要求

需要注意ContentProvider中的insert、delete、update、query方法需要处理好线程同步,因为这几个方法是在Binder线程池中被调用

ContentProvider组件也不需要手动停止

ContentProvider的OnCreate会先于Application的OnCreate执行

总结:

Activity, Service, BroadcastReceiver, ContentProvider的工作流程都离不开AMS,ApplicationThread,ActivityThread

ApplicationThread(Binder类型)是ActivityThread的内部类,ActivityThread持有ApplicationThread的实例

AMS也持有ApplicationThread实例(ActivityThread main方法调用attach传给AMS)

ApplicationThread是实现AMS和ActivityThread间的通信,实质上Binder机制通讯
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: