BroadcastReceiver的使用--普通广播和有序广播

        BroadcastReceiver(广播接收器)本质上就是一个全局监听器,用于监听系统全局的广播消息,它拥有自己的进程,只要存在与之匹配的Intent被广播出来,就会被激发。值得注意的是Android8要求启动BroadcastReceiver的Intent必须是显性(设置Action和package)。

广播分为普通广播(sendBroadcast)和有序广播(sendOrderedBroadcast)。

  •  普通广播:完全异步,可以在同一时刻被所有接收者接收到。
  • 有序广播:按照预先声明的优先级依次接受Broadcast。优先级声明在<intent-filter.../>元素的          android:priority属性中,数越大优先级别越高,取值范围为-1000-1000,也可以调用                setpriority()设置优先级。级别高的可以对消息进行处理再进行发送,也可以使用                      abortBroadcast()进行终止。

系统广播(静态、动态注册)和本地广播(动态广播)。 

  1.  普通广播的使用:(静态注册)
public class MainActivity extends AppCompatActivity {
    ReceiverTest1 receiverTest1;

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

        //普通广播
        EditText editText_input = findViewById(R.id.et_test);

        Button button = findViewById(R.id.btn_test);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String content = editText_input.getText().toString();
                Intent intent = new Intent();
                intent.setAction("com.example.intent.send_msg");
                intent.setPackage("com.example.broadcastreceivertest");
                intent.putExtra(Constants.KEY_CONTENT,content);
                sendBroadcast(intent);
            }
        });
    }
}

在AndroidManifest中设置:

 <receiver android:name=".ReceiverTest1"
            android:exported="false">
            <intent-filter>
                <action android:name="com.example.intent.send_msg"/>
            </intent-filter>
        </receiver>
ReceiverTest1中的代码:
public class ReceiverTest1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String s = intent.getStringExtra(KEY_CONTENT);
        Toast.makeText(context, "ReceiverTest1"+s, Toast.LENGTH_SHORT).show();
        setResultExtras(bundle);
    }
}

运行结果如下:

2. 有序广播的使用:(静态注册)

将上述普通广播中sendBroadcast()方法,改成sendOrderedBroadcast()方法即可。

在AndroidManifest中设置:

   <receiver android:name=".ReceiverTest1"
            android:exported="false">
            <intent-filter android:priority="20">
                <action android:name="com.example.intent.send_msg"/>
            </intent-filter>
        </receiver>

        <receiver android:name=".ReceiverTest2"
            android:exported="false">
            <intent-filter android:priority="0">
                <action android:name="com.example.intent.send_msg"/>
            </intent-filter>
        </receiver>

ReceiverTest1中的代码:

public class ReceiverTest1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String s = intent.getStringExtra(KEY_CONTENT);
        Bundle bundle = new Bundle();
        bundle.putString("first","放假了!");
        Toast.makeText(context, "ReceiverTest1"+s, Toast.LENGTH_SHORT).show();
        setResultExtras(bundle);
    }
}

 ReceiverTest2中的代码:

public class ReceiverTest2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String s = intent.getStringExtra(KEY_CONTENT);
        Bundle bundle = getResultExtras(true);
        String b = bundle.getString("first");
        Toast.makeText(context, "ReceiverTest2"+s+b, Toast.LENGTH_SHORT).show();
    }
}

运行结果如下:

3.动态广播

java文件:

   //动态广播
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                IntentFilter intentFilter = new IntentFilter();
                intentFilter.addAction("com.example.SEND_MSG");
                MessageReceiver receiverTest1 = new MessageReceiver();
                registerReceiver(receiverTest1,intentFilter);

                String content = editText_input.getText().toString();

                Intent intent=new Intent("com.example.SEND_MSG");
                intent.putExtra("message",content);
                sendBroadcast(intent);
            }
        });

动态注册需要在onDestory里面注销:

 @Override
    protected void onDestroy() {
        super.onDestroy();
        if(receiverTest1 != null){
            this.unregisterReceiver(receiverTest1);
        }
    }
MessageReceiver中的内容:
public class MessageReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Toast.makeText(context, "hahah"+action, Toast.LENGTH_SHORT).show();
        String content = intent.getStringExtra("message");
        Toast.makeText(context, "xixixi"+content, Toast.LENGTH_SHORT).show();

    }


}

AndroidManifest中注册的内容:

 <receiver android:name=".MessageReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="com.example.SEND_MSG"/>
            </intent-filter>
        </receiver>

运行结果如下:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值