首页投稿(暂停使用,暂停投稿)程序员Android开发

自定义发送广播

2016-05-07  本文已影响877人  大话程序

广播主要分为两种类型:标准广播(完全异步执行的广播)和有序广播(完全同步执行的广播)。我们也可以根据广播是否可以跨进程接收,将广播分为:系统全局广播和本地广播

发送系统全局广播


//构建一个Intent对象,传入要传递的广播
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
//调用sendBroadcast方法发送出标准广播
sendBroadcast(intent);
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
//发送有序广播,第二个参数是与权限相关的字符串,传入null即可
sendOrderedBroadcast(intent, null);

发送有序广播时,进程接收广播是有顺序的,并且可以劫持广播,设置广播接收优先级:在配置文件中配置<receiver>标签时,给<intent-filter>标签添加属性"android:priority="xxx"",实现拦截广播,调用方法:abortBroadcast()

发送本地广播


发送本地广播主要使用LocalBroadcastManager来对广播进行管理,并提供了发送广播和注册广播接收器的方法

代码实现:

public class MainActivity extends Activity {
    
    private IntentFilter intentFilter;
    
    private LocalReceive localReceive;
    
    private LocalBroadcastManager localBroadcastManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取到LocalBroadcastManager实例对象
        localBroadcastManager = LocalBroadcastManager.getInstance(this);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                //创建Intent对象,指定广播内容
                Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
                //发送本地广播
                localBroadcastManager.sendBroadcast(intent);
            }
        });
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
        localReceive = new LocalReceive();
        //注册本地广播接收器
        localBroadcastManager.registerReceiver(localReceive, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //动态注册,同样需要取消注册广播
        localBroadcastManager.unregisterReceiver(localReceive);
    }
    
    class LocalReceive extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();
        }
        
    }

}

本地广播是无法通过静态注册的方式来接收的,因为静态注册主要就是为了让程序在未启动的情况下也能收到广播,而发送本地广播时,我们的程序肯定已经启动了

上一篇下一篇

猜你喜欢

热点阅读