Android 接收不到静态广播自定义广播
最近,我在学习 Android 广播接收器时发现了个问题,就是我按照书上的方式去自定义一个静态广播,然后却怎么也接收不到自己定义的广播。我当时自定义静态广播的代码如下,
定义广播:
-
public class MainActivity extends AppCompatActivity {
-
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_main);
-
Button button = (Button) findViewById(R.id.button);
-
button.setOnClickListener(new View.OnClickListener() {
-
-
public void onClick(View v) {
-
Intent intent = new Intent("android.test.broadcasttest.BROADCAST_TEST");
-
intent.putExtra("message","你妈喊你回家吃饭了");
-
sendBroadcast(intent);
-
}
-
});
-
}
-
}
定义接收器:
-
public class MyBroadcastReceiver extends BroadcastReceiver {
-
-
-
public void onReceive(Context context, Intent intent) {
-
Toast.makeText(context, intent.getStringExtra("message"), Toast.LENGTH_SHORT).show();
-
}
-
}
在 AndroidManifest.xml 中静态注册接收器:
-
<receiver
-
android:name=".MyBroadcastReceiver"
-
android:enabled="true"
-
android:exported="true">
-
<intent-filter>
-
<action android:name="android.test.broadcasttest.BROADCAST_TEST"/>
-
</intent-filter>
-
</receiver>
就是按照上述代码运行程序的,结果却没有接收到广播,一度让我产生自我怀疑,然后我就把代码上上下下检查了一遍,但发现代码并没有错。于是有问题找度娘,我又去网上折腾了一遍,终于找到了解决办法。网上普遍的做法是这样的:在发送广播前,需要使用 setComponent() 方法指定将要作用的应用包名和类名,
-
Button button = (Button) findViewById(R.id.button);
-
button.setOnClickListener(new View.OnClickListener() {
-
-
public void onClick(View v) {
-
Intent intent = new Intent("android.test.broadcasttest.BROADCAST_TEST");
-
intent.setComponent(new ComponentName("android.test.broadcasttest",
-
"android.test.broadcasttest.MyBroadcastReceiver"));
-
intent.putExtra("message","你妈喊你回家吃饭了");
-
sendBroadcast(intent);
-
}
-
});
到这里,虽然解决问题了,但我还是没能明白这么做的原因。于是,有疑问找官方,我又去翻了一下谷歌的官方文档,找到的解释是这样的:
Broadcasts overview | Android Developers
Android 8.0
Beginning with Android 8.0 (API level 26), the system imposes additional restrictions on manifest-declared receivers.
If your app targets Android 8.0 or higher, you cannot use the manifest to declare a receiver for most implicit broadcasts (broadcasts that don't target your app specifically). You can still use a context-registered receiver when the user is actively using your app.
翻译:
从Android 8.0(API级别26)开始,该系统对声明清单的接收者施加了额外的限制。
如果你的应用目标是Android 8.0或更高版本,你不能使用清单为大多数隐式广播(不是专门针对你的应用的广播)声明接收器。当用户正在使用你的应用程序时,你仍然可以使用上下文注册的接收器。
大致意思是官方在这方面做了限制,定义的静态广播必须指定范围(应用),类似于生活中广播要在指定频道才能收到。
既然如此,其实指定要广播的应用包名就行了,这样更加灵活和方便:
-
Button button = (Button) findViewById(R.id.button);
-
button.setOnClickListener(new View.OnClickListener() {
-
-
public void onClick(View v) {
-
Intent intent = new Intent("android.test.broadcasttest.BROADCAST_TEST");
-
intent.putExtra("message","你妈喊你回家吃饭了");
-
intent.setPackage(getPackageName());
-
sendBroadcast(intent);
-
}
-
});
-
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfagfh
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01