Broadcast Receiver
2012-04-15 22:08
302 查看
注册BroadcastReceiver有两种方式:
一般如果在代码里面注册,就把广播写在代码里面,在xml文件中注册就单独写一个类。
动态注册:
一般在onResume()方法里面注册:
[java]
view plaincopyprint?
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"));
}
}
}
}
[java]
view plaincopyprint?
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"));
}
}
}
2, 用MainActivity来启动SimpleBoradcastReceiver
[java]
view plaincopyprint?
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);
}
}
----------------------------------------------------------------------------------------------------------------------------
窃听别人接收到的短信:
[java]
view plaincopyprint?
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver, filter);
在AndroidManifest.xml文件中添加以下权限:
[html]
view plaincopyprint?
<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
<uses-permission android:name="android.permission.SEND_SMS"/><!-- 发送短信权限 -->
接收开机启动广播Intent,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:
[html]
view plaincopyprint?
<receiver android:name=".IncomingSMSReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
这样开机后onReceiver 就能收到开机的intent,然后自动启动你的service 或activity来做需要的事情
一般如果在代码里面注册,就把广播写在代码里面,在xml文件中注册就单独写一个类。
动态注册:
一般在onResume()方法里面注册:
[java]
view plaincopyprint?
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"));
}
}
}
}
[html] view plaincopyprint? <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> <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>
[java]
view plaincopyprint?
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"));
}
}
}
[java] view plaincopyprint? 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)); } } } 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
[java]
view plaincopyprint?
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);
}
}
[java] view plaincopyprint? 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... } } 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... } }
----------------------------------------------------------------------------------------------------------------------------
窃听别人接收到的短信:
[java]
view plaincopyprint?
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver, filter);
[java] view plaincopyprint? 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); } } } } } 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文件中添加以下权限:
[html]
view plaincopyprint?
<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
<uses-permission android:name="android.permission.SEND_SMS"/><!-- 发送短信权限 -->
[html] view plaincopyprint? <pre class="html" name="code"><receiver android:name=".IncomingSMSReceiver"> <intent-filter> <action android:name="android.intent.action.BATTERY_CHANGED"/> </intent-filter> </receiver> <pre class="html" name="code"><receiver android:name=".IncomingSMSReceiver"> <intent-filter> <action android:name="android.intent.action.BATTERY_CHANGED"/> </intent-filter> </receiver>
接收开机启动广播Intent,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:
[html]
view plaincopyprint?
<receiver android:name=".IncomingSMSReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
[html] view plaincopyprint? <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
这样开机后onReceiver 就能收到开机的intent,然后自动启动你的service 或activity来做需要的事情
相关文章推荐
- 简要解释一下activity、 intent 、intent filter、service、Broadcast、BroadcaseReceiver
- 我对BroadcastReceiver的简单理解
- Android四大组件Activity、service、Content Provider、BroadCast Receiver
- Android 中的BroadCastReceiver
- BroadcastReceiver 广播 短信拦截
- android之BroadcastReceiver的使用
- 【转】BroadcastReceiver应用详解
- android-BroadcastReceiver 通过终止广播 阻止用户收到短信
- Android 中的BroadCastReceiver
- BroadcastReceiver处理耗时操作
- 通过短信窃听器来理解BroadcastReceiver:
- android Broadcast Receiver
- BroadcastReceiver应用详解
- android—广播接收者BroadcastReceiver的应用开发范例
- service 和broadcastreceiver的简略小结
- Android 开发笔记三 BroadcastReceiver 广播接收者
- Android 中的BroadCastReceiver【转】
- Android基础(九) BroadcastReceiver 广播接收者
- Android组件通讯之BroadcastReceiver应用闹钟服务
- Android Service 服务(二)—— BroadcastReceiver