《第一行代码》(第二版)广播的问题及其解决

1)5.2.1弹出两次已连接或者未连接

        这是因为你同时打开了流量和WiFi,他就会发出两次广播。

2)5.3.1中发送自定义广播问题

标准广播未能弹出消息:

Intent intent=new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);

上述已经失效了。

修改:

Intent intent=new Intent("com.example.broadcasttest.MY_BROADCAST");
intent.setPackage("com.example.broadcasttest");
sendBroadcast(intent);

原因:

        若App的TargetSDK达到了26, 我们正常静态注册的广播就没有用了。能用的仅有以下豁免的Broadcast, 包括我们自己正常发广播,如果不指定包名, 静态注册的也是收不到的。PS:动态注册是没有影响的。

3)5.3.2发送有序广播时同样的问题

         BroadcastTest2接收不到标准广播,未能弹出"received in AnotherBroadcastReceiver"

解决办法:

        在发送广播中的那个MainActivity中修改

Intent intent=new Intent("com.example.broadcasttest.MY_BROADCAST");
intent.setPackage("com.example.broadcasttest");
sendBroadcast(intent);
Intent intent2=new Intent("com.example.broadcasttest.MY_BROADCAST");
intent2.setPackage("com.example.broadcasttest2");
sendBroadcast(intent2);

原因:

                依然是因为静态注册未指定包名;

 4)截断广播

        静态注册的广播不知道能不能截断,但是似乎说是失效了,只能截断动态注册广播。此时我们就会换成动态注册,以后也尽量使用动态注册。也不需要带上setPackage就能发送了,简单多了。

 private IntentFilter intentFilter;

    private MyBroadcastReceiver myBroadcastReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button =  findViewById(R.id.button);

        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.broadcasttest.MY_BROADCAST");
        intentFilter.setPriority(100);
        myBroadcastReceiver = new MyBroadcastReceiver();
        registerReceiver(myBroadcastReceiver,intentFilter);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
//                intent.setPackage("com.example.mybroadcastreceiver");
                sendOrderedBroadcast(intent,null);
//                Intent intent2 = new Intent("com.example.broadcasttest.MY_BROADCAST");
//                intent2.setPackage("com.example.broadcasttest2");
//                sendOrderedBroadcast(intent2,null);
            }
        });
intentFilter.setPriority(100);

设置优先级,优先级高的先播出。

如果需要截断,就是不向下继续传递广播,就可以在该广播中写如:

abortBroadcast();

 

以上我将学习《第一行代码》(第二版)广播因代码失效改进的问题。

本文章借鉴如下博客:

这个是原因,但是其中的代码我没有成功实现。

(5条消息) 《第一行代码2》的5.3.1节,发送标准广播后没有弹出提示消息_qq_42332046的博客-优快云博客

以下是成功实现的代码原博客:

(5条消息) Android 第一行代码(第二版) 发送标准广播无效 接受不到_明道_N的博客-优快云博客 

(5条消息) 第一行代码5.3有序广播_昵称不能为——的博客-优快云博客

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值