架构:
应用框架层(Java API Framework)所提供的主要组件:
名称 | 功能描述 |
---|---|
Activity Manager(活动管理器) | 管理各个应用程序生命周期,以及常用的导航回退功能 |
Location Manager(位置管理器) | 提供地理位置及定位功能服务 |
Package Manager(包管理器) | 管理所有安装在Android系统中的应用程序 |
Notification Manager(通知管理器) | 使得应用程序可以在状态栏中显示自定义的提示信息 |
Resource Manager(资源管理器) | 提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等 |
Telephony Manager(电话管理器) | 管理所有的移动设备功能 |
Window Manager(窗口管理器) | 管理所有开启的窗口程序 |
Content Provider(内容提供者) | 使得不同应用程序之间可以共享数据 |
View System(视图系统) | 构建应用程序的基本组件 |
四大组件:
1、Activity组件,它一个单独的窗口,程序流程都必须在[Activity]中运行,所有它是最基本的模块。
2、service组件,用于在后台完成用户指定的操作。
3、content provider组件,会为所有的应用准备一个内容窗口,并且保留数据库、文件。
4、broadcast receiver组件,是程序之间传递信息时的一种机制,作用就是接收或者发送通知。
四大组件可以通过 Intent 进行互相通信
Intent
Intent是一种运行时绑定(run-time binding)机制,它是一种基于某种想要被表露的意图的被动式数据结构,它能在程序运行过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来完成请求。
Intent 结构
action – 想要实施的动作,例: ACTION_VIEW, ACTION_EDIT, ACTION_MAIN, etc.
data – 具体的数据,一般由以Uri表示,例:通讯录中的某条记录,会以Uri来表示
category – 为实施的动作添加的额外信息,即Intent组件的种类信息,一个Intent对象可以有任意个category,例:CATEGORY_LAUNCHER 意味着,它应该在启动器中作为顶级应用而存在
type – 显示指定Intent的数据类型(MIME类型 - 多用途互联网邮件扩展,Multipurpose Internet Mail Extensions),例:一个组件是可以显示图片数据的而不能播放声音文件。很多情况下,data类型可在URI中找到,比如content:开头的URI,表明数据由设备上的content provider提供。但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导
MIME类型有两种:单个记录格式、多个记录格式
component – 指定Intent的目标组件的类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的,例如:Intent it = new Intent(Activity.Main.this, Activity2.class); startActivity(it);
extras – 附加信息,例如:it.putExtras(bundle) - 使用Bundle来传递数据;
ContentProvider:
ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider 对你应用中的数据进行添删改查。使用ContentProvider对外共享数据的好处是统一了数据的访问方式。
当应用需要通过ContentProvider对外共享数据时,需要继承ContentProvider并重写下面方法:
public class PersonContentProvider extends ContentProvider{
public boolean onCreate()
public Uri insert(Uri uri, ContentValues values)
public int delete(Uri uri, String selection, String[] selectionArgs)
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
public String getType(Uri uri)}
Uri代表了要操作的数据,Uri主要包含了两部分信息:1》需要操作的ContentProvider ,2》对ContentProvider中的什么数据进行操作,一个Uri由三部分组成:协议、authority和path:
ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://
主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
1.1 要操作person表中id为10的记录,可以构建这样的路径:/person/10
1.2 要操作person表中id为10的记录的name字段, person/10/name
1.3 要操作person表中的所有记录,可以构建这样的路径:/person
1.4 要操作xxx表中的记录,可以构建这样的路径:/xxx
1.5要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如下:
要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name
1.6如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")
broadcast:
广播分为两种类型: 标准广播和有序广播
标准广播 (Normal broadcasts) 是一种完全异步执行的广播, 在广播发出之后, 所有的广播接收器几乎都会在同一时刻接收到这条广播消息,无序。广播效率高,无法被截断的。
有序广播 (Ordered broadcasts)则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。有先后顺序,优先级高的广播接收器就可以先收到广播消息,并且可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。
注册方式:动态注册(通过java代码进行注册)、静态注册(在AndroidManifest.xml中注册,开机就启动)
本地广播:该机制下广播只能在应用程序内部传递,接收器也只能接受本应用程序发出的广播,只能用java代码动态实现。
粘性广播:这种广播会一直保留最后一条广播,即使已经有广播接收器处理了该广播,一旦又有匹配的官博接收器被注册,该粘性广播仍会被接收。
很多耗时程序用多线程处理,但子线程不能修改主线程生成的UI,解决方法有两种:1、使用Handler,子线程发送消息到主线程,主线程来修改UI。2、