自定义发送广播

广播主要分为两种类型:标准广播(完全异步执行的广播)和有序广播(完全同步执行的广播)。我们也可以根据广播是否可以跨进程接收,将广播分为:系统全局广播和本地广播

  • 系统全局广播:发出的广播可以被其他任何程序接收到,并且我们也可以接收来自其他任何应用程序的广播
  • 本地广播:发出的广播只能在应用程序的内部进行传递,广播接收器也只能接收本应用程序发出的广播

发送系统全局广播


  • 标准广播
    发送广播借助的是Intent对象,使用的是Context对象的sendBroadcast()方法发送广播。
    代码实现:
//构建一个Intent对象,传入要传递的广播
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
//调用sendBroadcast方法发送出标准广播
sendBroadcast(intent);
  • 有序广播
    发送有序广播和发送标准广播思路基本一致,发送有序广播时,调用的是Context对象的sendOrderedBroadcast()方法:
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
//发送有序广播,第二个参数是与权限相关的字符串,传入null即可
sendOrderedBroadcast(intent, null);

发送有序广播时,进程接收广播是有顺序的,并且可以劫持广播,设置广播接收优先级:在配置文件中配置标签时,给标签添加属性"android:priority="xxx"",实现拦截广播,调用方法:abortBroadcast()

发送本地广播


发送本地广播主要使用LocalBroadcastManager来对广播进行管理,并提供了发送广播和注册广播接收器的方法

代码实现:

public class MainActivity extends Activity {
    
    private IntentFilter intentFilter;
    
    private LocalReceive localReceive;
    
    private LocalBroadcastManager localBroadcastManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取到LocalBroadcastManager实例对象
        localBroadcastManager = LocalBroadcastManager.getInstance(this);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                //创建Intent对象,指定广播内容
                Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
                //发送本地广播
                localBroadcastManager.sendBroadcast(intent);
            }
        });
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
        localReceive = new LocalReceive();
        //注册本地广播接收器
        localBroadcastManager.registerReceiver(localReceive, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //动态注册,同样需要取消注册广播
        localBroadcastManager.unregisterReceiver(localReceive);
    }
    
    class LocalReceive extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();
        }
        
    }

}

本地广播是无法通过静态注册的方式来接收的,因为静态注册主要就是为了让程序在未启动的情况下也能收到广播,而发送本地广播时,我们的程序肯定已经启动了

你可能感兴趣的:(自定义发送广播)