BroadcastReceiver总结

本文详细介绍了Android中的BroadcastReceiver组件,包括其注册方式、工作原理及如何实现广播的发送与接收。探讨了静态与动态注册的区别,并提供了完整的示例代码。

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

作为Android四大组件之一,BroadcastReceiver主要是用来接收处理广播消息,处理消息要overWrite它的onReceive()方法,在其中做处理。Broadcast工作在主线程中,所以我们可以直接操作主界面的内容。使用BroadcastReceiver首先要注册广播接收器。

1.注册广播接收器

           有两种方式可以注册广播接收器,一种是在代码中动态注册,一种是在manifest清单文件中静态注册,这两种是有差别的,清单文件一旦注册即使Activity销毁掉仍可以接收到广播,动态注册则是Activity销毁后就不能接收到广播消息(思考,如何取消注册manifest中生命的静态注册)。

           静态注册方式是在manifest清单文件中的application子标签下注册如下代码:

<span style="white-space:pre">	</span><receiver android:name="com.test.testbroadcast.MyReceiver" >
            <intent-filter>
                <action android:name="com.test.action.MY_ACTION" />
                <category android:name="android.intent.category.DEFAULT" /> 
            </intent-filter>
        </receiver>
      其中android:name声明的自己写的BroadcastReceiver的子类的全路径名,intent-filter子标签下声明 要过滤的意图,action的android:name属性是发送广播时候的意图String,可以是自己定义的,也可以是系统的通知消息。category子标签声明的是意图的种类。
     动态注册是在activity中利用代码进行注册,registerReceiver()需要设置意图的<span style="font-family: Arial, Helvetica, sans-serif;">IntentFilter</span>对象和要注册的自定义的BroadcastReceiver对象作为参数。具体代码如下:
<span style="white-space: pre;">			</span>receiver = new MyReceiver(btn_register);//此构造方法是为了演示通过发送广播,接收器接收到后更新主界面中的button的text
<pre name="code" class="java">			IntentFilter filter = new IntentFilter();
			filter.addAction(action);
			registerReceiver(receiver, filter);
					
2.复写BroadcastReceiver类

<span style="white-space:pre">	</span>主要是复写其中的onReceive()方法,
<pre name="code" class="java"><span style="white-space:pre">	</span>public void onReceive(Context context, Intent intent) {
		String string = intent.getStringExtra("msg");
		Toast.makeText(context, string, Toast.LENGTH_SHORT).show();
	}
3.发送广播消息
<span style="white-space:pre">				</span>Intent intent = new Intent();
<span style="white-space:pre">				</span>intent.setAction(action);
<span style="white-space:pre">				</span>intent.putExtra("msg", "哈哈哈,broadcast!");
<span style="white-space:pre">				</span>sendBroadcast(intent);
完整代码如下

主MainActivity.java
<pre name="code" class="java">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 {

	protected static final String action = "com.test.action.MY_ACTION";
	private Button btn_send;
	private Button btn_register;
	private Button btn_unregister;
	private MyReceiver receiver;
	private boolean isRreceivered = false;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		btn_send = (Button) findViewById(R.id.btn_send);
		btn_register = (Button) findViewById(R.id.btn_register);
		btn_unregister = (Button) findViewById(R.id.btn_unregister);

		btn_unregister.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				if (isRreceivered) {
					unregisterReceiver(receiver);
					isRreceivered = false;
					btn_register.setText("注册广播");
				}
			}
		});
		btn_register.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				if (!isRreceivered) {
					receiver = new MyReceiver(btn_register);
					IntentFilter filter = new IntentFilter();
					filter.addAction(action);
					registerReceiver(receiver, filter);
					isRreceivered = true;
				}

			}
		});
		btn_send.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent intent = new Intent();
				intent.setAction(action);
				intent.putExtra("msg", "哈哈哈,broadcast!");
				sendBroadcast(intent);
			}
		});

	}

}

MyReceiver.java文件:

<pre name="code" class="java">import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Button;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver {

	private Button btn;

	public MyReceiver(Button btn) {
		this.btn = btn;
	}

	public MyReceiver() {
	}

	@Override
	public void onReceive(Context context, Intent intent) {
		String string = intent.getStringExtra("msg");
		Toast.makeText(context, string, Toast.LENGTH_SHORT).show();
		btn.setText("已注册!");
	}

}

Manifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.testbroadcast"
    android:versionCode="1"
    android:versionName="1.0" >


    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="19" />


    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.test.testbroadcast.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <receiver android:name="com.test.testbroadcast.MyReceiver" >
            <intent-filter>
                <action android:name="com.test.action.MY_ACTION" />
                <category android:name="android.intent.category.DEFAULT" /> 
            </intent-filter>
        </receiver>
    </application>


</manifest>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值