一、前言

       因为工作的需要吧,之前都是研究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的接收类一致

更多相关文章

  1. Android开源游戏引擎之Angle(一)——概述
  2. android应用程序线程的监控
  3. Android—启动内置APK和动态发送接收自定义广播
  4. Android的Activity, Intent 和 Service
  5. Android(安卓)Launcher桌面应用快捷方式的开发
  6. Android系统使用socket在Java层和native之间数据通信
  7. android用okhttp搭建网络通讯(附服务器端代码)
  8. 第一行代码第二版(郭霖著)笔记之第五章(详解广播机制)
  9. 关于Android的组件名

随机推荐

  1. Android使用ActivityLifecycleCallbacks
  2. Android(java)学习笔记89:泛型概述和基本使
  3. Ubuntu 14.04下搭建 Android(安卓)开发环
  4. android TextInputLayout setError 隐藏
  5. Glide框架V3版本和V4版本区别
  6. java泛型操作复习,以及讲解在android中使
  7. Android含文档server结束(client UI接口异
  8. Android(安卓)后台任务(四)Loader
  9. ArcGIS for Android(安卓)在Eclipse上的
  10. Android(安卓)Studio添加字体解决方案