广播接收器BroadcastReceiver

BroadcastReceiver用于接收程序所发出的Broadcast Intent。程序启动BroadcastReceiver也只需要两步:
(1)创建需要启动的BroadcastReceiver的Intent
(2)调用Context的sendBroadcast()或者sendOrderedBroadcast()方法来启动指定的BroadcastReceiver。
当应用程序发出一个Broadcast Intent之后,所有匹配该Intent的BroadcastReceiver都有可能被启动。
BroadcastReceiver本质上属于一个系统级别的监听器,因此实现BroadcastRTeceiver的方法是:重写BroadcastReceiver的onReceive(Context context,Intent intent)方法注意的是,onReceive()方法不能在10秒内执行完成,Android会认为该程序无法响应,因此不要在onReceive()方法中执行耗时的操作。

简单的Demo

public class MainActivity extends AppCompatActivity {
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendBroadcast();
            }
        });
    }
    private void sendBroadcast(){
        Intent intent = new Intent();
        intent.setAction("hahaha");
        intent.setPackage("com.example.zhaol.mybroadcastreceivr");
        intent.putExtra("msg","简单的消息");
        sendBroadcast(intent);
    }
}

MyReceiver

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

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Toast.makeText(context,"接收到的消息的Action"+intent.getAction()+"接收到的消息"
                +intent.getStringExtra("msg"),Toast.LENGTH_SHORT).show();
    }
}

AndroidMainfest.xml

 <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="hahaha"/>
            </intent-filter>
        </receiver>

有序广播

Broadcast被分为两种:
(1)普通广播:完全异步的,可以同时被所有接收者接收到,效率高,但是缺点是不能处理结果传递到下一个接收者,并且无法终止Broadcast Intent的传播。
(2)有序广播:按照优先级来接收,通过元素的android:priority属性中,数越大优先级越高。也可以调用IntentFilter对象的setPriority()方法来设置。
两种方式发送广播;sendBroadcast()发送普通广播
sendOrderedBroadcast():发送有序广播,优先级高的可以调用BroadcastReceiver的abordBroadcast()方法终止Broadcast.
而且有序广播中优先接收到Broadcast的接收者可以通过setResultExtras(Bundle)方法奖处理结果存入到Broadcast中,然后传给下一个广播接收者,下一个接收者可以通过Bundle bundle = getResultExtras(true)得到上一个接收者存入的数据。
Mainactivity

  private void sendBroadcast(){
        Intent intent = new Intent();
        intent.setAction("hahaha");
        intent.setPackage("com.example.zhaol.mybroadcastreceivr");
        intent.putExtra("msg","简单的消息");
        sendOrderedBroadcast(intent,null);
    }

AndroidMainfest.xml

<receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:priority="20">
                <action android:name="hahaha" />
            </intent-filter>
        </receiver>
        <receiver
            android:name=".MyReceiver2"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:priority="0">
                <action android:name="hahaha"/>
            </intent-filter>
        </receiver>

MyReceiver

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

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Toast.makeText(context,"接收到的消息的Action"+intent.getAction()+"接收到的消息"
                +intent.getStringExtra("msg"),Toast.LENGTH_SHORT).show();
        Bundle bundle = new Bundle();
        bundle.putString("haha","第一个Broadcast存入的数据");
        setResultExtras(bundle);
       // abortBroadcast();//取消广播
    }
}

MyReceiver2

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

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Bundle bundle = getResultExtras(true);
        String first = bundle.getString("haha");
        Toast.makeText(context,""+first,Toast.LENGTH_SHORT).show();
    }
}

两种方式注册广播
(1)如上Demo,在AndroidMainfest.xml中
(2)

	IntentFilter intent  = new IntentFilter();
	intent.setAction("xxx");
	MyReceiver myReceiver = new MyReceiver();
	registerReceiver(myReceiver , intent);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值