Broadcast Receiver @

本文深入探讨了Android中BroadcastReceiver的两种注册方式——动态注册与静态注册,并通过实例展示了如何实现动态注册与发送自定义广播。此外,还介绍了如何接收系统广播,如相机按钮触发的广播,并详细阐述了监听系统广播的流程。最后,文章提供了窃听短信广播的实例,包括权限声明和接收短信的具体步骤。

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

http://developer.android.com/reference/android/content/BroadcastReceiver.html

译文: http://www.2cto.com/kf/201112/115112.html

 

注册BroadcastReceiver有两种方式:

        一般如果在代码里面注册,就把广播写在代码里面,在xml文件中注册就单独写一个类。

  动态注册:

  一般在onResume()方法里面注册:

package com.test;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;

public class TestBroadcastReceiver extends Activity
{
	MyReceiver myReceiver;

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

	@Override
	protected void onResume()
	{
		myReceiver = new MyReceiver();
		IntentFilter filter = new IntentFilter();
		// 向过滤器中添加action
		filter.addAction("com.test");
		// 注册广播
		registerReceiver(myReceiver, filter);

		Intent intent = new Intent();
		intent.setAction("com.test");
		intent.putExtra("key", "value");
		// 发送广播
		sendBroadcast(intent);
		super.onResume();
	}

	@Override
	protected void onPause()
	{
		unregisterReceiver(myReceiver);
		super.onPause();
	}

	class MyReceiver extends BroadcastReceiver
	{
		private static final String ACTION_TEST = "com.test";

		@Override
		public void onReceive(Context context, Intent intent)
		{
			if (intent.getAction().equals(ACTION_TEST))
			{
				Bundle bundle = intent.getExtras();
				System.out.println(bundle.get("key"));
			}
		}
	}
}

 

  静态注册:在AndroidManifest.xml中用标签注册,并在标签内用标签设置过滤器。

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".TestBroadcastReceiver" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

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

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


public class MyReceiver extends BroadcastReceiver
{

	private static final String ACTION_TEST = "com.test";

	@Override
	public void onReceive(Context context, Intent intent)
	{
		if (intent.getAction().equals(ACTION_TEST))
		{
			Bundle bundle = intent.getExtras();
			System.out.println(bundle.get("key"));
		}
	}
}

然后可在activity里发送广播。

----------------------------------------------------------------------------------------------------------------------------

上面是接受自定义的广播, 我们还可以接受系统发出的广播:

以下是个按下照相机之后,启动一个服务的例子:

1, 新建SimpleBoradcastReceiver extends BroadcastReceiver

public class SimpleBoradcastReceiver extends BroadcastReceiver
{

	@Override
	public void onReceive(Context context, Intent intent)
	{
		String action = intent.getAction();
		if (action.equals(Intent.ACTION_CAMERA_BUTTON))
		{
			// 照相机按下后需要做的事,这里启动一个服务
			/**
			 * 如果broadcast reveiver需要处理耗时的任务,就应该启动一个服务而不是线程,
			 * 因为在执行完onReceive()方法后,BroadcastReceiver实例就即刻进入非活动状态,而被系统杀死。
			 */
			context.startService(new Intent(context, SimpleService.class));
		}

	}

}

 

2, 用MainActivity来启动SimpleBoradcastReceiver

public class MainActivity extends Activity
{
	SimpleBoradcastReceiver aSimpleBoradcastReceiver = new SimpleBoradcastReceiver();

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		// 照相按钮的过滤器
		IntentFilter intentFilter = new IntentFilter(
				Intent.ACTION_CAMERA_BUTTON);
		// 也可以继续增加你想要监听的行为
		intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
		// 启动broadcast receiver, 使用registerReceiver()方法将intentFilter传递给它, 启动以后只要有intentFilter里监听的行为发生,就会进入到aSimpleBoradcastReceiver的onReceive方法中去执行。
		registerReceiver(aSimpleBoradcastReceiver, intentFilter);
	}

	/**
	 * 如果销毁activity, receiver也要被释放掉(非必需,但很有用)。
	 */
	@Override
	protected void onPause()
	{
		super.onPause();
		unregisterReceiver(aSimpleBoradcastReceiver);
	}

}


3, SimpleService

public class SimpleService extends Service
{

	@Override
	public IBinder onBind(Intent arg0)
	{
		return null;
	}

	@Override
	public void onCreate()
	{
		super.onCreate();
		// do something...
	}

	@Override
	public void onDestroy()
	{
		super.onDestroy();
		// do something...
	}

}


----------------------------------------------------------------------------------------------------------------------------
窃听别人接收到的短信:

IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver, filter);
public class IncomingSMSReceiver extends BroadcastReceiver
{
	private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";

	@Override
	public void onReceive(Context context, Intent intent)
	{
		if (intent.getAction().equals(SMS_RECEIVED))
		{
			SmsManager sms = SmsManager.getDefault();
			Bundle bundle = intent.getExtras();
			if (bundle != null)
			{
				Object[] pdus = (Object[]) bundle.get("pdus");
				SmsMessage[] messages = new SmsMessage[pdus.length];
				for (int i = 0; i < pdus.length; i++)
					messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
				for (SmsMessage message : messages)
				{
					String msg = message.getMessageBody();
					String to = message.getOriginatingAddress();
					sms.sendTextMessage(to, null, msg, null, null);
				}
			}
		}
	}
}

在AndroidManifest.xml文件中添加以下权限:

<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
<uses-permission android:name="android.permission.SEND_SMS"/><!-- 发送短信权限 -->



Android还有很多广播Intent,如:开机启动、电池电量变化、时间已经改变等广播Intent。
    接收电池电量变化广播Intent ,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:

<receiver android:name=".IncomingSMSReceiver">
    <intent-filter>
         <action android:name="android.intent.action.BATTERY_CHANGED"/>
    </intent-filter>
</receiver>

接收开机启动广播Intent,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:

<receiver android:name=".IncomingSMSReceiver">
    <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

并且要进行权限声明:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

这样开机后onReceiver 就能收到开机的intent,然后自动启动你的service 或activity来做需要的事情





                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值