您的位置:首页 > 其它

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"));
}
}
}
}

[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来做需要的事情
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: