在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。下面将详细的阐述如何发送Broadcast和使用BroadcastReceiver过
滤接收的过程:
首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。
当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若 匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要 实现onReceive()方法。
注册BroadcastReceiver有两种方式:
一种方式是,静态的在AndroidManifest.xml中用<receiver>标签生命注册,并在标签内用<intent- filter>标签设置过滤器。
另一种方式是,动态的在代码中先定义并设置好一个 IntentFilter对象,然后在需要注册的地方调 Context.registerReceiver()方法,如果取消时就调用Context.unregisterReceiver()方法。如果用动 态方式注册的BroadcastReceiver的Context对象被销毁时,BroadcastReceiver也就自动取消注册了。
另外,若在使用sendBroadcast()的方法是指定了接收权限,则只有在AndroidManifest.xml中用<uses- permission>标签声明了拥有此权限的BroascastReceiver才会有可能接收到发送来的Broadcast。
同样,若在注册BroadcastReceiver时指定了可接收的Broadcast的权限,则只有在包内的AndroidManifest.xml中 用<uses-permission>标签声明了,拥有此权限的Context对象所发送的Broadcast才能被这个 BroadcastReceiver所接收。
动态注册:
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(String);--为 BroadcastReceiver指定action,使之用于接收同action的广播 registerReceiver(BroadcastReceiver,intentFilter);
一般:在onStart中注册,onStop中取消unregisterReceiver
发送广播消息:extends Service
指定广播目标Action:Intent Intent = new Intent(action-String)
--指定了此action的receiver会接收此广播
需传递参数(可选) putExtra();
发送:sendBroadcast(Intent); |
在BroadcastReceiver配置里intent-filter:action //用于标示接收什么样的action
在Activity要广播的地方设置Intent.setAction();sendBroadcast(in);
也可以在其中动态注册BroadcastReceiver
BroadcastReceiver生命周期:
只是在其onReceiver方法执行的时候才是active;inactive状态下其随时会被系统回收
在onReceiver里执行很耗时的工作时应该开启一个独立的线程。但是一旦onReceiver返回后(不管新线程有没有执行完),
系统都会认为这些资源处于inactive。
也不能bindService。道理同线程
解决方案是在onReceiver里startService,让service完成工作
在BroadcastReceiver配置里intent-filter:action //用于标示接收什么样的action
在Activity要广播的地方设置Intent.setAction();sendBroadcast(in);
也可以在其中动态注册BroadcastReceiver
BroadcastReceiver生命周期:
只是在其onReceiver方法执行的时候才是active;inactive状态下其随时会被系统回收
在onReceiver里执行很耗时的工作时应该开启一个独立的线程。但是一旦onReceiver返回后(不管新线程有没有执行完),
系统都会认为这些资源处于inactive。
也不能bindService。道理同线程
解决方案是在onReceiver里startService,让service完成工作
1.创建Broadcast,首先要有部件发送Broadcast,发送Broadcast的代码如下
Intent intent1 = new Intent(AC1);//AC1为reciver的动作名称。
sendBroadcast(intent1);
此处的AC1要定义:
static final String AC1 = "com.test.action.NEW_BC1";//
2.定义Broadcast的动作:
注意:定义中的"com.test.action.NEW_BC1"是要在Menifest.xml文件中定义的,如下所示:
<receiver android:name="TestRC">
<intent-filter>
<action
android:name="com.test.action.NEW_BC1"/>
</intent-filter>
</receiver>
3.定义BroadcastReciver对象
其中android:name="TestRC"的意思是:该BroadcastReciver对象的名字是TestRC,这个对象接受动作为com.test.action.NEW_BC1 的Broadcast,其定义如下:
public class TestRC extends BroadcastReceiver {
public static int NOTIFICATION_ID = 21321;
Context context;
@Override
public void onReceive(Context context, Intent intent) {
this.context = context;
Toast.makeText(context, "widget已启动", 0);
showNotification();
}
private void showNotification(){
NotificationManager notificationManager = (NotificationManager) context.getSystemService(android.content.Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.icon, "bc1", System.currentTimeMillis());
PendingIntent contentItent = PendingIntent.getActivity(context, 0, new Intent(context, Main.class), 0); //Main.class为Broadcast的发出对象
notification.setLatestEventInfo(context, "在bc1中", null, contentItent);
notificationManager.notify(NOTIFICATION_ID, notification);
}
}
相关推荐
Android锁屏无法继续定位问题 产生问题的原因: 手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会将手机进入休眠状态。此时的服务以及线程等都会停止。 最近就这个问题,阅读了很多代码以及官方文档...
在Android应用开发中,`Service`和`BroadcastReceiver`是两个关键组件,它们在实现后台运行任务和系统事件监听方面发挥着重要作用。本项目聚焦于使用`Service`和`BroadcastReceiver`来控制一个音乐播放器,这涉及到...
**Android Studio 自定义广播详解** 在 Android 应用开发中,广播接收器(BroadcastReceiver)是一种重要的组件,它允许应用程序监听并响应系统或应用广播事件。Android Studio 是 Google 推出的官方集成开发环境...
Android项目和Unity项目
【Android Studio—拦截保存的电话】是一个关于在Android平台上使用Android Studio进行移动开发的实践教程,特别是涉及到如何通过BroadcastReceiver来拦截并处理电话保存事件。这个压缩包包含了多个与项目相关的文件...
在Android开发中,广播(BroadcastReceiver)是一种非常重要的组件,用于接收系统或应用程序发送的广播意图(Intent)。在本讲“mooc_android_lesson17_广播实现手机电量查询”中,我们将学习如何利用...
在Android开发中,BroadcastReceiver(广播接收器)是四大组件之一,它负责监听系统或应用程序的特定事件,并在接收到广播时执行相应的操作。BroadcastReceiver的注册方式主要有两种:静态注册和动态注册。 1. 静态...
这是自己写的一个demo,利用应用A给应用B发送消息,主要用了BroadcastReceive,service,AIDL. 思想: 应用A发送通知给应用B;B接受到通知后,给自己发个推送的消息,点击进入所设定的消息页面后,用AIDL从A获取具体的...
Android 接收开机广播,自动运行本app,开机广播 运行本程序 android root 定制设备使用
主要为大家详细介绍了Android BroadcastReceiver实现网络状态实时监听,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
在Android应用开发中,"仿制QQ下线功能.zip"是一个示例项目,它演示了如何实现一个类似于QQ应用的强制下线功能。这个功能的关键在于利用Android系统的BroadcastReceiver组件来监听特定的事件,比如用户点击了“强制...
BroadcastReceiver在Android系统中扮演着一个至关重要的角色,它是Android四大组件之一,用于接收系统或应用广播事件。BroadcastReceiver使得应用程序可以在不运行的状态下接收并响应来自系统的各种广播消息,如系统...
android BroadcastReceiver ,文档可以详细查看教程 https://blog.csdn.net/u013519290/article/details/122401102https://blog.csdn.net/u013519290/article/details/122401102
文件"Getting-Current-Playing-Song-with-BroadcastReceive.pdf"可能包含了详细的步骤和示例代码,而"下载链接.txt"则可能是指向更详细教程或相关资源的链接。通过阅读这些资料,你可以深入理解如何在Android应用中...
使用人群:BroadcastReceiver初学者。 里面涉及BroadcastReceiver的静态注册(无序广播)、动态注册(无序广播)、有序广播。 项目对应:https://shuaici.blog.csdn.net/article/details/118337894
<receiver android:name=".ForcedLogoutReceiver"> <action android:name="com.example.FORCED_LOGOUT" /> ``` 当然,为了让BroadcastReceiver能够接收到自定义的广播事件,还需要在合适的地方发送广播。例如...
Android四大组件之一BroadcastReceiver实战demo,实现广播注册、发送、注销等功能,并给出实际开发过程中3种常见场景解决方案,1.如何监听网络变化?2.如何监听手机电量变化?3.如何监听app安装变化? 是学习...