Android8.0取消了大部分的静态广播的注册,可以参考广播限制,使用以前发送广播的方式是不能够调起注册的静态广播的。这里直接用跨进程(两个APP)通信的方式进行展示,在同一个进程中也是一样的:
1、建立一个接收广播的Demo,在该Demo中新建一个广播接收器,静态注册,代码如下:
package com.example.administrator.broadcastreceivedemo.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"接收到广播",Toast.LENGTH_SHORT).show();
}
}
manifest:
<receiver
android:name=".receiver.MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.administrator.broadcastsenddemo"/>
</intent-filter>
</receiver>
该Demo的包名是:
com.example.administrator.broadcastreceivedemo
2、建立一个发送广播的Demo,页面上只有一个Button,用于点击发送广播,代码如下:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.administrator.broadcastsenddemo");
intent.setComponent(new ComponentName("com.example.administrator.broadcastreceivedemo","com.example.administrator.broadcastreceivedemo.receiver.MyReceiver"));
sendBroadcast(intent);
}
});
这里就可以看出和以前发送广播的区别了,Intent设置了Component。ComponentName有两个参数,第一个参数是广播接收器所在应用的包名,第二个参数是广播接收器的全路径。可以与上面我们在第一步中建立接收广播的Demo进行对比。
3、点击按钮可以看到结果:
4、总结:
其实就是将原来的隐式Intent替换为现在的显式Intent,减少内存开销,优化系统。