开发环境:Android Studio
虚拟机:android 9.0
Android8.0及以上系统关于广播的规定:对隐式广播做了限定,如果targetSdkVersion >=26,在Manifest里面注册的Receiver可能无法接收到广播消息
如果是再同一个包内接收广播,在发送广播时需要添加接收的广播的完整路径和类名,
查看ComponentName类的源码,该类的介绍上说明要设置接收类所在的包名和类名
在使用Intent时需要为intent添加ComponentName,代码如下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("MY_BROADCAST");
intent.setComponent(new ComponentName("com.example.broadcasttest",
"com.example.broadcasttest.MyBroadcastReceiver"));
sendBroadcast(intent);
}
});
}
}
如果是需要在不同的包里接收,两个及以上的module,需要修改代码如下:
@Override
public void onClick(View view) {
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
if(Build.VERSION.SDK_INT >= 26) {
intent.addFlags(0x01000000);
}
sendBroadcast(intent);
}