基础三:BroadcastReceiver

broadcast receiver–广播接收器,接受全局的广播。


根据广播的种类分为系统广播和自定义广播。

  • 系统广播:电池消耗情况,开关机。一般系统广播为有序广播
  • 自定义广播:自己定义一个广播。
    根据广播的传播方式分为:普通广播和有序广播(orderedBroadcast)
  • 普通广播:异步执行,当一个broadcast发出后,所有与之匹配的broadcast都会同时接收到广播。
  • 有序广播:同步执行,会根据之前设置的优先级有序的执行,优先级高的接收器可以截断广播,从而停止广播的传送,传说中的短信电话拦截就是用的这个原理。
    根据广播的注册方式分为静态注册和动态注册。
  • 静态注册:在AndroidManifest中进行注册,广播会一直存在除非退出app。一般多用于系统广播注册。
  • 动态注册:在类中通过context.registerBroadcast()进行注册,可以通过onResume()注册,onPause()注销。
    广播的发送方式:

  • sendBroadcast(intent);

  • sendOrderedBroadcast(intent);–发送有序广播

onReceiver方法–当接收器接收到传递的广播时会调用onreiver方法,但是BroadcastReceiver的周期在onReceiver结束后结束,而且onReceiver是运行在主线程中的,如果需要执行耗时程序,需要开启service,创建新线程。


以下就通过代码来运用广播的注册与发送。

  • 静态注册广播
    <receiver android:name=".broadcast.MyReceiver" >
            <intent-filter>
                <action android:name="android.action.test" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.action.dynamic.test"/>
            </intent-filter>
        </receiver>

    @OnClick(R.id.send_broadcast)
    void sendBroad() {
        Intent intent = new Intent().setAction("android.action.test");
        intent.putExtra("broad","register broadcast");
        sendBroadcast(intent);
    }
  • 动态注册广播
    @Override
    protected void onResume() {
        Log.i(TAG, "onResume");
        super.onResume();
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction("android.action.dynamic.test");
        registerReceiver(new MyReceiver(), intentFilter);
    }

    @Override
    protected void onPause() {
        Log.i(TAG, "onPause");
        super.onPause();
        unregisterReceiver(new MyReceiver());
    }
    @OnClick(R.id.send_dynemic_broadcast)
    void sendDynemicBroad(){
        Intent intent =new Intent().setAction("android.action.dynamic.test");
        intent.putExtra("broad","dynamic reggister broadcast");
        sendBroadcast(intent);
    }

继承BroadcaReceiver的类,调用onReceiver方法。

public class MyReceiver extends BroadcastReceiver {
    public MyReceiver() {
    }

    //    不能执行超过5秒的任务,可以用service,关于context,若是静态注册,则context为系统context,若动态注册,则context为注册的那个类
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        if (**intent.getAction().equals("android.action.dynamic.test")**){
            DebugLog.i("broad"+intent.getStringExtra("broad"));
            Toast.makeText(context,intent.getStringExtra("broad"),Toast.LENGTH_SHORT).show();
        }else if (intent.getAction().equals("android.action.test")){
            DebugLog.i("dynamicBroad"+intent.getStringExtra("broad"));
            Toast.makeText(context,intent.getStringExtra("broad"),Toast.LENGTH_SHORT).show();
        }
        Log.i("MyReceive", "onReceive" + intent.getAction());
    }
}

receiver


上图图片就是静态注册和动态注册后执行的方法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值