【Android】BoardcastReceiver简介

一. 广播接收器的两种注册方法

1. 静态注册

在 AndroidManifest.xml 中注册,这种注册方法只要 APP 安装了,广播接收器就会一直存在。

<receiver android:name=".MyReceiver">
    <intent-filter>
        <action android:name="com.geek99.MY_BR"/>
    </intent-filter>
</receiver>

在代码中如何接收和发送广播

// 广播接收器
public class MyReceiver extends BroadcastReceiver {
    // 接收广播
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"消息来啦!",Toast.LENGTH_SHORT).show();
    }
}

// Activity 发送广播
public class MainActivity extends AppCompatActivity {

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

    // 静态注册,发送广播
    public void send(View view) {
       // Intent intent = new Intent(this, MyReceiver.class);
        Intent intent = new Intent("com.geek99.MY_BR");
        sendBroadcast(intent);
    }
}

2. 动态注册

动态注册不用在 AndroidManifest.xml 中注册广播接收器,而是在代码里面当创建 Activity 创建和注册广播接收器。

// 广播接收器类
public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"消息来啦!",Toast.LENGTH_SHORT).show();
    }
}

// Activity 动态注册广播接收器,发送广播
public class MainActivity extends AppCompatActivity {

    MyReceiver mMyReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mMyReceiver = new MyReceiver();
    }

    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.geek99.MY_BR");
        // 注册广播接收器
        registerReceiver(mMyReceiver,filter);
    }

    // 一个 Button 的回调函数,发送广播
    public void send2(View view) {
        Intent intent = new Intent("com.geek99.MY_BR");
        sendBroadcast(intent);
    }

    @Override
    protected void onStop() {
        super.onStop();
        // Activity 停止时,注销广播接收器
        unregisterReceiver(mMyReceiver);
    }
}

二. 有序广播

在 AndroidManifest.xml 中注册广播接收器时,可以在 android:priority 声明优化级,数字值越大,优化级越高。如下例子,两个广播接收器的 action 是相同的,action 相同的广播,可以用同个 intent 同时 send 出去,但优化级高的会先在 reciever 收到。

<receiver android:name=".MyReceiver">
    <intent-filter android:priority="100">
        <action android:name="com.geek99.MY_BR"/>
    </intent-filter>
</receiver>

<receiver android:name=".MyReceiver2">
    <intent-filter android:priority="1000">
        <action android:name="com.geek99.MY_BR"/>
    </intent-filter>
</receiver>
// receiver1
public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "我第一个收到消息!", Toast.LENGTH_SHORT).show();
    }
}

// receiver2
public class MyReceiver2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "我第二个收到消息!", Toast.LENGTH_SHORT).show();
        this.abortBroadcast();
    }
}

// 如上两个 Receiver,在 AndroidManifest.xml 中注册优化级高的,会先收到广播,Toast 会先打印

三. 系统广播

在 Android 系统某些事件发生时,会收到一些广播。

https://developer.android.com/reference/android/content/Intenthttps://developer.android.com/reference/android/content/Intent

 在 AndroidManifest.xml 中注册广播接收器,接收 action 为 "android.intent.action.TIME_SET" 的系统广播。

<receiver android:name=".MyReceiver">
    <intent-filter>
        <action android:name="android.intent.action.TIME_SET"/>
    </intent-filter>
</receiver>
// 广播接收器
public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "时间更改了!", Toast.LENGTH_SHORT).show();
    }
}

public class MainActivity extends AppCompatActivity {

    MyReceiver r;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        r  = new MyReceiver();
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 过滤 Intent,接收广播
        IntentFilter f = new IntentFilter();
        f.addAction(Intent.ACTION_TIME_CHANGED);
        registerReceiver(r,f);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值