自定义广播

安卓允许用户发送自定义广播(broadcast),满足接收条件的接收器(receiver)就可以接受自定义广播。

发送自定义广播

自定义广播分为标准(无序)自定义广播以及有序自定义广播:

sendBroadcast(Intent intent); //发送标准自定义广播
sendOrderedBroadcast(Intent, null); //发送有序自定义广播

标准自定义广播是任何满足条件的接收器都可以接受。
有序自定义广播的第二个参数是接受权限,一般为null。有序广播接收器可以设置接收优先级priority,优先级高的先收到广播,并且可以设置截断广播,这样之后的接收器就无法接受广播。

接受自定义广播

接受自定义广播一般使用静态接受,即在AndroidManifest.xml中注册接收器,这样应用即使未运行,也可以响应广播:


    ......
    
        ......
        
            
                
            
        
        ......
    

示例

我们新建2个工程:BroadcastTest1和BroadcastTest2。BoardcastTest1的主活动中添加一个按钮发送自定义的广播"Example.MY_Broadcast",然后两个工程中都添加接收器用来接收这个广播,接收后弹出toast通知。项目1的toast要比项目2的先提示。
先来写项目1发送广播,发送广播要利用Intent类的实例,如下:

//BroadcastTest1.MainActivity: 项目1的主活动发送广播
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ... ...
        Button button =(Button)findViewById(R.id.button_broadcast);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("Example.MY_BROADCAST");
                sendOrderedBroadcast(intent, null);
            }
        });
        ... ...
    }
}

第一个项目的接收器类,继承BroadcastReceiver并重写其中的onReceive()方法,这个方法就是接收器接收到广播后要执行的,注意的是不要写太多内容,如果onReceive()方法执行时间过长会报错:

//BroadcastTest1.MyBroadcastReceiver:项目1的接收器类
public class MyBoardcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "BroadcastTest1:Example.MY_BROADCAST", Toast.LENGTH_LONG).show;
    }
}

之后要在项目1的主配置文件中注册接收器,并设置优先级为100:



    
        ......
        
            
                
            
        
        ......
    

接下来写项目2的接收器,基本上与项目1相同,不过我们不设置优先级,这样一定会先提示项目1的toast。如下:

//BroadcastTest2.MyBroadcastReceiver:项目2的接收器类
public class MyBoardcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "BroadcastTest2:Example.MY_BROADCAST", Toast.LENGTH_LONG).show;
    }
}


    
        ......
        
            
                
            
        
        ......
    

编译下两个工程测试吧,项目中其他的部分请自行完善。另外,一些非原生安卓ROM实现静态接受广播需要给应用“自动运行”权限。

关于截断广播

截断广播在接收器类中使用abortBroadcast()方法,我们修改项目1的接收器类,加上这个方法:

//BroadcastTest1.MyBroadcastReceiver:项目1的接收器类
public class MyBoardcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "BroadcastTest1:Example.MY_BROADCAST", Toast.LENGTH_LONG).show;
        abortBroadcast();
    }
}

再次编译项目1测试,这次只有项目1的toast通知,没有项目2的toast通知。

你可能感兴趣的:(自定义广播)