Anroid broadcastReceive

本文详细介绍了Android中的广播机制,包括如何发送广播、使用BroadcastReceiver过滤接收广播的过程。讲解了静态和动态注册BroadcastReceiver的方法,以及如何指定权限来限制广播的接收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在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);

 

    }

 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值