1.Activety 活动
- 创建Activity
定义Activity
- 定义类继承Activity
- 在AndroidManifest.xml的<application>节点中声明<activity>
显示意图创建Activity数据传递
- 构造函数,代码少 new Intent(this, NewActivity.class);
- 类名形式,灵活,可扩展性强 intent.setClassName(this, "cn.itcast.activity.NewActivity");
- 包名类名形式,可启动其他程序中的Activity intent.setClassName("cn.itcast.downloader", "cn.itcast.downloader.MainActivity");
- 在意图对象中封装了一个Bundle对象,可以用来携带数据
- 在新Activity中可以获得意图对象以获取其中Bundle保存的数据
隐式意图传递
- 使用startActivityForResult(Intent intent, int requestCode) 方法打开Activity
- 重写onActivityResult(int requestCode, int resultCode, Intent data) 方法
- 新Activity中调用setResult(int resultCode, Intent data) 设置返回数据之后,关闭Activity就会调用onActivityResult方法
隐式意图创建: 隐式意图不指定组件,通过动作、类型、数据匹配对应的组件
- 在清单文件中定义<activity>时需要定义<intent-filter>才能被隐式意图启动
- <intent-filter>中至少配置一个<action>和一个<category>,否则无法被启动
- Intent对象中设置的action、category、data在<intent-filter>必须全部包含才能启动
- <intent-filter>中的<action>、<category>、<data>都可以配置多个,Intent对象中不用全部匹配,每样匹配一个即可启动
- 生命周期
- onCreate:创建时调用,或者程序在暂停、停止状态下被杀死之后重新打开时也会调用
- onStart:onCreate之后或者从停止状态恢复时调用
- onResume:onStart之后或者从暂停状态恢复时调用,从停止状态恢复时由于调用onStart,也会调用onResume
- onPause:进入暂停、停止状态,或者销毁时会调用
- onStop:进入停止状态,或者销毁时会调用
- onDestroy:销毁时调用
- onRestart:从停止状态恢复时调用
- 启动模式
在AndroidManifest.xml中的<activity>标签中可以配置android:launchMode属性,用来控制Actvity的启动模式
- standard:每次调用startActivity()启动时都会创建一个新的Activity放在栈顶
- singleTop:如果启动的Activity时,指定Activity不在栈顶就创建,如在栈顶,则不再创建
- singleTask:如果启动的Activity不存在就创建,如果存在直接跳转到指定的Activity所在位置
- singleInstance:如果启动的Activity不存在就创建,如果存在就将指定的Activity移动到栈顶
2.BroadcastReceiver广播
- 定义广播接收者
- 定义类继承BroadcastReceiver,重写onReceive方法
- 清单文件中声明<receiver>,需要在其中配置<intent-filter>指定接收广播的动作
- 当接收到匹配广播之后就会执行onReceive方法
- BroadcastReceiver除了在清单文件中声明,也可以在代码中声明,使用registerReceiver方法注册Receiver
- 发送广播
1.无序广播2.有序广播
- 使用sendBroadcast方法发送
- 被所有广播接收者接收,无序,不可中断
- 广播时可设置接收者权限,仅当接收者含有权限才能接收
- 接收者的<receiver>也可设置发送方权限,只接收含有权限应用的广播
- 使用sendOrderedBroadcast方法发送
- 接收者可以在<intent-filter>中定义android:priority定义优先级,数字越大优先级越高
- 被各个广播接收者逐个接收,中途可以中断或者添加数据
abortBroadcast() getResultExtras(true).putString("data", "新增数据");
- 监听
监听短信接收![]()
监听电话呼出![]()
- 生命周期
- 广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁
- 广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框
- 最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉
- 耗时的较长的工作最好放在服务中完成
3.service服务
- 概念
- Service是一种在后台运行,没有界面的组件,由其他组件调用开始。
- 创建Service,定义类继承Service,AndroidManifest.xml中定义<service>
- 开启Service,在其他组件中调用startService方法
- 停止Service,调用stopService方法
- 进程的优先级
- Foreground process 前台进程 优先级最高 相当于activity执行了onResume 方法 用户正在交互
- Visible process 可视进程 一直影响用户看得见 相当于activity执行了onPause方法
- service process 服务进程 通过startService 方法开启了一个服务
- background process 后台进程 相当于activity 执行了onStop方法 界面不可见 但是activity并没有销毁
- Empty process 空进程 不会维持任何组件运行
- 绑定本地服务
- 使用bindService绑定服务,传入一个自定义的ServiceConnection用来接收IBinder
- 定义一个业务接口,其中定义需要的使用的方法
- 服务中自定义一个IBinder继承Binder并实现业务接口,在onBind方法中返回
- 调用端将IBinder转为接口类型,调用接口中的方法即可调用到服务中的方法
- 绑定远程服务
- 远程绑定服务时无法通过同一个接口来调用方法,这时就需要使用AIDL技术
- 将接口扩展名改为“.aidl”
- 去掉权限修饰符
- gen文件夹下会生成同名接口
- 将服务中自定义的IBinder类改为继承接口中的Stub
- ServiceConnection中返回的IBinder是代理对象,不能使用强转,改用Stub.asInterface()
- AIDL进程间数据传递
- AIDL默认只能使用Java中基本数据类型和String、List、Map,List和Map中的元素类型也只能是这些类型。
- 如果需要使用其他类型数据,使用的类必须实现Parcelable接口以完成序列化和反序列化工作 重写 public void writeToParcel(Parcel dest, int flags) 定义 public static final Parcelable.Creator<Person> CREATOR
- 定义该类对应的AIDL package 包名 parcelable 类名
- 在接口AIDL中导入该类,注意:即使是同一个包也需要导入
4.ContentProvider
内容提供者是应用程序之间共享数据的接口
- 使用
- 定义类继承ContentProvider,根据需要重写内部方法(增删改查)
- 在清单文件的<application>节点下进行配置,<provider>标签中需要指定name和authorities属性(authorities:是访问Provider时的路径,要唯一)
- URI代表要操作的数据,由scheme、authorites、path三部分组成
访问ContentProvider
- content://cn.itcast.sqlite.provider/person
- scheme:固定为content,代表访问内容提供者
- authorites:<provider>节点中的authorites属性
- path:程序定义的路径,可根据业务逻辑定义
外部程序只需知道内容提供者的Uri路径信息,通过内容解析器ContentResolver即可调用内容提供者
Uri的组成: