Android8.0在自定义广播发送和接收者时的问题

安卓8.0在自定义广播发送和接收者时的问题

首先先贴出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);

注:上面的权限声明一块是按照书中所说的要加上的,但是本人试过不加这两个权限声明发现也能够成功接收和发送广播。(这里没有任何权威声明,只是一段注解。)

你可能感兴趣的:(Android)