四、接收系统广播:
1 短信拦截
public class ShortMessageReceiver extends BroadcastReceiver{
@Override
public void onReceive(Contextcontext, Intent intent) {
// TODO Auto-generated method stub
System.out.println("receiver message");
//接受Intent对象当中的数据
Bundlebundle = intent.getExtras();
if(bundle !=null)
{
//在Bundle对象当中有一个属性名为pdus,这个属性的值是一个Object数组
Object[]myOBJpdus = (Object[]) bundle.get("pdus");
//创建一个SmsMessage类型的数组
SmsMessage[] messages = newSmsMessage[myOBJpdus.length];
System.out.println(messages.length);
for (int i = 0;i<myOBJpdus.length; i++)
{
//使用Object数组当中的对象创建SmsMessage对象
messages[i] = SmsMessage.createFromPdu((byte[])myOBJpdus[i]);
//获得放送短信的电话号码
String str = "手机号:" + messages[i].getOriginatingAddress() +"\n";
//获取短信的内容
str += messages[i].getDisplayMessageBody();
Toast.makeText(context, str, Toast.LENGTH_LONG);
}
}
}
}
注册广播接收器:
<receiverandroid:name="ShortMessageReceiver">
<intent-filter>
<actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
添加接收短信的权限:
<uses-permission android:name=”android.permission.RECEIVE_SMS”/>
2 来去电拦截
来去电的广播动作如下:
来电:android.intent.action.PHONE_STATE
去电:android.intent.action.NEW_OUTGOING_CALL
来电可分解为3个状态:未接电话时的响铃、接听电话和挂断电话
接收来电广播的接收器代码如下:
public class InCallReceiver extends BroadcastReceiver
{
private static Object obj;
//显示永不关闭的Toast信息框
public static void showToast(Contextcontext, String msg)
{
Toasttoast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0);
try
{
Fieldfield = toast.getClass().getDeclaredField("mTN");
field.setAccessible(true);
obj = field.get(toast);
Methodmethod = obj.getClass().getDeclaredMethod("show",null);
method.invoke(obj,null);
}
catch (Exception e)
{
}
}
//关闭Toast信息框
public static void closeToast()
{
if (obj !=null)
{
try
{
Methodmethod = obj.getClass().getDeclaredMethod("hide",null);
method.invoke(obj,null);
}
catch (Exception e)
{
}
}
}
@Override
public void onReceive(final Context context,final Intent intent)
{
TelephonyManager tm = (TelephonyManager) context
.getSystemService(Service.TELEPHONY_SERVICE);
switch (tm.getCallState())
{
case TelephonyManager.CALL_STATE_RINGING:
//获得来电号码
String incomingNumber = intent
.getStringExtra("incoming_number");
showToast(context,incomingNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.d("call_state","offhook");
break;
case TelephonyManager.CALL_STATE_IDLE:
closeToast();
}
}
}
注册广播接收器:
<receiverandroid:name="InCallReceiver">
<intent-filter>
<actionandroid:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
添加监听来电状态的权限:
<uses-permission android:name=”android.permission.READ_PHONE_STATE”/>
接收去电广播的接收器代码如下:
public class OutCallReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Contextcontext, Intent intent)
{
//获得去电号码
StringoutcomingNumber = intent
.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
InCallReceiver.showToast(context,outcomingNumber);
}
}
注册广播接收器:
<receiverandroid:name="OutCallReceiver">
<intent-filter>
<actionandroid:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>
添加权限:
<uses-permission android:name=”android.permission.READ_PHONE_STATE”/>
<uses-permission android:name=”android.permission.PROCESS_OUTGOING_CALLS”/>
3 截获屏幕休眠与唤醒
休眠状态:Intent.ACTION_SCREEN_ON
唤醒状态:Intent.ACTION_SCREEN_OFF
public class ScreenOnOffReceiver extends BroadcastReceiver{
@Override
public void onReceive(Contextcontext, Intent intent) {
//接收屏幕唤醒状态的广播
if(Intent.ACTION_SCREEN_ON.equals(intent.getAction()))
Log.d("screen","on");
//接收屏幕休眠状态的广播
else if(Intent.ACTION_SCREEN_OFF.equals(intent.getAction()))
Log.d("screen","off");
}
}
屏幕唤醒和休眠的广播只能在代码中注册,如果在AndroidManifest.xml中注册将不起作用。
screenOnOffReceiver =new ScreenOnOffReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(screenOnOffReceiver,filter);
4 开机自动运行
public class StartupReceiver extends BroadcastReceiver{
@Override
public void onReceive(Contextcontext, Intent intent) {
IntentmainIntent = new Intent(context,BroadcastReceiverTest.class);
//在广播接收器中显示Activity要设置FLAG_ACTIVITY_NEW_TASK标志
mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mainIntent);
}
}
<receiverandroid:name="StartupReceiver">
<intent-filter>
<actionandroid:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
这样开机后就会自动运行BroadcastReceiverTest这个Activity。
5 显示手机电池的当前电量
public class BatteryChangedReceiver extends BroadcastReceiver{
@Override
public void onReceive(Contextcontext, Intent intent)
{
if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction()))
{
//当前剩余电量的值
int level =intent.getIntExtra("level", 0);
//电量的总刻度点击打开链接
int scale =intent.getIntExtra("scale", 100);
Toast.makeText(context,"电池剩余电量:" + (level * 100 / scale) +"%",Toast.LENGTH_LONG).show();
}
}
}
batteryChangedReceiver = new BatteryChangedReceiver();
IntentFilter filter = newIntentFilter(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(batteryChangedReceiver,filter);
五、验证广播接收器是否注册
//获得PackageManager对象
PackageManager packageManager =getPackageManager();
//指定要查询广播的动作
Intent intent = new Intent("android.provider.Telephony.SMS_RECEIVED");
//返回以查询到的广播接收器集合,如果没有符合条件的广播,List对象的长度为0
List<ResolveInfo> resolveInfos =packageManager
.queryBroadcastReceivers(intent,PackageManager.GET_INTENT_FILTERS);
String s = "";
//显示查询到的广播接收器的信息
for (ResolveInfo resolveInfo : resolveInfos)
{
s += String.valueOf(resolveInfo.toString())+ "\n\n";
}
Toast.makeText(BroadcastReceiverTest.this,"已发现" + resolveInfos.size() +"个接收短信广播的接收器."+"\n接收器的信息分别为:"+s,Toast.LENGTH_LONG).show();
拓展:查询Activity Action是否存在
PackageManager packageManager =getPackageManager();
Intent intent = new Intent("com.android.phone");
List<ResolveInfo> resolveInfos =packageManager
.queryIntentActivities(intent,PackageManager.GET_INTENT_FILTERS);
String s = "";
for (ResolveInfo resolveInfo : resolveInfos)
{
s += String.valueOf(resolveInfo.toString())+ "\n\n";
}
Toast.makeText(BroadcastReceiverTest.this,"已发现" + resolveInfos.size() +"个Activity."+"\nActivity的信息分别为:"+s,Toast.LENGTH_LONG).show();