首先先贴出8.0之前自定义广播接收者时的代码。
先定义一个发送广播的按钮,用来发送广播
Intent intent = new Intent();
intent.setAction("com.itcast.interceptcall.broadcast");
intent.putExtra("data","data");
sendBroadcast(intent);
这里发送了一个无序广播,然后新建一个BroadcastReceiver
,用来接收上面发出的广播。
public class MyBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
String str = intent.getStringExtra("data");
Log.i("MyBroadCastReceiver ",str);
Log.i("MyBroadCastReceiver ","自定义的广播接收者,接收到了广播事件");
Log.i("MyBroadCastReceiver ",intent.getAction());
}
}
新建广播接收者时AndroidStudio会自动在清单文件AndroidManifst.xml
中加入声明,但是我们需要给出与发送广播中相同的广播声明以匹配。
<receiver
android:name=".BroadCastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.itcast.interceptcall.broadcast"/>
</intent-filter>
</receiver>
另外我们需要在其中加入权限声明
<permission-->
<!--android:name="com.example.broadcast.permission"-->
<!--android:protectionLevel="normal" />
<uses-permission android:name="com.example.broadcast.permission" />
这样我们就能成功的自定义了广播接收者来接收自定义发送的广播,但是后面发现在安卓8.0及以上版本中这样操作无法接收到广播,并且程序没有断掉,这是因为安卓高版本对广播发送与接收有了高要求,需要更详细的声明。静态注册广播接收者时需要在发送广播时加上一段代码。
intent.setComponent(new ComponentName("com.itcast.interceptcall","com.itcast.interceptcall.BroadCastReceiver"));
//ComponentName的第一个参数是自定义广播的包名,第二个参数是广播接收器的类
其实如果是动态注册接收者时不需要这样:
receiver = new MyReceiver();
IntentFilter filter = new IntentFilter("android.intent.action.MyReceiver");
getActivity().registerReceiver(receiver, filter);
Intent intent = new Intent("android.intent.action.MyReceiver");
getActivity().sendBroadcast(intent);
注:
上面的权限声明一块是按照书中所说的要加上的,但是本人试过不加这两个权限声明发现也能够成功接收和发送广播。(这里没有任何权威声明,只是一段注解。)