Android四大组件之一:BroadcastReceiver

本文介绍了Android中的BroadcastReceiver组件,包括其用途、实现方法及两种注册方式。通过实例演示了如何监听短信接收事件,并展示了动态注册过程。

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

 一.BroadcastReceiver简介 

   BraodcastReceiver(广播接收器)是为了实现系统广播而提供的一种组件,它和事件处理机制类似,但是事件处理机制是程序组件级别的,而广播事件处理机制是系统级别的。比如,我们可以发出一种广播来测试手机电量的变化,这时候就可以定义一个BraodcastReceiver来接受广播,当手机电量较低时提示用户。我们既可以用Intent来启动一个组件,也可以用sendBroadcast()方法发起一个系统级别的事件广播来传递消息。我们同样可以在自己的应用程序中实现BroadcastReceiver来监听和响应广播的Intent。

   在程序中使用BraodcastReceiver是比较简单的。首先要定义一个类继承BraodcastReceiver,并且覆盖onReceiver()方法来响应事件。然后注册在程序中BraodcastReceiver。最后构建Intent对象调用sendBroadcast()方法将广播发出。

二.BroadcastReceiver的注册方式

 1.静态注册方式

   静态注册方式是在AndroidManifest.xml的application里面定义receiver并设置要接收的action。静态注册方式的特点:不管改应用程序是否处于活动状态,都会进行监听,比如某个程序时监听 内存 的使用情况的,当在手机上安装好后,不管改应用程序是处于什么状态,都会执行改监听方法中的内容。

如下代码为注册接收短信的通知:

首先:manifest文件中进行注册(注意必须添加Action,优先级可以不用设置)

 <receiver android:name="com.example.sms.receiver.SmsReceiver" >
            <intent-filter android:priority="1000" >
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                <action android:name="android.provider.Telephony.SMS_DELIVER" />
                <action android:name="android.intent.action.SENDTO" />
                <action android:name="android.intent.action.SEND" />
                <action android:name="com.android.mms.transaction.MESSAGE_SENT" />
            </intent-filter>
        </receiver>


核心代码:实时的监听到接收短信的号码

public class SmsReceiver extends BroadcastReceiver {
    private static final String tag = "SmsReceiver";
    
    @Override
    public void onReceive(Context arg0, Intent intent) {
        Log.e(tag, "action===="+intent.getAction());
        if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){
            Bundle bundle = intent.getExtras();
            Object messages[] = (Object[]) bundle.get("pdus");
            if (messages != null) {
                SmsMessage smsMessage[] = new SmsMessage[messages.length];
                for (int i = 0; i < smsMessage.length; i++) {
                    smsMessage[i] = SmsMessage.createFromPdu((byte[]) messages[i]);
                    Log.e(tag, smsMessage[i].getOriginatingAddress());
                }
                
                String number = smsMessage[0].getOriginatingAddress();// 号码
                
                Log.e(tag, "number--->"+number);
            }
        }
    }

}


 2.动态注册方式

   动态注册方式在activity里面调用函数来注册,和静态的内容差不多。一个形参是receiver,另一个是IntentFilter,其中里面是要接收的action。动态注册方式特点:在代码中进行注册后,当应用程序关闭后,就不再进行监听。

下面是具体的例子:

 MainActivity.java


package com.android.broadcast;  
     
    import android.app.Activity;  
    import android.content.Intent;  
    import android.content.IntentFilter;  
    import android.os.Bundle;  
    import android.view.View;  
    import android.view.View.OnClickListener;  
    import android.widget.Button;  
     
    public class MainActivity extends Activity{  
        //定义Action常量  
        protected static final String ACTION = "com.android.broadcast.RECEIVER_ACTION";  
        private Button btnBroadcast;  
        private Button registerReceiver;  
        private Button unregisterReceiver;  
        private MyReceiver receiver;  
        @Override
        public void onCreate(Bundle savedInstanceState){  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
            btnBroadcast=(Button)findViewById(R.id.btnBroadcast);  
            //创建事件监听器  
            btnBroadcast.setOnClickListener(new OnClickListener(){  
                @Override
                public void onClick(View v){  
                    Intent intent=new Intent();  
                    intent.setAction(ACTION);  
                    sendBroadcast(intent);  
                }  
            });  
              
            registerReceiver=(Button)findViewById(R.id.btnregisterReceiver);  
            //创建事件监听器  
            registerReceiver.setOnClickListener(new OnClickListener(){  
                @Override
                public void onClick(View v){  
                    receiver=new MyReceiver();  
                    IntentFilter filter=new IntentFilter();  
                    filter.addAction(ACTION);  
                    //动态注册BroadcastReceiver  
                    registerReceiver(receiver, filter);  
                }  
            });  
              
            unregisterReceiver=(Button)findViewById(R.id.btnunregisterReceiver);  
            //创建事件监听器  
            unregisterReceiver.setOnClickListener(new OnClickListener(){  
                @Override
                public void onClick(View v){  
                    //注销BroadcastReceiver  
                    unregisterReceiver(receiver);  
                }  
            });  
        }  
    }

 在“com.android.broadcast”包中定义一个MyReceiver类,继承于BroadcastReceiver,覆盖onReceive()方法。

MyReceiver.java

  package com.android.broadcast;  
     
    import android.content.BroadcastReceiver;  
    import android.content.Context;  
    import android.content.Intent;  
    import android.util.Log;  
     
    public class MyReceiver extends BroadcastReceiver{  
        //定义日志标签  
        private static final String TAG = "Test";  
        @Override
        public void onReceive(Context context, Intent intent){  
            //输出日志信息  
            Log.i(TAG, "MyReceiver onReceive--->");  
        }  
    } 


main.xml

  1. <?xml version="1.0" encoding="utf-8"?>     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"         android:orientation="vertical"         android:layout_width="fill_parent"         android:layout_height="fill_parent"         >         <Button             android:id="@+id/btnBroadcast"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:text="发送广播"             />         <Button             android:id="@+id/btnregisterReceiver"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:text="注册广播接收器"             />         <Button             android:id="@+id/btnunregisterReceiver"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:text="注销广播接听器"             />     </LinearLayout>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值