zoukankan      html  css  js  c++  java
  • Android BroadcastReceiver

    一 BroadcastReceiver简介

    BroadcastReceiver是四大组件之一 用来完成组件之间或者应用之间的通讯

    Broadcast: 广播

    BroadcastReceiver: 广播接收者

    广播和广播接收者完成一个消息机制 属于重量级别 因为需要激活组件

    二 注意

    在Android中 每次广播消息到来时都会创建BroadcastReceiver实例并执行onReceive()方法

    onReceive()方法执行完后 BroadcastReceiver的实例就会被销毁

    onReceive()方法也是在主线程调用

    onReceive()方法在10s内没有执行完毕 就会导致一个异常 ANR(application not response)

    所以在BroadcastReceiver里不能做一些比较耗时的操作

    如果需要完成一项比较耗时的操作 应该通过发送Intent给Service 由Service来完成 这里不能使用子线程来解决

    因为BroadcastReceiver的生命周期很短 子线程可能还没有结束BroadcastReceiver就先结束了

    BroadcastReceiver一旦结束 此时BroadcastReceiver的所在进程很容易在系统需要内存时被优先杀死

    因为它属于空进程(没有任何活动组件的进程) 如果它的宿主进程被杀死 那么正在工作的子线程也会被杀死 所以采用子线程来解决是不可靠的

    三 无序广播

    没有接收的先后顺序 所有的广播接收者同时接收

    // 广播接收者
    public class MyBroadcastReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // 当广播接收者接收到广播 该方法会被调用
            if ("com.hy.mm.action.TEST".equals(intent.getAction())) {
                String name = intent.getStringExtra("name");
                Log.i("HUANG", "name=" + name);
            }
        }
    
    }
    // 第一种订阅广播方式 AndroidManifest.xml application节点里面配置receiver
    <receiver android:name=".receiver.MyBroadcastReceiver">
        <intent-filter>
            <action android:name="com.hy.mm.action.TEST" />
        </intent-filter>
    </receiver>
    // 第二种订阅广播方式
    public class MainActivity extends AppCompatActivity {
    
        MyBroadcastReceiver mReceiver;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            // 订阅广播
            mReceiver = new MyBroadcastReceiver();
            IntentFilter filter = new IntentFilter("com.hy.mm.action.TEST");
            registerReceiver(mReceiver, filter);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            // 取消订阅
            unregisterReceiver(mReceiver);
        }
    
    }
    // 发送无序广播
    Intent intent = new Intent("com.hy.mm.action.TEST");
    intent.putExtra("name", "小白");
    sendBroadcast(intent);

    四 有序广播

    有接收的先后顺序 是由广播接收者自己指定 取值范围(-1000 ~ 1000)

    如果先接收的广播接收者中断广播 那么后面的广播接收者就无法接收了

    特殊情况: 如果有序广播在发出的时候明确的指定了广播接收者 那么这样的广播无法中断 一定会发送给指定的接收者

    // 广播接收者1
    public class MyBroadcastReceiver1 extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // 当广播接收者接收到广播 该方法会被调用
            if ("com.hy.mm.action.T".equals(intent.getAction())) {
                int age = intent.getIntExtra("age", 0);
                Log.i("HUANG", "MyBroadcastReceiver1 age=" + age);
            }
        }
    
    }
    // 广播接收者2
    public class MyBroadcastReceiver2 extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // 当广播接收者接收到广播 该方法会被调用
            if ("com.hy.mm.action.T".equals(intent.getAction())) {
                int age = intent.getIntExtra("age", 0);
                Log.i("HUANG", "MyBroadcastReceiver2 age=" + age);
                // 中断广播
                //abortBroadcast();
            }
        }
    
    }
    // 订阅广播 AndroidManifest.xml application节点里面配置receiver
    <!-- priority: 优先级(-1000 ~ 1000) 值越大优先级越高 -->
    <receiver android:name=".receiver.MyBroadcastReceiver1">
        <intent-filter android:priority="900">
            <action android:name="com.hy.mm.action.T" />
        </intent-filter>
    </receiver>
    
    <receiver android:name=".receiver.MyBroadcastReceiver2">
        <intent-filter android:priority="1000">
            <action android:name="com.hy.mm.action.T" />
        </intent-filter>
    </receiver>
    // 发送有序广播
    Intent intent = new Intent("com.hy.mm.action.T");
    intent.putExtra("age", 15);
    sendOrderedBroadcast(intent, null);
  • 相关阅读:
    题解:艾米利亚的魔法
    tarjan求割点
    集合删数
    小测题解
    [考试]20141028
    铺地毯
    [考试]20141027
    大家好
    【DM642学习笔记一】关于Can't Initialize Target CPU的一种解决方法 : Error 0x80000240
    iOS开发之获取系统相册ALAssetLibrary
  • 原文地址:https://www.cnblogs.com/huangyi-427/p/9563950.html
Copyright © 2011-2022 走看看