静态注册方式的特点:只要安装了静态注册的BroadCastReceiver应用,不管退不退出应用
广播接收者都在监听
//简单实现监听电话状态例子
静态注册方式的特点:只要安装了静态注册的BroadCastReceiver应用,不管退不退出应用
广播接收者都在监听
效果图示例:
结果:
1、静态注册在配置清单里实现
代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcastreceiver"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<!--监听电话状态需要添加的权限-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 电话状态监听静态注册 receiver的 name:是.包名 + 类名(这里在同一个包下直接.类名)
该类继承BroadCastReceiver(广播接收者)类 也就是要注册的BroadCastReceiver(广播接收者)-->
<receiver android:name=".MyPhoneStateReceiver">
<!--intent-filter(意图过滤器)-->
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
</application>
</manifest>
===================
2、MyPhoneStateReceiver类
代码
public class MyPhoneStateReceiver extends BroadcastReceiver {
/**
* onReceive方法是继承BroadcastReceiver类必须重写的
*/
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.i("data", "电话状态改变了");
Bundle bundle = intent.getExtras();
//获取来电的号码
String number = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
//获取管理器
TelephonyManager manager = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);
//通过管理器获取电话状态
int state = manager.getCallState();
switch(state){
case TelephonyManager.CALL_STATE_IDLE://挂断
Log.i("data", "电话挂断了");
break;
case TelephonyManager.CALL_STATE_OFFHOOK://接听
Log.i("data", "电话接听");
break;
case TelephonyManager.CALL_STATE_RINGING://铃响
Log.i("data", number + "来电");
break;
}
}
}
===================================================
BroadCastReceiver(广播接收者的静态注册)简单使用例子2
静态注册方式的特点:只要安装了静态注册的BroadCastReceiver应用,不管退不退出应用
广播接收者都在监听
//简单实现监听短信消息例子
1、静态注册在配置清单里实现
代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcastreceiver"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<!--监听电话状态需要添加的权限-->
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 短信监听静态注册 receiver的 name:是.包名 + 类名(这里在同一个包下直接.类名)
该类继承BroadCastReceiver(广播接收者)类 也就是要注册的BroadCastReceiver(广播接收者)-->
<receiver android:name=".MySmsReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
</application>
</manifest>
=====================
2、MySmsReceiver.java类
代码
public class MySmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Bundle bundle = intent.getExtras();
// Protocol Data Unit 协议数据单元
Object[] pdus = (Object[]) bundle.get("pdus");//获取发送过来的短信(里面装有发送过来所有短信数据)
//进一步封装发送过来的短信数据的数组
SmsMessage[] smsMessage = new SmsMessage[pdus.length];
for(int i = 0;i<smsMessage.length;i++){
//进一步把短信数据封装到数组SmsMessage
//为了方便操作发送过来的短信数据(用该数组里的方法来操作)
smsMessage[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
}
//获取发送短信的电话号码
//从0位置获取就行 要是短信内容够长其他位置获取也行
//但是为了保证数组不越界问题 从0位置获取比较稳妥
String smsNumber = smsMessage[0].getDisplayOriginatingAddress();
//获取发送过来的短信内容(把短信内容拼接起来)
StringBuffer sb = new StringBuffer();
for(int i = 0;i<smsMessage.length;i++){
sb.append(smsMessage[i].getDisplayMessageBody());
}
String content = sb.toString();//短信内容
Log.i("data", smsNumber + "::" + content);//在日志猫里输出
//把短信信息发送给其他接收者
if("110".equals(smsNumber)){
abortBroadcast();//中断广播
//重新把拦截的广播发送给其他接收者
SmsManager smsManager = SmsManager.getDefault();//获取管理器
//使用管理器里的sendTextMessage方法把拦截的广播发送给其他接收者
/**
* sendTextMessage(String destinationAddress,
* String scAddress, String text, PendingIntent sentIntent,
* PendingIntent deliveryIntent)
* //第一个参数:要发送给其他接收者的地址
* //第三个参数:要发送的内容
*/
smsManager.sendTextMessage("5556", null, smsNumber + "::" + content, null, null);
}
}
}