自定义发送广播

作者: 大话程序 | 来源:发表于2016-05-07 20:58 被阅读877次

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

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

    发送系统全局广播


    • 标准广播
      发送广播借助的是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);
    

    发送有序广播时,进程接收广播是有顺序的,并且可以劫持广播,设置广播接收优先级:在配置文件中配置<receiver>标签时,给<intent-filter>标签添加属性"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();
            }
            
        }
    
    }
    

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

    相关文章

      网友评论

        本文标题:自定义发送广播

        本文链接:https://www.haomeiwen.com/subject/jpcsrttx.html