Android之BroadcastReceiver

作者: 拨云见日aaa | 来源:发表于2019-09-28 20:25 被阅读0次

    一、接收广播

    (1)用法简介

    首先继承BroadcastReceiver,需要重写onReceive方法(两个参数:1.context,2.intent),然后通过registerReceiver方法注册,需要传两个参数,一个是BroadcastReceiver的实例,另一个是IntentFilter的实例,IntentFilter的实例用addAction设置Action。(有两种注册方式,静态动态,由于静态越来越不推荐了,这里只说动态注册)
    系统常用的广播

    (2)代码示例
    public class MainActivity extends AppCompatActivity {
    TextView tv;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tv=findViewById(R.id.tv);
             MyBroadcastReceiver receiver=new MyBroadcastReceiver();
             IntentFilter filter=new IntentFilter();
             filter.addAction(Intent.ACTION_SCREEN_ON);
             registerReceiver(receiver,filter);//动态注册
        }
        public class MyBroadcastReceiver extends BroadcastReceiver {
            public void onReceive(Context context, Intent data){
                if(data.getAction().equals(Intent.ACTION_SCREEN_ON)){
                 tv.setText("屏幕被打开");
                }
            }
        }
    }
    

    (3)运行结果


    接收屏幕被打开的广播

    二、发送无序广播

    广播分为有序广播和无序广播,无序广播广播一发出几乎广播接收者几乎同时接收到,接到广播的先后是随机的,有序广播是一级一级接收的优先级高的先接收,并且可以拦截

    (1)使用介绍

    新建Intent,在Intent里设置Action(setAction),然后调用sendBroadcast(intent)就完成了

    (2)代码示例
    //创建一个按钮,一点击就发送广播,然后被自己的广播接收者接收
    public class MainActivity extends AppCompatActivity {
    TextView tv;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tv=findViewById(R.id.tv);
             MyBroadcastReceiver receiver=new MyBroadcastReceiver();
             IntentFilter filter=new IntentFilter();
             filter.addAction("com.hello.world");
             registerReceiver(receiver,filter);
    
        }
        public void click(View v){
            Intent intent=new Intent();
            intent.putExtra("data","hello,world");
            intent.setAction("com.hello.world");
            sendBroadcast(intent);
        }
        public class MyBroadcastReceiver extends BroadcastReceiver {
            public void onReceive(Context context, Intent data){
                if(data.getAction().equals("com.hello.world")){
                 tv.setText(data.getStringExtra("data"));
                }
            }
        }
    }
    
    (3)运行结果
    发送广播并接收

    三、发送有序广播

    (1)用法介绍

    • 只要将发送无序广播的sendBroadcast改为sendOrderedBroadcast就可以了
    • 广播接收者在注册时声明优先级就可以了
      -可以通过abortBroadcast就可以拦截广播
      (2)代码示例
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            IntentFilter filter1=new IntentFilter();
            filter1.addAction("hello");
            filter1.setPriority(100);
            IntentFilter filter2=new IntentFilter();
            filter2.addAction("hello");
            MyBroadcastReceiver1 receiver1=new MyBroadcastReceiver1();
            MyBroadcastReceiver2 receiver2=new MyBroadcastReceiver2();
            registerReceiver(receiver1,filter1);
            registerReceiver(receiver2,filter2);
        }
        public void click(View view){
            Intent intent=new Intent("hello");
            sendOrderedBroadcast(intent,null);
        }
        class MyBroadcastReceiver1 extends BroadcastReceiver{
            public void onReceive(Context context, Intent intent){
                Log.i("test","我优先级高,我可以修改数据,可以拦截广播");
            }
        }
        class MyBroadcastReceiver2 extends BroadcastReceiver{
            public void onReceive(Context context,Intent intent){
                Log.i("test","我优先级低");
            }
        }
    }
    

    要想拦截广播

    abort Broadcast();
    
    运行结果
    每次接收的广播先后顺序都一样

    四、发送和接收本地广播

    (1)使用介绍

    之前的广播都是系统级的都可以接收到,存在安全问题,所以可以使用本地广播,首先调用LocalBroadcastManager.getInstance(this)获取LocalBroadcastManager对象,然后通过LocalBroadcastManager来registerReceiver和unRegisterReceiver,通过LocalBroadcastManager来sendBroadcast

    (2)代码示例
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            LocalBroadcastManager manager=LocalBroadcastManager.getInstance(this);
            MyBroadcastReceiver receiver=new MyBroadcastReceiver();
            IntentFilter filter=new IntentFilter();
            filter.addAction("hello");
            manager.registerReceiver(receiver,filter);
        }
        public void click(View v){
            Intent intent=new Intent("hello");
            LocalBroadcastManager manager=LocalBroadcastManager.getInstance(this);
            manager.sendBroadcast(intent);
        }
        class MyBroadcastReceiver extends BroadcastReceiver{
            public void onReceive(Context context, Intent intent){
                Log.i("test","我是本地广播接收器");
            }
        }
    }
    

    五、粘性广播

    (1)使用介绍

    通过sendStickyBroadcast()方法发送广播,该广播发送后会一直滞留,当有匹配的接收者注册时就可以接收这条广播,发送粘性广播需要权限<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
    可以通过removeSticky Broadcast()移除,粘性广播只保留最后一条

    (2)代码示例
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
        public void click1(View v){
            Intent intent=new Intent("hello");
            sendStickyBroadcast(intent);
        }
        public void click2(View v){
            IntentFilter filter=new IntentFilter();
            filter.addAction("hello");
            MyReceiver receiver=new MyReceiver();
            registerReceiver(receiver,filter);
        }
        class MyReceiver extends BroadcastReceiver{
    
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.i("test","粘性广播我来接收你");
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:Android之BroadcastReceiver

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