广播的使用

广播接收器:

广播接收器(BroadCastReceiver)是Android系统的四大组件之一,他可以用来监听系统发送的各种广播(例:监听电池电量),也可以用来监听我们自己发送的广播,他的生命周期是从调用广播接收器对象,到onreceive方法执行结束,10s内就完成了。广播接收器中的onreceive方法是在主线程中执行的,执行时间不能超过10s,否则会造成ANR广播根据注册方式的不同分为常驻型广播//静态广播和动态广播,而根据功能接收方式顺序的不同划分为普通广播、系统广播、有序广播、粘性广播,下面来详细的介绍下

1.      普通广播:是异步执行的,发送后可以被所有监听该广播的接收器接收到,缺点是没有传递性,不能将处理结果传递给下一个广播接收器,无法终止广播的传播

广播接收器的定义

定义一个类继承BroadcastReceiver,重写onreceiver方法就可以了

广播接收器的注册

常驻型的广播注册是在清单文件中注册的,该广播接收器会一直处于监听状态,当你的应用程序退出后仍会继续监听,这样的广播虽说使用上非常方便但他特别耗费手机电量

<receiverandroid:name=”.MyReceiver”>

<intent-filter>

<actionandroid:name=”自己规定的动作”/>

<intent-filter>

<receiver>

动态广播注册是在Activity中注册的,他的监听随着Activity的关闭而结束,对于动态广播oncreate时注册,在ondestroy时销毁

ReceiveBroadCast receiver=new ReceiveBroadCast();

IntentFilterfilter=new IntentFilter(MyConst.action_patientListFragment);//意图过滤器其中包含过滤的动作

registerReceiver(receiver,filter);

 

销毁:unregisterReceiver(receiver);

 

普通广播的发送

广播接收器注册后会后有对应的IntentFilter过滤规定的动作,我们定义好一个该动作的Intent然后调用Context.sendBroadcast();方法就发送出去了一个广播

Intent intent =new Intent(MyConst.action_patientListFragment);//规定动作的Intent

sendBroadcast(intent);

2.      有序广播:接收者规定优先级,优先级越高,越先接收到广播,然后广播才会继续传播,优先级的声明是在IntentFilter中设置priority的值,其值的范围是-1000-1000,数越大越早接收到广播,先接收到广播的可以对广播传入的数据进行修改,也可以停止广播的继续传播,这样其他接受者就接收不到广播。

 

广播接收器的定义同上

 

有序广播的注册同普通广播相同,只是在注册广播时若是注册静态广播则在

<intent-filter android:priority="1000"></intent-filter>,动态广播则调用IntentFilter的setPriority()设置

 

有序广播的发送

同普通广播相同 只是发送广播的方法是sendOrderedBroadcast();

 

有序广播优先接收到的广播传递给下一个接收者时可以通过BroadcastReceiverl类的setResultExtras(Bundle)处理(处理的是Bundled对象),而下一个接收者可以通过BroadcastReceiver的Bundle bundle=getResultExtras(true);方法获取到上一个接收者传递的数据

 

有序广播的终止可以通过BroadcastReceiver的abortBroadcast()方法终止广播,终止后后面的广播接收器则不能再接收广播了

 

 

广播发送时可以传递数据给接收者:可以将数据通过Intent传递给接收者,然后通过onreceiveIntent参数获取传递过来的数据

 

广播接收器中的方法必须在10s内执行完,否则就会造成ANR(Application No ResPonse)弹出应用程序无响应,请关闭应用程序的对话框,若必须在应用程序中执行耗时操作则启动一个Service,不要在onreceive中重新启动线程,因为广播的生命周期十分短暂,可能线程还没有执行完成,广播就已经退出了,此时进程虽然还在运行,但因该进程不包含任何活动组件,系统可能在内存紧张时优先结束该进程,导致BroadcastReceiver启动的子线程不能执行完成

 

 

 

程序一直弹出应用程序无响应,请关闭程序的对话框的原因是我们的应用程序中有在UI线程中执行耗时操作即执行的某个方法在10s内无法完成,这就是ANR(Appliation No ResPonse)

Android 广播可以用于应用程序内部的组件之间通信,也可以用于不同应用程序之间的通信。应用程序可以发送广播,也可以注册广播接收器来接收广播并做出相应的处理。 使用广播的基本步骤如下: 1. 定义广播接收器 广播接收器是一个继承自 BroadcastReceiver 的类,用于接收和处理特定的广播。在广播接收器实现 onReceive() 方法来处理接收到的广播。例如: ```java public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 处理接收到的广播 } } ``` 2. 注册广播接收器 在应用程序的代码中,可以使用代码动态注册广播接收器,也可以在 AndroidManifest.xml 文件中静态注册广播接收器。例如: ```java // 动态注册广播接收器 MyBroadcastReceiver receiver = new MyBroadcastReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("com.example.MY_ACTION"); registerReceiver(receiver, filter); ``` ```xml <!-- 静态注册广播接收器 --> <receiver android:name=".MyBroadcastReceiver"> <intent-filter> <action android:name="com.example.MY_ACTION" /> </intent-filter> </receiver> ``` 3. 发送广播 在应用程序中发送广播可以使用 Intent 对象,通过设置 Action 和其他相关参数来指定广播的内容。例如: ```java Intent intent = new Intent(); intent.setAction("com.example.MY_ACTION"); intent.putExtra("data", "Hello, broadcast!"); sendBroadcast(intent); ``` 4. 处理广播 广播接收器会在接收到广播时调用 onReceive() 方法,可以在该方法中处理广播内容。例如: ```java public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if ("com.example.MY_ACTION".equals(intent.getAction())) { String data = intent.getStringExtra("data"); // 处理接收到的广播 } } } ``` 需要注意的是,广播接收器的 onReceive() 方法在主线程中执行,因此不能在该方法中执行耗时操作,否则会导致程序无响应。如果需要执行耗时操作,可以考虑使用 IntentService 或 AsyncTask 等异步操作方式来执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值