Android学习总结(六)———— 发送自定义广播

一.两种广播类型

2.1 标准广播

  是一种完全异步执行的广播,在广播发出去之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法截断的。

2.2 有序广播

  是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递,所有此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息了,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。

二.示例代码

2.1、发送标准广播

  新建一个MyBroadcastReceiver继承自BroadcastReceiver,代码如下所示:

package com.nyl.custombroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"收到广播接收器",Toast.LENGTH_SHORT).show();
    }
}

  然后AndroidManifest.xml中注册下,写上Intent-filter:

  

  定义一个简单的按钮,用于作为发送广播的触发点,然后在MainActivity中完成发送按钮,代码如下所示:

package com.nyl.custombroadcast;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity implements View.OnClickListener {

    private Button btnSendBroadcast;

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

    @Override
    public void onClick(View view) {
        /**
         * 构建出一个Intent对象,并把要发送的广播的值传入,然后调用了Context的sendBroadcast()方法将广播发送出去
         * 这样所有监听com.nyl.custombroadcast.MyBroadcastReceiver这条广播的广播接收器就会收到消息。
         */
        Intent intent = new Intent("com.nyl.custombroadcast.MyBroadcastReceiver");
        sendBroadcast(intent);
    }
}

  运行程序,点击一下发送广播按钮,效果如下图:

  

  这样我们就成功完成了发送自定义广播的功能了。

2.2、发送有序广播

  接收者通过Bundle bundle = new getResultExtras(true)可以获取上一个接收者存入的数据,定义了两个AnotherBroadcastReceiver类,如下所示:

package com.nyl.orderlybroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;


public class AnotherBroadcastReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"收到广播接收器",Toast.LENGTH_SHORT).show();
        //创建一个Bundle对象,并存入数据
        Bundle bundle = new Bundle();
        bundle.putString("first","有序广播");
        //将bundle放入结果中
        setResultExtras(bundle);
        //取消Broadcast的继续发送,也就是将广播截断,不再发给下一个广播接收器 
        abortBroadcast();
    }
}
package com.nyl.orderlybroadcast;


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

public class AnotherBroadcastReceiver1 extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = getResultExtras(true);
        //解析前一个BroadcastReceiver所存入的key为first的消息
        String first = bundle.getString("first");
        Toast.makeText(context,"第一个广播存入的消息为:" + first,Toast.LENGTH_SHORT).show();
    }
}

  在AndroidManifest.xml中对该AnotherBroadcastReceiver行注册,添加开机广播的intent-filter,然后android:priority属性给广播接收器设置了优先级,优先级比较高的广播接收器就可以先收到广播。如下图所示:

  

   还是跟发送标准的一样,定义一个简单的按钮,用于作为发送广播的触发点,然后在MainActivity中完成发送按钮,代码如下所示:

package com.nyl.orderlybroadcast;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity implements View.OnClickListener {

    private Button btnOrderlyBroadcast;

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

    @Override
    public void onClick(View view) {
        Intent intent = new Intent("com.nyl.orderlybroadcast.AnotherBroadcastReceiver");
        /**
         * sendOrderedBroadcast()方法接收两个参数:第一个参数是intent
         * 第二个是一个与权限相关的字符串,这里传入null就行了
         */
        sendOrderedBroadcast(intent,null);
    }
}

  注:如果把AnotherBroadcastReceiver的abortBroadcast()这个方法注释掉,那么AnotherBroadcastReceiver1也会收到广播,按照配置的接收优先级顺序,AnotherBroadcastReceiver会先接收到,然后才到AnotherBroadcastReceiver1,效果如下图:     

       

  关于广播的内容介绍就这么多,内容有写得不对的地方,欢迎广大园友指正!

原文地址:https://www.cnblogs.com/nylcy/p/6507246.html