Android的广播(BroadcastReceiver)

来源:互联网 发布:linux制作iso镜像 编辑:程序博客网 时间:2024/05/16 06:50

1.BroadcastReceiver简介

BroadcastReceiver用于接受程序(包括开发的程序和系统程序)所发出的广播,与应用程序启动Activity、Service相同的是,程序启动BroadcastReceiver也只需要两步

  • 创建需要启动BroadcastReceiver的Intent
  • 调用Contxt的sendBroadcast()或者sendOrderBroadcast()方法来启动指定的BroadcastReceiver

普通广播

sendBroadcast()用于发送普通广播

首先,定义广播MyReceiver.java

package com.zhoujian.broadcastreceiver.receiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;/** * Created by zhoujian on 2016/12/27. */public class MyReceiver extends BroadcastReceiver{    private String mMsg;    @Override    public void onReceive(Context context, Intent intent)    {        //注意此方法内部不能做耗时操作,容易引起ANR        if (intent.getAction().equals("zhoujian.define.broadastreceiver"))        {            mMsg = intent.getStringExtra("msg");            Toast.makeText(context, mMsg, Toast.LENGTH_SHORT).show();        }    }}

其次,在清单文件中静态注册广播

    <receiver android:name=".receiver.MyReceiver">            <intent-filter>                <!--指定广播所响应的Action-->                <action android:name="zhoujian.define.broadastreceiver"/>            </intent-filter>    </receiver>

最后,发送广播

package com.zhoujian.broadcastreceiver.activity;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import com.zhoujian.broadcastreceiver.R;import butterknife.ButterKnife;import butterknife.InjectView;public class MainActivity extends AppCompatActivity {    @InjectView(R.id.bt_send)    Button mBtSend;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ButterKnife.inject(this);        clickEvent();    }    private void clickEvent()    {        mBtSend.setOnClickListener(new View.OnClickListener()        {            @Override            public void onClick(View v)            {                Intent intent = new Intent();                //设置Action                intent.setAction("zhoujian.define.broadastreceiver");                intent.putExtra("msg","广播来啦!");                //发送广播                sendBroadcast(intent);            }        });    }}

运行截图:

这里写图片描述

有序广播

对于有序广播,系统会根据优先级别顺序逐个执行接受者,优先接受到广播的接受者可以终止广播,如果前面的广播终止了,后面就无法收到广播了。优先收到广播的接受者可以通过setResaultExtras(Bundle)方法将处理结果放入广播中,然后传递给下一个接受者。

首先,定义广播MyReceiver.java和SecondReceiver.java

package com.zhoujian.broadcastreceiver.receiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.widget.Toast;/** * Created by zhoujian on 2016/12/27. */public class MyReceiver extends BroadcastReceiver{    private String mMsg;    @Override    public void onReceive(Context context, Intent intent)    {        //注意此方法内部不能做耗时操作,容易引起ANR        if (intent.getAction().equals("zhoujian.define.broadastreceiver"))        {            mMsg = intent.getStringExtra("msg");            Toast.makeText(context, mMsg, Toast.LENGTH_SHORT).show();            Bundle bundle = new Bundle();            bundle.putString("message","我是第一个广播存入的消息");            setResultExtras(bundle);        }    }}
package com.zhoujian.broadcastreceiver.receiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.widget.Toast;/** * Created by zhoujian on 2016/12/27. */public class SecondReceiver extends BroadcastReceiver{    private String mMsg;    @Override    public void onReceive(Context context, Intent intent)    {        //注意此方法内部不能做耗时操作,容易引起ANR        if (intent.getAction().equals("zhoujian.define.broadastreceiver"))        {            Bundle bundle = getResultExtras(true);            mMsg = bundle.getString("message");            Toast.makeText(context, mMsg, Toast.LENGTH_SHORT).show();        }    }}

其次,在清单文件中静态注册广播

        <receiver android:name=".receiver.MyReceiver">            <!--指定广播的优先级 范围是-1000到1000-->            <intent-filter android:priority="200">                <!--指定广播所响应的Action-->                <action android:name="zhoujian.define.broadastreceiver"/>            </intent-filter>        </receiver>        <receiver android:name=".receiver.SecondReceiver">            <!--指定广播的优先级 范围是-1000到1000-->            <intent-filter android:priority="100">                <!--指定广播所响应的Action-->                <action android:name="zhoujian.define.broadastreceiver"/>            </intent-filter>        </receiver>

最后,发送广播

package com.zhoujian.broadcastreceiver.activity;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import com.zhoujian.broadcastreceiver.R;import butterknife.ButterKnife;import butterknife.InjectView;public class MainActivity extends AppCompatActivity {    @InjectView(R.id.bt_send)    Button mBtSend;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ButterKnife.inject(this);        clickEvent();    }    private void clickEvent()    {        mBtSend.setOnClickListener(new View.OnClickListener()        {            @Override            public void onClick(View v)            {                Intent intent = new Intent();                //设置Action                intent.setAction("zhoujian.define.broadastreceiver");                intent.putExtra("msg","广播来啦!");                //发送有序广播                sendOrderedBroadcast(intent,null);            }        });    }}

运行截图:

这里写图片描述

2.源码下载

源码下载:https://github.com/zeke123/BroadcastReceiver

0 0
原创粉丝点击