美文网首页
Android组件 - 广播

Android组件 - 广播

作者: Ricky_Zeng | 来源:发表于2019-12-01 23:02 被阅读0次

    目录:

    一、什么是广播
    二、广播的类型
    三、广播接收者的使用
    四、广播接收者的注意事项


    一、什么是广播

    Android四大组件之一,广播分两个角色:
    广播发送者:发送标准广播或有序广播;
    广播接收者:用于接收Android系统、应用程序发出的广播,并作出响应。

    二、广播的类型

    按照广播类型分:全局广播本地广播

    全局广播:发出的广播可以被其他任意的应用程序接收,或者可以接收来自其他任意应用程序的广播;

    本地广播:只能在应用程序的内部进行传递的广播,广播接收器也只能接收内部的广播,不能接受其他应用程序的广播。

    按照广播发送机制分:标准广播有序广播

    无序广播:广播发出后,所有的广播接收器几乎会在同一时刻接收到这条广播消息,没有先后顺序可言;优点就是效率较高,无法被截断。

    标准广播

    有序广播:广播发出后,同一时刻只会有一个广播接收器能够接收到这条广播消息,有先后顺序,每次只发送到优先级较高的接收者那里,按照优先级,一级一级的向下传递。优先级高的接收者可以截断正在传递的广播。

    有序广播

    三、广播的使用(代码演示):

    1.广播的注册
    2.广播的发送
    3.广播的接收
    4.本地广播的使用

            <!-- 1.2 AndroidManifest.xml静态注册 -->
            <receiver
                android:name="._01_broadcast.BroadcastDemoActivity$MyReceiver"
                android:enabled="true"
                android:exported="true">
                <intent-filter android:priority="1000">
                    <action android:name="android.intent.test" />
                </intent-filter>
            </receiver>
    
    public class BroadcastDemoActivity extends AppCompatActivity {
    
        private MyReceiver receiver = new MyReceiver();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_broadcast_demo);
        }
    
        /*
         * ---------------------------
         * 广播的使用:
         * 1.广播的注册
         * 2.广播的发送
         * 3.广播接收器的使用
         * 4.本地广播的使用
         * ---------------------------
         */
    
        /**
         * 1.广播的注册:动态注册、静态注册
         * 1.1 动态注册
         * 1.1.1 动态注册的广播要注意跟随其他组件的生命周期进行销毁
         *
         * 1.2 静态注册:参看AndroidManifest.xml
         * 1.2.1 android:enable 表示是否启用这个广播接收器
         * 1.2.2 android:exported 表示是否允许这个广播接收本程序以外的广播消息
         * 1.2.3 android:priority="1000" 表示在处理有序广播时,能够更靠前优先获取消息,Android官方规定范围:-1000到1000
         */
    
        private void dynamicRegister() {
            IntentFilter filter = new IntentFilter();
            filter.addAction("android.intent.test");
            registerReceiver(receiver, filter);
        }
    
        /*
         * 2.广播的发送
         * 2.1 标准广播的发送
         * 2.2 有序广播的发送
         */
        public void sendBroadcastMessage() {
            Intent intent = new Intent();
            intent.setAction("android.intent.test");
            // 标准广播的发送
            sendBroadcast(intent);
            // 有序广播的发送
            sendOrderedBroadcast(intent, null);
        }
    
        /* 3.广播接收器的使用 */
        public class MyReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                // 接收IntentFilter根据action过滤出的广播消息并处理,如android.intent.test消息
                if (intent.getAction() != null) {
                    switch (intent.getAction()) {
                        case "android.intent.test":
                            break;
                        default:
                            break;
                    }
                }
    
                /*
                 * 在接收器中,可以对Intent进行窜改,也可以调用 abortBroadcast() 方法停止往下传递;
                 * 调用 abortBroadcast() 后,权限比他低的接收器就再也收不到这个广播了。
                 */
            }
        }
    
    
        /*
         * 4.本地广播的使用
         * 4.1 本地广播的注册
         * 4.1.1 使用本地广播并没有静态注册的方法,因为静态注册主要是为了让程序在未启动的情况下也能收到广播,
         * 而发动本地广播的时候,我们的程序已经是启动了,所以,自然是没有静态注册的方式
         *
         * 4.2 同全局广播一样,本地广播也要注意跟随其他组件的生命周期进行销毁
         * 4.3 本地广播发送标准广播、有序广播
         */
        public void localBroadcastRegister() {
            LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
            IntentFilter filter = new IntentFilter();
            filter.addAction("android.intent.test");
            localBroadcastManager.registerReceiver(receiver, filter);
        }
    
        public void sendLocalBroadcastMessage() {
            LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
            Intent intent = new Intent();
            intent.setAction("android.intent.test");
            // 发送标准广播
            localBroadcastManager.sendBroadcast(intent);
            // 发送有序广播
            localBroadcastManager.sendBroadcastSync(intent);
        }
    
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            // 1.1.1 动态注册的广播要注意跟随其他组件的生命周期进行销毁
            unregisterReceiver(receiver);
    
            // 4.2 同全局广播一样,本地广播也要注意跟随其他组件的生命周期进行销毁
            LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
            localBroadcastManager.unregisterReceiver(receiver);
        }
    }
    

    四、广播接收者的注意事项

    1. 每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁 。

    2. 当 onReceive() 方法在 10 秒内没有执行完毕,就会导致ANR。如果需要执行长任务,那么就有必要使用Service。

    3. 尽量不使用线程,因为有可能线程没有执行完,应用进程就退出,导致线程运行结果不可靠。

    4. 另外注意,BroadcastReceiver 会堵塞主线程。唯有 onReceive() 结束,主线程才得以继续进行。

    相关文章

      网友评论

          本文标题:Android组件 - 广播

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