Android BroadcastReceiver
android 线程间通信的几种方法

android 线程间通信的几种方法
Android中线程是常见的,而线程间通信则是一种重要的技术。
本文将介绍几种Android线程间通信的方法。
1. Handler机制
Handler机制是Android系统提供的一种线程间通信的机制。
它是Android应用程序中最常用的线程间通信方式。
通过Handler机制,主线程可以向子线程发送消息或任务,而子线程也可以向主线程发送消息或任务。
2. BroadcastReceiver机制
BroadcastReceiver机制是一种用于跨进程通信的机制。
它可以让一个应用程序向另一个应用程序发送广播消息,而接收广播的应用程序可以根据广播消息的内容进行相应的处理。
3. Intent机制
Intent机制是Android系统中最常用的跨组件通信机制。
它可
以让一个组件向另一个组件发送消息或任务,而接收消息的组件可以根据消息的内容进行相应的处理。
4. AsyncTask机制
AsyncTask机制是Android系统提供的一种异步任务处理机制。
它可以在主线程中执行一些比较耗时的操作,而不会影响主线程的运行。
同时,AsyncTask机制还可以将执行的结果发送给主线程,方便主线程进行相应的处理。
总之,以上几种方法都是Android线程间通信中非常重要的技术,
对于Android应用程序的开发来说是必不可少的。
Android 应用程序的基本组件

Android 应用程序的基本组件Android 操作系统是目前世界上最流行的移动操作系统之一。
它提供了广泛的应用程序开发工具和框架,使开发者能够轻松地创建出丰富多样的应用程序。
而这些应用程序的基础是由一些基本组件构成的。
本文将介绍 Android 应用程序的基本组件,包括活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供器(Content Provider)。
活动(Activity)是 Android 应用程序的核心组件之一。
它代表了用户与应用程序之间的交互界面。
每个 Android 应用程序都至少包含一个活动,而活动可以包含多个界面元素,例如按钮、文本框、图像等。
活动通过布局文件定义了界面的外观和布局,通过代码来处理用户的操作和响应。
活动之间可以通过意图(Intent)来进行切换和通信,从而实现应用程序之间的流转和交互。
服务(Service)是在后台运行的组件,它可以在没有用户界面的情况下执行长时间运行的操作。
服务通常用于执行一些独立的任务,例如播放音乐、下载文件等。
通过在应用程序中创建服务,开发者可以在用户不可见的情况下执行一些必要的操作,并提供持久性的后台功能。
广播接收器(Broadcast Receiver)是一种用于接收系统广播消息的组件。
广播是 Android 系统中不同组件之间进行通信的一种方式,例如设备启动完成、电池电量变化等。
通过注册一个广播接收器,开发者可以监听和响应系统广播消息,并执行相应的操作。
广播接收器可以用于实现各种功能,例如接收短信、接收网络状态变化等。
内容提供器(Content Provider)是 Android 中用于共享数据的一种机制。
内容提供器允许一个应用程序将其数据暴露给其他应用程序。
通过内容提供器,不同的应用程序可以相互访问和共享数据,实现数据的交互和共用。
例如,系统提供的联系人数据库就是通过内容提供器来共享和访问联系人数据的。
BroadcastReceiver的用法

BroadcastReceiver(广播接收器)是Android中的四大组件之一。
下面是Android Doc中关于BroadcastReceiver的概述:①广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。
很多广播是源自于系统代码的──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。
应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。
②应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。
所有的接收器均继承自BroadcastReceiver基类。
③广播接收器没有用户界面。
然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。
通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。
一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
Android中的广播事件有两种,一种就是系统广播事件,比如:ACTION_BOOT_COMPLETED (系统启动完成后触发),ACTION_TIME_CHANGED(系统时间改变时触发),ACTION_BATTERY_LOW(电量低时触发)等等。
另外一种是我们自定义的广播事件。
广播事件的流程①注册广播事件:注册方式有两种,一种是静态注册,就是在AndroidManifest.xml文件中定义,注册的广播接收器必须要继承BroadcastReceiver;另一种是动态注册,是在程序中使用Context.registerReceiver注册,注册的广播接收器相当于一个匿名类。
两种方式都需要IntentFIlter。
②发送广播事件:通过Context.sendBroadcast来发送,由Intent来传递注册时用到的Action。
③接收广播事件:当发送的广播被接收器监听到后,会调用它的onReceive()方法,并将包含消息的Intent对象传给它。
registerreceiver 间隔

registerreceiver 间隔问题: 什么是registerreceiver间隔?引言:在Android开发中,registerReceiver间隔是指在注册BroadcastReceiver时可以为其指定一个间隔时间来限制其接收广播的频率。
这样可以有效控制广播接收的频率,避免不必要的资源消耗和性能问题。
本文将一步一步对registerReceiver间隔进行解析和讨论。
一、概念解释1.1 BroadcastReceiver在Android中,BroadcastReceiver是一种用于接收和处理广播消息的组件。
它可以监听系统广播、自定义广播,或者在应用内发送广播消息。
当一个广播事件发生时,注册了对应BroadcastReceiver的应用组件将会收到该广播并执行相应的逻辑。
1.2 registerReceiverregisterReceiver是一个用于动态注册BroadcastReceiver的方法。
通过调用此方法,应用可以在运行时注册一个BroadcastReceiver。
这可以使应用能够接收到在注册后发送的广播消息。
通常,我们需要在合适的时机调用registerReceiver方法,以确保应用能够正确接收广播消息。
二、问题分析2.1 为什么需要registerReceiver间隔?有些情况下,我们希望控制BroadcastReceiver接收广播的频率,避免频繁触发和处理广播消息。
如果没有限制,当有大量广播消息发送时,应用可能会因为频繁的广播接收和处理而导致性能下降或资源消耗过高。
因此,registerReceiver间隔就成为了一种限制频率的手段。
2.2 registerReceiver间隔的原理是什么?registerReceiver间隔的原理是通过设置一个时间间隔,以确保相同类型的广播消息只有在一定时间间隔内才能被正常接收。
当第一次接收到广播消息后,我们可以记录下这个时刻,并在接下来的一段时间内屏蔽重复的广播消息。
Android深入探究笔记之二十 -- 广播接收者

Android深入探究笔记之二十-- 广播接收者,BroadcastReceiver 收藏1. 概述广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”。
普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播。
然而有序广播是按照接收者声明的优先级别,被接收者依次接收广播。
如:A的级别高于B,B的级别高于C,那么,广播先传给A,再传给B,最后传给C 。
优先级别声明在intent-filter 元素的android:priority 属性中,数越大优先级别越高,取值范围:-1000到1000,优先级别也可以调用IntentFilter对象的setPriority()进行设置。
有序广播的接收者可以终止广播Intent的传播,广播Intent的传播一旦终止,后面的接收者就无法接收到广播。
另外,有序广播的接收者可以将数据传递给下一个接收者,如:A得到广播后,可以往它的结果对象中存入数据,当广播传给B时,B可以从A的结果对象中得到A存入的数据。
Context.sendBroadcast()发送的是普通广播,所有订阅者都有机会获得并进行处理。
Context.sendOrderedBroadcast()发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者,前面的接收者有权终止广播(BroadcastReceiver.abortBroadcast()),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。
对于有序广播,前面的接收者可以将数据通过setResultExtras(Bundle)方法存放进结果对象,然后传给下一个接收者,下一个接收者通过代码:Bundle bundle = getResultExtras(true))可以获取上一个接收者存入在结果对象中的数据。
broadcastreceiver startactivity -回复

broadcastreceiver startactivity -回复BroadcastReceiver和startActivity之间的关系和使用方法引言:在Android开发中,BroadcastReceiver(广播接收器)和startActivity (启动活动)是两个重要的组件。
BroadcastReceiver用于接收和处理来自系统或应用程序发送的广播消息,而startActivity用于启动新的Activity。
本文将逐步介绍BroadcastReceiver和startActivity之间的关系及其使用方法。
一、BroadcastReceiver的概述BroadcastReceiver是一个全局的组件,用于接收和处理来自系统或应用程序发送的广播消息。
它能够在后台运行,监听指定的广播事件,并根据接收到的广播消息执行相应的操作。
例如,当手机接收到短信时,系统会发送一个SMS_RECEIVED的广播消息,我们可以通过注册一个BroadcastReceiver来接收并处理该消息。
二、startActivity的概述startActivity用于启动一个新的Activity。
它可以用于从一个Activity跳转到另一个Activity,实现页面之间的切换和交互。
通过startActivity,我们可以传递额外的数据给新启动的Activity,从而在不同的Activity之间传递和共享数据。
三、BroadcastReceiver和startActivity的关系1. BroadcastReciever的触发条件首先,BroadcastReceiver可以在系统或应用程序发送广播消息时被触发。
可以通过注册一个BroadcastReceiver来监听指定的广播事件,只有当该事件发生时,BroadcastReceiver才能收到相应的广播消息并执行相应的操作。
2. BroadcastReceiver启动Activity在BroadcastReceiver的onReceive()方法中,我们可以使用startActivity 方法来启动一个新的Activity。
broadcastreceiver startactivity -回复

broadcastreceiver startactivity -回复「BroadcastReceiver.startActivity」:激活Activity的广播接收器引言:在移动应用开发中,我们经常会遇到需要在不同组件之间进行通信的情况。
广播接收器(BroadcastReceiver)是Android平台中一种很常用的组件,它可以接收来自系统或其他应用程序发出的广播消息,并根据其定义的逻辑做出相应的操作。
在这篇文章中,我们将重点讨论如何使用BroadcastReceiver来激活(startActivity)一个Activity。
一、什么是广播接收器(BroadcastReceiver)?广播接收器是Android平台的一种组件,用于接收并响应广播消息。
广播消息可以来自系统(如电池电量低等)或其他应用程序(如发送一个自定义广播)。
广播接收器可以在AndroidManifest.xml文件中声明,也可以使用动态注册的方式创建。
当接收到匹配的广播消息时,广播接收器会调用其onReceive()方法进行相应的操作。
二、为什么要使用广播接收器?广播接收器是实现应用程序间通信的一种重要方式。
通过发送和接收广播消息,应用程序可以在不同的组件之间传递数据或进行相应的操作。
例如,当手机的电池电量过低时,系统会发送一个电池低电量的广播消息,应用程序可以通过监听该广播消息来做出相应的处理,如关闭耗电较高的功能或提醒用户充电。
三、激活Activity的意义和使用场景。
在某些特定的场景下,我们可能需要在接收到广播消息时激活一个特定的Activity。
例如,当接收到来自其他应用程序的广播消息,通知用户有新消息,我们可以通过激活一个显示新消息的Activity来提醒用户并处理相关逻辑。
四、如何使用广播接收器激活Activity?下面将一步一步详细介绍如何使用广播接收器激活Activity:1. 创建一个自定义的广播接收器类我们首先需要创建一个继承自BroadcastReceiver的自定义类。
broadcastreceiver startactivity -回复

broadcastreceiver startactivity -回复在Android中,BroadcastReceiver和startActivity是两个常用的组件和方法,对于开发者来说,深入研究它们的用法和原理是至关重要的。
因此,本文将详细探讨BroadcastReceiver和startActivity的相关内容,通过一步一步的回答来帮助读者理解和应用这两个核心概念。
首先,我们来了解BroadcastReceiver是什么?简而言之,BroadcastReceiver是一种用于接收和处理广播信息的组件。
它可以监听和响应系统广播或自定义广播,以执行相关的操作。
比如,当手机接收到新短信时,可以注册一个BroadcastReceiver来监听系统发出的SMS_RECEIVED广播,并在其接收到广播时触发相应的逻辑。
接下来,我们来探讨如何使用BroadcastReceiver。
首先,需要创建一个继承自BroadcastReceiver的类,并重写其onReceive()方法。
这个方法会在广播事件被接收到时被自动调用。
在onReceive()方法中,我们可以编写逻辑来处理广播事件,比如显示一个通知、启动一个服务或者执行其他操作。
为了使BroadcastReceiver能够接收广播事件,还需要在AndroidManifest.xml文件中进行相应的声明和配置。
在<application>标签下添加一个<receiver>标签,并设置receiver的名称、过滤器和权限等属性。
通过设置过滤器,可以指定BroadcastReceiver要监听的广播类型,以及处理特定类型的广播事件。
除了监听系统广播,我们还可以发送自定义广播来触发BroadcastReceiver。
在应用程序的其他组件中,通过调用sendBroadcast()方法来发送自定义广播,并通过设置Intent的action属性来指定广播的类型。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BroadcastReceiver 用于异步接收广播Intent。
主要有两大类,用于接收广播的:∙正常广播 Normal broadcasts(用Context.sendBroadcast()发送)是完全异步的。
它们都运行在一个未定义的顺序,通常是在同一时间。
这样会更有效,但意味着receiver不能包含所要使用的结果或中止的API。
∙有序广播 Ordered broadcasts(用Context.sendOrderedBroadcast()发送)每次被发送到一个receiver。
所谓有序,就是每个receiver执行后可以传播到下一个receiver,也可以完全中止传播——不传播给其他receiver。
而receiver运行的顺序可以通过matched intent-filter 里面的android:priority来控制,当priority优先级相同的时候,Receiver以任意的顺序运行。
要注意的是,即使是Normal broadcasts,系统在某些情况下可能会恢复到一次传播给一个receiver。
特别是receiver可能需要创建一个进程,为了避免系统超载,只能一次运行一个receiver。
Broadcast Receiver 并没有提供可视化的界面来显示广播信息。
可以使用Notification和Notification Manager来实现可视化的信息的界面,显示广播信息的内容,图标及震动信息。
生命周期一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。
因此从这个特征可以看出,在所调用的onReceive(Context, Intent)函数里,不能有过于耗时的操作,不能使用线程来执行。
对于耗时的操作,请start service来完成。
因为当得到其他异步操作所返回的结果时,BroadcastReceiver 可能已经无效了。
发送广播事件的广播比较简单,构建Intent对象,可调用sendBroadcast(Intent)方法将广播发出。
另外还有sendOrderedBroadcast(),sendStickyBroadcast()等方法,请查阅API Doc。
1.new Intent with action nameIntent intent = new Intent(String action);或者只是new Intent, 然后intent.setAction(String action);2.set data等准备好了后,in activity,sendBroadcast(Intent); // 发送广播接收广播通过定义一个继承BroadcastReceiver类来实现,继承该类后覆盖其onReceiver方法,并在该方法中响应事件。
public class SMSReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {// get data from SMS intentBundle bundle = intent.getExtras();if(bundle != null){// get message by "pdus"Object[] objArray = (Object[]) bundle.get("pdus");// rebuild SMSSmsMessage[] messages = new SmsMessage[objArray.length];for(int i=0; i < objArray.length; i++){messages[i] = SmsMessage.createFromPdu((byte[])objArr ay[i]);StringBuilder str = new StringBuilder("from: ");str.append(messages[i].getDisplayOriginatingAddress()); str.append("\nmessage:\n");str.append(messages[i].getDisplayMessageBody());Toast.makeText(context, str.toString(), Toast.LENGTH_LO NG).show();}}}}注册Receiver注册有两种方式:1. 静态方式,在AndroidManifest.xml的application里面定义receiver并设置要接收的action。
<receiver android:name=".SMSReceiver"><intent-filter><action android:name="android.provider.Telephony.SMS_RECEIVED" /></intent-filter></receiver>2. 动态方式, 在activity里面调用函数来注册,和静态的内容差不多。
一个形参是receiver,另一个是IntentFilter,其中里面是要接收的action。
public class HelloDemo extends Activity {private BroadcastReceiver receiver;@Overrideprotected void onStart() {super.onStart();receiver = new CallReceiver();registerReceiver(receiver, new IntentFilter("android.intent.action.PHO NE_STATE"));}@Overrideprotected void onStop() {unregisterReceiver(receiver);super.onStop();}}一个receiver可以接收多个action的,即可以有多个intent-filter,需要在onReceive 里面对intent.getAction(action name)进行判断。
个人推荐使用静态注册方式,由系统来管理receiver,而且程序里的所有receiver,可以在xml里面一目了然。
而动态注册方式,隐藏在代码中,比较难发现。
而且动态注册,需要特别注意的是,在退出程序前要记得调用Context.unregisterReceiver()方法。
一般在activity的onStart()里面进行注册, onStop()里面进行注销。
官方提醒,如果在Activity.onResume()里面注册了,就必须在Activity.onPause()注销。
Permission权限要接收某些action,需要在AndroidManifest.xml里面添加相应的permission。
例如接收SMS:<uses-permission android:name="android.permission.RECEIVE_SMS"/>下面给出动态注册的接收来电的广播处理的CallReceiver的代码:一种方式是直接读取intent.getStringExtra("incoming_number")来获取来电号码:public class CallReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {TelephonyManager teleManager = (TelephonyManager) context.getSy stemService(Context.TELEPHONY_SERVICE);switch(teleManager.getCallState()){case TelephonyManager.CALL_STATE_RINGING: //响铃Toast.makeText(context, "Ringing: "+ intent.getStringExtra("in coming_number"), Toast.LENGTH_LONG).show();break;case TelephonyManager.CALL_STATE_OFFHOOK: //接听Toast.makeText(context, "OffHook: "+ intent.getStringExtra("i ncoming_number"), Toast.LENGTH_LONG).show();break;case TelephonyManager.CALL_STATE_IDLE: //挂断Toast.makeText(m_context, "Idle: "+ incomingNumber, Toast. LENGTH_LONG).show();break;}}}在运行时,发现除了响铃时可以获取来电号码,接听和挂断都不能成功获取的,显示为null。
另一种方式是通过PhoneStateListener的onCallStateChanged来监听状态的变化:public class CallReceiver extends BroadcastReceiver {private Context m_context;@Overridepublic void onReceive(Context context, Intent intent) {m_context = context;TelephonyManager teleManager = (TelephonyManager) context.getSy stemService(Context.TELEPHONY_SERVICE);teleManager.listen(new PhoneStateListener(){@Overridepublic void onCallStateChanged(int state, String incomingNumb er) {switch(state){case TelephonyManager.CALL_STATE_RINGING: //响铃Toast.makeText(m_context, "Ringing: "+ incomingN umber, Toast.LENGTH_LONG).show();break;case TelephonyManager.CALL_STATE_OFFHOOK: //接听Toast.makeText(m_context, "OffHook: "+ incoming Number, Toast.LENGTH_LONG).show();break;case TelephonyManager.CALL_STATE_IDLE: //挂断Toast.makeText(m_context, "Idle: "+ incomingNum ber, Toast.LENGTH_LONG).show();break;}}}, PhoneStateListener.LISTEN_CALL_STATE);}}运行时也发现incomingNumber在接听和挂断时获取为blank。