开发环境: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);
}
本文深入解析了Android8.0及以上版本中对广播机制的限制,特别是对于隐式广播的处理方式。介绍了如何在同一个包内及跨包发送和接收广播的具体实现方法,包括使用ComponentName设置接收者和在Intent中添加特定标志。
1253

被折叠的 条评论
为什么被折叠?



