Android学习笔记-广播机制

广播机制

广播接收器(Broadcast Receiver)

  • 标准广播:是一种完全异步执行的广播,广播一旦发送,所以广播接收器都会立刻同时接收到这条广播
    • 完全异步
    • 效率高
    • 没有先后顺序,无法截断
  • 有序广播:是一种同步执行的广播,广播发出后,同一时间只有一个广播接收器能够接收到这条广播信息,然后执行,然后继续传播
    • 同步执行
    • 效率不高
    • 有先后顺序,可以截断正在传递的广播

接收系统广播

动态注册监听网络变化
  • 定义一个内部类NetworkChangeReceiver,这个类继承自BroadcastReceiver的,并重写onReceive()方法
class NatworkChangeReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();
        }
    }
  • 在onCreate()方法,首先先创建一个IntentFilter的实例,添加action,再创建NatworkChangeReceiver实例,最后调用registerReceiver()方法进行注册
    private IntentFilter intentFilter;
    private NatworkChangeReceiver natworkChangeReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        natworkChangeReceiver = new NatworkChangeReceiver();
        registerReceiver(natworkChangeReceiver,intentFilter);
    }
  • 记得,动态注册的广播接收器一定都要取消注册才行,这里我们是在onDestroy()方法调用unregisterReceiver()方法
静态注册实现开机启动
public class BootCompleteReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Boot Complete", Toast.LENGTH_SHORT).show();
    }
}
  • 需要在AndroidManifest.xml将广播接收器的类名注册进去。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

.....

<receiver android:name=".BootCompleteReceiver">
  <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED"/>
  </intent-filter>
</receiver>

发送标准广播

  • 接收自定义的广播
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
    }
}
  • 在AndroidManifest.xml中对这个广播接收器进行注册
        <receiver android:name=".MyBroadcastReceiver">
            <intent-filter>
                <action android:name="com.example.broadcasttest.MY_BROADCAST"/>
            </intent-filter>
        </receiver>
  • 利用按键监听去触发发送自定义广播
 Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
                sendBroadcast(intent);
            }
        });

发送有序广播

Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
                //sendBroadcast(intent); 标准广播
                sendOrderedBroadcast(intent,null);//有序广播
            }
        });
  • 添加优先值
         <receiver android:name=".MyBroadcastReceiver">
            <intent-filter android:priority="100">
                <action android:name="com.example.broadcasttest.MY_BROADCAST"/>
            </intent-filter>
        </receiver>
  • 截断广播
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
        abortBroadcast();//截断广播
    }
}

使用本地广播

  • 获取LocalBroadcastManager实例
localBroadcastManager = LocalBroadcastManager.getInstance(this);//获取实例
......

 class LocalReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();
        }
    }
  • 注册本地广播监听器
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example,broadcasttest.LOCAL_BROADCAST");

        localReceiver = new LocalReceiver();
        localBroadcastManager.registerReceiver(localReceiver,intentFilter);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent("com.example,broadcasttest.LOCAL_BROADCAST");
                localBroadcastManager.sendBroadcast(intent);//发送本地广播
            }
        });
  • 取消注册
      localBroadcastManager.unregisterReceiver(localReceiver);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值