Android学习之坑——静态广播问题
一、前言
因为工作的需要吧,之前都是研究Unity的,现在需要研究Android,于是就找了本经典的书《第一行代码》(第二版)看。看到第五章的时候就遇到坑了,发现按照书上的写代码根本运行得不到书上的效果,我使用的是Android Studio3.5.1 SDK是Version29。其中5.3节讲到需要一个广播得接收者来接收发送自定义得广播,并且其他的APP中也可以接收到这个广播。然而按照书上的去做,我不但其他APP上没接收到发送APP上的的消息,就连自身APP上的广播接收者也没接收到。
二 、具体解决无法接收广播的问题
1、同一个APP中无法接收广播的问题
解决这个问题需要注意两个地方即可,一个是”AndroidManifest.xml“的注册XML代码,另外一个是发送时候的代码。
1.1、注册代码”AndroidManifest.xml“中的注意事项
书中在同一个APP中定义了“MyBroadcastReceiver”,然后再该类中就写了一个提示程序。代码如下:
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_ SHORT).show(); }}
这一步都是没有问题,接下来在“AndroidManifest.xml”中的注册就不对了,书中的注册XML代码为:
... ...
要将其中的代码:
改成:
也就是这里注册的名字必须要符合如下规范
1.2、发送代码的注意事项
书中的在发送代码:
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() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST"); sendBroadcast(intent); } });
将按钮里的处理代码修改为如下代码:
Intent intent = new Intent("com.example.boradcasttestapplication.MyBroadcast"); intent.setComponent(new ComponentName("com.example.boradcasttestapplication", "com.example.boradcasttestapplication.MyBroadcast")); sendBroadcast(intent);
2、发送APP在另外一个APP无法接收的问题
书上的接收的APP程序没有什么问题,还是在静态注册的”AndroidManifest.xml“文件中,将书中的代码片段
中的 替换成
,比如我自己写的第二个APP程序”mybroadcastreceiverapplication2“,其中定义了一个接收广播的类“AnotherBroadcastReceiver“,因此我在”AndroidManifest.xml“文件中的代码就为:
最后一步:在发送的APP中,单独在写一个发送的代码,而不是书上的一个发送代码。也即除了第一个APP上的发送不变,还需要再写一个专门发送给第二个APP的代码。
Intent intent = new Intent("com.example.boradcasttestapplication.MyBroadcast"); intent.setComponent(new ComponentName("com.example.boradcasttestapplication", "com.example.boradcasttestapplication.MyBroadcast")); sendBroadcast(intent); Intent intent2=new Intent("com.example.mybroadcastreceiverapplication2.AnotherBroadcastReceiver"); intent2.setComponent(new ComponentName("com.example.mybroadcastreceiverapplication2","com.example.mybroadcastreceiverapplication2.AnotherBroadcastReceiver")); sendBroadcast(intent2);
三、总结
1、书上的代码可能是因为API版本已经过时的原因导致广播不能接收或发送成功
2、同一个APP下要注意在“AndroidManifest.xml”注册的广播接收者的名字一定要和定义的类名字一致,另一个APP中的“AndroidManifest.xml”也是一样,一定要保证在XML文件中注册的名字(包括包名)要和该类一致
3、发送给另外一个APP的代码中要单独在写一个发送的,匹配的标识要和第二个APP的接收类一致
更多相关文章
- Android开源游戏引擎之Angle(一)——概述
- android应用程序线程的监控
- Android—启动内置APK和动态发送接收自定义广播
- Android的Activity, Intent 和 Service
- Android(安卓)Launcher桌面应用快捷方式的开发
- Android系统使用socket在Java层和native之间数据通信
- android用okhttp搭建网络通讯(附服务器端代码)
- 第一行代码第二版(郭霖著)笔记之第五章(详解广播机制)
- 关于Android的组件名