一.静态注册广播接受者
基本步骤
1.新建广播接收者类继承于BroadcastReceiver并实现方法onReceive
public class SmsBroadReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
}
}
2.在Manifest中注册接收者
<receiver android:name=".SmsBroadReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
3.如果此接收者须要权限,须要再Manifest中开启相关权限
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
4.在第一步定义的类中实现拦截逻辑
电话拦截器
1.定义类并实现相关方法及逻辑
public class MyBroadReceive extends BroadcastReceiver
{
private static final String TAG = "MyBroadReceive";
@Override
public void onReceive(Context context, Intent intent)
{
log("进入拦截器");
String action = intent.getAction();
switch (action)
{
case "android.intent.action.NEW_OUTGOING_CALL":
Log.d(TAG, "正在拨打电话,号码:" + getResultData());
break;
}
}
}
2.Manifest中注册接收者
<receiver android:name=".MyBroadReceive">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>
3.开启权限
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
短信接收者
1.定义类并实习方法
public class SmsBroadReceiver extends BroadcastReceiver
{
private static final String TAG = "SmsBroadReceiver";
@Override
public void onReceive(Context context, Intent intent)
{
String format = intent.getStringExtra("format");
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for (Object pdu : pdus)
{
SmsMessage message;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M)
{
message = SmsMessage.createFromPdu((byte[])pdu,format);
}
else
{
message = SmsMessage.createFromPdu((byte[])pdu);
}
String number = message.getOriginatingAddress();
String sms = message.getMessageBody();
Log.d(TAG,number+":"+sms);
}
}
}
2.在Manifest中注册接收者
<receiver android:name=".SmsBroadReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
3.开启权限
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
细节
有两个广播接收者需要配置data标签
1.挂在sd卡跟卸载sd卡
<receiver android:name=".MediaBroadReceive">
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED"/>
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
<data android:scheme="file"/>
</intent-filter>
</receiver>
2.卸载跟安装软件
<receiver android:name=".r">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_INSTALL"/>
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>
二.动态注册广播接收者
1.新建java类,继承broadcastreceiver,并完善相关逻辑
public class MyBroadcastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
if(action.equals(Intent.ACTION_SCREEN_OFF))
{
System.out.println("屏幕关闭了");
}
if(action.equals(Intent.ACTION_SCREEN_ON))
{
System.out.println("屏幕打开了");
}
}
}
2.在onCreate方法中动态注册广播接受者
private MyBroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
receiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(receiver,filter);
}
3.重写destroy方法,在意图关闭的时候取消注册广播接受者
@Override
protected void onDestroy()
{
unregisterReceiver(receiver);
super.onDestroy();
}