Android课程——BroadcastReceiver

BroadcastReceiver

BroadcastReceiver是Android四大组件之一,分为接收方和发送方,就算没有接收方发送方也会发送数据。
BroadcastReceiver可以实现多个页面的数据通信,实现跨进程之间的数据通信。

广播分类:

  • 无序广播:不管有多少接收者,一旦发出无序广播,所有监听此广播的接收者都能接收到;
  • 有序广播:按照接收者的优先级,逐一传递,优先级最高者最先接收,如果不终止此广播,再往下传递。
  • 粘滞广播:当广播发出后,如果系统没有接收者,会一直等待有接收者接送。
静态注册无序广播

步骤:
- 新建类继承BroadcastReceiver;
- 实现onReceive方法;
- 在Manifest里注册BroadcastReceiver,结构如下

<receiver android:name=".Zhifubao">
           <intent-filter>
                <action android:name="zhifubao"/>
            </intent-filter>
        </receiver>

常用方法和标签:

  1. onReceive方法:广播的接收者;
  2. action:注册时设置监听动作(频道);
  3. sendBroadcast:发送一个无序广播,此方法需要一个Intent的参数,调用Intent的对象的setAction方法,设置要发送的频道。

    代码演示:
    Activity发送方:

public class MainActivity extends AppCompatActivity {
    private Button abtn;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        abtn = findViewById(R.id.aa_btn);
        abtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //参数是Manifest里面action的name
                Intent intent = new Intent("zhifubao");
                sendBroadcast(intent);//无序广播
                         }
        });
    }
}

接收方:

public class Zhifubao extends BroadcastReceiver {                         
    @Override                                                             
    public void onReceive(Context context, Intent intent) {               

        Toast.makeText(context, " 喊我干嘛", Toast.LENGTH_SHORT).show();                    
        Log.e(TAG, "zhifubao" + date);                                    

    }                                                                     

}                                                                         

在Manifest中注册:


        <receiver android:name=".Zhifubao">

            <intent-filter>
                <action android:name="zhifubao"/>
            </intent-filter>
        </receiver>
动态注册的无序广播

步骤:

  • 新建类TestBroadcast继承BroadcastReceiver;
  • 实现onReceive方法;
  • 在代码中实例化TestBroadcast广播类;
  • 在代码中实例化IntentFilter。

常用方法 :

  1. IntentFilter方法:告诉安卓系统自己能够处理哪些请求;
  2. addAction:注册时设置监听动作(频道);
  3. registerReceiver:注册广播;
  4. unregisterReceiver:使用动态注册时,在程序推出前一定要调用此注销方法。

    代码演示:
    Activity发送方:

public class MainActivity extends AppCompatActivity {
    private Button abtn;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        abtn = findViewById(R.id.aa_btn);
        abtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //参数是Manifest里面action的name
                Intent intent = new Intent("zhifubao");
                //无序广播
                sendBroadcast(intent);

            }
        });
    }
}

接收方的新建类Zhifubao:

public class Zhifubao extends BroadcastReceiver {                          
    @Override                                                              
    public void onReceive(Context context, Intent intent) {                

        Toast.makeText(context, " 喊我干嘛", Toast.LENGTH_SHORT).show();       
        Log.e(TAG, "zhifubao" );                                     

    }                                                                      

}                                                                                                                                           

接收方中的Activity:

public class MainActivity extends AppCompatActivity {
    private Zhifubao zhifubao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //动态无序广播
        zhifubao=new Zhifubao();
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction("zhifubao");
        registerReceiver(zhifubao,intentFilter);
    }
        @Override  
    protected void onDestroy() {  
        super.onDestroy();  
        //解除广播
        unregisterReceiver(receiver);  
    }  
}
静态注册的有序广播

步骤:
- 新建两个类继承BroadcastReceiver;
- 实现onReceive方法;
- 在代码中实例化类;
- 在代码中实例化IntentFilter;

常用方法和标签:

  1. priorty属性:设置广播的优先级,此属性连接一个int类型,取值范围-1000-1000,如果优先级一样,最先注册的广播先接收;
  2. sendOrderedBroadcast方法:发送一个有序广播,优先级最高的广播最先接收到;
  3. setResultExtras方法:此方法在onReceive内部使用,代表继续往下一级传递有序广播;
  4. abortBroadcast方法:此方法在onReceive内部使用,如果不想继续传递,使用此方法结束广播。

    代码演示:
    Activity发送方:

public class MainActivity extends AppCompatActivity {
    private Button abtn;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        abtn = findViewById(R.id.aa_btn);
        abtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //参数是Manifest里面action的name
                Intent intent = new Intent("zhifubao");
                   // 有序广播
                sendOrderedBroadcast(intent, null);//自定义权限,有序广播
            }
        });
    }
}

接收方Zhifubao:

public class Zhifubao extends BroadcastReceiver {                                        
    @Override                                                                            
    public void onReceive(Context context, Intent intent) {                              

        Toast.makeText(context, " 喊我干嘛", Toast.LENGTH_SHORT).show();                     
        //终止广播                                                                           
        abortBroadcast();//当这个广播先收到不想让下一个收到广播,就用这个语句                                    
    }                                                                                    

在Manifest中注册:


        <receiver android:name=".Zhifubao">
            //静态有序广播用来调整顺序
            <intent-filter android:priority="1000">
                <action android:name="zhifubao"/>
            </intent-filter>
        </receiver>

接收方Meituan:

public class MainActivity extends AppCompatActivity {
    private MeiTuan meituan;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        meituan=new MeiTuan();
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction("zhifubao");
        //接收先后顺序
        intentFilter.setPriority(-1000);
        registerReceiver(meituan,intentFilter);
    }

    @Override
    protected void onDestroy() {
        //动态有序广播用来终止广播
        super.onDestroy();
        unregisterReceiver(meituan);
    }

    }

在Manifest中注册:


        <receiver android:name=".Zhifubao">
            //静态有序广播用来调整顺序
            <intent-filter android:priority="-1000">
                <action android:name="zhifubao"/>
            </intent-filter>
        </receiver>
动态注册的有序广播

步骤:
- 新建两个类继承BroadcastReceiver;
- 实现onReceive方法;
- 在代码中实例化类;
- 在代码中实例化IntentFilter;

常用方法和标签:

  1. priorty属性:设置广播的优先级,此属性连接一个int类型,取值范围-1000-1000,如果优先级一样,最先注册的广播先接收;
  2. sendOrderedBroadcast方法:发送一个有序广播,优先级最高的广播最先接收到;
  3. setResultExtras方法:此方法在onReceive内部使用,代表继续往下一级传递有序广播;
  4. abortBroadcast方法:此方法在onReceive内部使用,如果不想继续传递,使用此方法结束广播。

    代码演示:
    Activity发送方:


public class MainActivity extends AppCompatActivity {
    private Button abtn;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        abtn = findViewById(R.id.aa_btn);
        abtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //参数是Manifest里面action的name
                Intent intent = new Intent("zhifubao");
                //sendBroadcast(intent);//无序广播
                //有序广播
                sendOrderedBroadcast(intent, null);//自定义权限,有序广播
            }
        });
    }
}

接收方Activity:

public class MainActivity extends AppCompatActivity {
    private Zhifubao zhifubao;
    private Zhifubao meituan;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /**
         * 第一个接收方
         * 
         * */
        //动态无序广播
        zhifubao=new Zhifubao();
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction("zhifubao");
        //接收先后顺序
        intentFilter.setPriority(1000);
        registerReceiver(zhifubao,intentFilter);


        /**
         * 第二个个接收方
         *
         * */

        //动态无序广播
        meituan=new MeiTuan();
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction("zhifubao");
        //接收先后顺序
        intentFilter.setPriority(-1000);
        registerReceiver(meituan,intentFilter);
    }

    @Override
    protected void onDestroy() {
        //动态无序广播用来终止广播
        super.onDestroy();
        unregisterReceiver(zhifubao);
    }
}

接收方Zhifubao:

public class Zhifubao extends BroadcastReceiver {                                        
    @Override                                                                            
    public void onReceive(Context context, Intent intent) {                              

        Toast.makeText(context, " 喊我干嘛", Toast.LENGTH_SHORT).show();                     
        //终止广播                                                                           
        abortBroadcast();//当这个广播先收到不想让下一个收到广播,就用这个语句                                    
    }                                                                                    

接收方Meituan:

public class MainActivity extends AppCompatActivity {
    private MeiTuan meituan;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        meituan=new MeiTuan();
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction("zhifubao");
        //接收先后顺序
        intentFilter.setPriority(-1000);
        registerReceiver(meituan,intentFilter);
    }

    @Override
    protected void onDestroy() {
        //动态有序广播用来终止广播
        super.onDestroy();
        unregisterReceiver(meituan);
    }

    }

注意:
静态注册无序广播和动态注册无序广播区别:
静态注册:这种方式的注册是常驻型的,也就是说当应用关闭后,如果有广播信息传来,也会被系统调用而自动运行。
动态注册:不是常驻型的,也就是说广播会跟随程序的生命周期。

动态注册发送有序、无序广播的比较:

  1. 在广播动态注册时,调用InterFilter对象的setPriority方法设置优先级;
  2. 在有Context环境中通过sendOrderedBroadcast;
  3. 有序广播可以根据优先级决定广播是否继续。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值