组件通信: 消息机制和广播 杨刚 中国人民大学
杨刚 中国人民大学 组件通信: 消息机制和广播
本章学习目标 ■掌握广播机制的原理和使用方法 ■掌握消息机制的原理和使用方法,包括 Message、Handler、Looper类的使用 ·掌握通过消息机制动态获取信息; ■掌握异步处理工具类:AsyncTask的使用
本章学习目标 n 掌握广播机制的原理和使用方法 n 掌握消息机制的原理和使用方法,包括 Message、Handler、Looper类的使用 n 掌握通过消息机制动态获取信息; n 掌握异步处理工具类:AsyncTask的使用
广播机制 口利用Intent发送广播消息 ■Broadcast是一种广泛运用在应用程序之间异步传输信息的机制。 Android系统通过发出广播消息,来通知各应用组件一些系统事件, ■应用程序和Android:系统都可以使用Intent发送广播消息 ■广播消息的内容可以与应用程序密切相关的自定义数据信息,也可以 Android的系统信息 口网络连接变化 ▣电池电量变化 口接收到短信 口系统设置变化 ■BroadcastReceiver用于接收并处理广播消息。不管是系统消息还是自 定义消息,都可以通过BroadcastReceiver来进行处理。形象的比喻, Intent是一种一对一的通信,广播消息是一种一对多的通信
广播机制 q 利用Intent发送广播消息 n Broadcast是一种广泛运用在应用程序之间异步传输信息的机制。 Android系统通过发出广播消息,来通知各应用组件一些系统事件, n 应用程序和Android系统都可以使用Intent发送广播消息 n 广播消息的内容可以与应用程序密切相关的自定义数据信息,也可以 Android的系统信息 q 网络连接变化 q 电池电量变化 q 接收到短信 q 系统设置变化 n BroadcastReceiver用于接收并处理广播消息。不管是系统消息还是自 定义消息,都可以通过BroadcastReceiver来进行处理。形象的比喻, Intent是一种一对一的通信,广播消息是一种一对多的通信
广播消息 使用Intent发送广播消息非常简单 口只需创建一个Intent 口并调用sendBroadcast(()函数把Intent携带的信息广播出去 1.String UNIQUE_STRING 'com.example.BroadcastReceiverDemo"; 2.Intentintent new Intent(UNIQUE_STRING); 3.intent.putExtra("key1","value1"); 4.intent.putExtra("key2","value2"); 5.sendBroadcast(intent); 口在构造Intent时必须定义一个全局唯一的字符串,用来标识 其要执行的动作,通常使用应用程序包的名称 要在Intent传递额外数据,可以用Intent的outExtra(O方法
广播消息 n 使用Intent发送广播消息非常简单 q 只需创建一个Intent q 并调用sendBroadcast()函数把Intent携带的信息广播出去 q 在构造Intent时必须定义一个全局唯一的字符串,用来标识 其要执行的动作,通常使用应用程序包的名称 q 要在Intent传递额外数据,可以用Intent的putExtra()方法 1. String UNIQUE_STRING = “com.example.BroadcastReceiverDemo"; 2. Intent intent = new Intent(UNIQUE_STRING); 3. intent.putExtra("key1", "value1"); 4. intent.putExtra("key2", "value2"); 5. sendBroadcast(intent);
·播消息 ·接收消息 (1)在AndroidManifest.xml文件中注册BroadcastReceiver 1. 2. 3. 5. (2)创建BroadcastReceiveri需继承BroadcastReceiver类,并 重载onReceive()方法。示例代码如下: 1.public class MyBroadcastReceiver extends BroadcastReceiver 2 @Override 3. public void onReceive(Context context,Intent intent) //TODO:React to the Intent received. 4
广播消息 n 接收消息 (1)在AndroidManifest.xml文件中注册BroadcastReceiver (2)创建BroadcastReceiver需继承BroadcastReceiver类,并 重载onReceive()方法。示例代码如下: 1. public class MyBroadcastReceiver extends BroadcastReceiver { 2. @Override 3. public void onReceive(Context context, Intent intent) { //TODO: React to the Intent received. 4. } } 1. 2. 3. 4. 5
广播机制 ▣广播消息的过程 ■消息发送 口无序广播sendBroadcast 口有序广播sendOrderBroadcast 口持续广播sendStickyBroadcast ,广播消息的实质就是一个Intent>对象。使用sendBroadcast ()或sendStickyBroadcast(O方法发出去的Intent,.所有满足 条件的BroadcastReceiver都会随机地执行其onReceive()方 法;而sendOrderBroadcast(O发出去的Intent,会根据 BroadcastReceiver注册时Intent Filter设置的优先级的顺序 来执行,相同优先级的BroadcastReceiver!则是随机执行。 sendStickyBroadcast()方法主要的不同的是,Intent在发送 后一直存在,并且在以后调用registerReceiver注册相匹配 的BroadcastReceiverl时会把这个Intent]直接返回
广播机制 q 广播消息的过程 n 消息发送 q 无序广播sendBroadcast q 有序广播sendOrderBroadcast q 持续广播sendStickyBroadcast § 广播消息的实质就是一个Intent对象。使用sendBroadcast ()或sendStickyBroadcast ()方法发出去的Intent,所有满足 条件的BroadcastReceiver都会随机地执行其onReceive()方 法;而sendOrderBroadcast ()发出去的Intent,会根据 BroadcastReceiver注册时Intent Filter 设置的优先级的顺序 来执行,相同优先级的BroadcastReceiver则是随机执行。 sendStickyBroadcast()方法主要的不同的是,Intent在发送 后一直存在,并且在以后调用registerReceiver注册相匹配 的BroadcastReceiver时会把这个Intent直接返回
广播机制 BroadcastReceiver的生命周期 BroadcastReceiveri的onReceive()方法执行完成后, BroadcastReceiver的实例就会被销毁。如果 onReceive()方法在1Os内没有执行完毕,Android会认 为改程序无响应。所以在BroadcastReceiver.里不能做 一些比较耗时的操作,否则会弹出“Application NoResponse”对话框。特别说明的是,这里不能使用子 线程来解决,因为BroadcastReceiveri的生命周期很短 ,子线程可能还没有结束BroadcastReceiver就先结束 了。BroadcastReceiver-一旦结束,此时它所在的进程 很容易在系统需要内存时被优先杀死,因为它属于空进 程
广播机制 n BroadcastReceiver的生命周期 q BroadcastReceiver的onReceive()方法执行完成后, BroadcastReceiver的实例就会被销毁。如果 onReceive()方法在10s内没有执行完毕,Android会认 为改程序无响应。所以在BroadcastReceiver里不能做 一些比较耗时的操作,否则会弹出“Application NoResponse”对话框。特别说明的是,这里不能使用子 线程来解决,因为BroadcastReceiver的生命周期很短 ,子线程可能还没有结束BroadcastReceiver就先结束 了。BroadcastReceiver一旦结束,此时它所在的进程 很容易在系统需要内存时被优先杀死,因为它属于空进 程
广播机制 sendBroadcast和sendStickyBroadcastl的☒区别 sendBroadcast中发出的intent在ReceiverActivity不 处于onResume:状态是无法接受到的,即使后面再 次使其处于该状态也无法接受到。 而sendStickyBroadcast发出的Intent当 ReceverActivity重新处于onResume状态之后就能 重新接受到其Intent.这就是the Intent will be held to bere-broadcast to future receivers这句话的表现。 就是说sendStickyBroadcast?发出的最后一个Intent 会被保留,下次当Recevier处于活跃的时候,又会 接受到它
广播机制 n sendBroadcast和sendStickyBroadcast的区别 q sendBroadcast中发出的intent在ReceiverActivity不 处于onResume状态是无法接受到的,即使后面再 次使其处于该状态也无法接受到。 而sendStickyBroadcast发出的Intent当 ReceverActivity重新处于onResume状态之后就能 重新接受到其Intent.这就是the Intent will be held to be re-broadcast to future receivers这句话的表现。 就是说sendStickyBroadcast发出的最后一个Intent 会被保留,下次当Recevier处于活跃的时候,又会 接受到它
消息机制 ·基本介绍 口采用消息机制的目的是完成主线程与子线程之间的 消息传递 口当一个程序第一次后动的时候,Android会后动一 个LINUX进程和一个主线程(Main Thread)。默 认的情况下,所有该程序的组件都将在该进程和线 程中运行
消息机制 n 基本介绍 q 采用消息机制的目的是完成主线程与子线程之间的 消息传递 q 当一个程序第一次启动的时候,Android会启动一 个LINUX进程和一个主线程(Main Thread)。默 认的情况下,所有该程序的组件都将在该进程和线 程中运行
消息机制 ■基本介绍 口主线程主要负责处理与U川相关的事件,如:用户的 按键事件,用户接触屏幕的事件以及屏幕绘图事件, 并把相关的事件分发到对应的组件进行处理。所以 主线程通常又被叫做U线程。 口在开发Android应用时必须遵守单线程模型的原则: Android Ul操作并不是线程安全的,并且这些操作 必须在U线程中执行。 ■1.不要阻塞U川线程 2.确保只在U线程中访问Android Ul toolkit,.禁止子线程 更新主线程的U川组件
消息机制 n 基本介绍 q 主线程主要负责处理与UI相关的事件,如:用户的 按键事件,用户接触屏幕的事件以及屏幕绘图事件, 并把相关的事件分发到对应的组件进行处理。所以 主线程通常又被叫做UI线程。 q 在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的,并且这些操作 必须在UI线程中执行。 n 1. 不要阻塞UI线程 n 2. 确保只在UI线程中访问Android UI toolkit,禁止子线程 更新主线程的UI组件