Android四大组件之广播

来源:互联网 发布:下软件赚钱的软件 编辑:程序博客网 时间:2024/06/04 20:10

Android四大组件之广播(四大组件:广播、活动、服务、内容提供者)

分类:广播主要有有序广播、标准广播
标准广播:广播一发出,所有广播接收者同时能够收到。
有序广播:广播由优先级高到低一级级接收,高优先级的广播接收者可以截断广播信号,不再发送到第一级的广播的接收者。
系统广播(有序广播):系统自带的广播,例如无网络链接时会发出一条无网络链接信号,电量低系统会发出一条电量低的广播信号等。

基本使用:
发送广播:
通过Intent发起一条广播消息,用setAction发送发出一个广播标识,如果广播接收者注册了该广播,将接收到此广播发送者发出的广播消息。使用put…系列函数来传递广播信息。最后调用sendBroadcast和sendOrderedBroadcast来发送一条标准广播或者有序广播。如下

//发送广播Intent intent = new Intent();intent.setAction("android.intent.action.MAIN");intent.putExtra("title","broadcast");//sendBroadcast(intent);//发送普通广播sendOrderedBroadcast(intent,null);//发送有序广播

接收广播:
接收广播的注册有动态(代码方式)和静态注册(配置文件)。如下自定义一个广播接收者myReceiver继承BroadcastReceiver,重写onReceive处理广播发来的消息。

public class myReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        String reStr = intent.getStringExtra("title");        Log.e("tag","myReceiver 接收消息: "+reStr);        abortBroadcast();//在配置文件的优先级高先收到广播消息,在这里终止广播,其他优先级低的接受者接收不到消息。    }}

静态注册方式:在配置文件中申明一个receiver,如果使用有序广播,则用priority指定广播接收者的优先级,数量越大优先级越高,范围为-1000到1000,接下来的

<receiver android:name=".myReceiver">            <intent-filter android:priority="900">                <action android:name="android.intent.action.MAIN"/>            </intent-filter></receiver>

动态注册方式:
在任何初始化区域中调用广播接收注册代码,注意注册后再销毁activity时需要调用unregisterReceiver以免造成内存泄漏。

    @Override    protected void onResume() {        super.onResume();        IntentFilter filter = new IntentFilter("android.intent.action.MAIN");        receiver = new myReceiver();        registerReceiver(receiver,filter);    }    @Override    protected void onDestroy() {        super.onDestroy();        unregisterReceiver(receiver);    }

1、标准广播使用:
用此类广播时,发出一条广播,所有的广播接收者将同时收到,效率是最高的。这里使用定义两个接收者和一个发送者,当发送者发出一条广播时,两个广播接收者同时接收到广播。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {    Button sendBtn;    myReceiver receiver;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        sendBtn = (Button) findViewById(R.id.sendBtn);        sendBtn.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()){            case R.id.sendBtn:                //发送广播                Intent intent = new Intent();                intent.setAction("android.intent.action.MAIN");                intent.putExtra("title","broadcast");                sendBroadcast(intent);//发送普通广播                //sendOrderedBroadcast(intent,null);//发送有序广播                break;            default:                break;        }    }}

两个广播接收者:

public class receiver1 extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        String str = intent.getStringExtra("title");        Log.e("tag","receiver1 接收到: "+str);        //abortBroadcast();    }}
public class sysReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Toast.makeText(context,"无网络连接",Toast.LENGTH_LONG).show();        Log.e("tag","*******系统广播********");    }}

注册广播:

<receiver android:name=".myReceiver">            <intent-filter android:priority="900">                <action android:name="android.intent.action.MAIN"/>            </intent-filter>        </receiver><receiver android:name=".receiver1">            <intent-filter android:priority="800">                <action android:name="android.intent.action.MAIN"/>            </intent-filter>        </receiver>

结果:
这里写图片描述

2、有序广播:
用动态注册方式注册myReceiver接收广播。用静态注册方式注册receiver接受广播

public class MainActivity extends AppCompatActivity implements View.OnClickListener {    Button sendBtn;    myReceiver receiver;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        sendBtn = (Button) findViewById(R.id.sendBtn);        sendBtn.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()){            case R.id.sendBtn:                //发送广播                Intent intent = new Intent();                intent.setAction("android.intent.action.MAIN");                intent.putExtra("title","broadcast");                sendOrderedBroadcast(intent,null);//发送有序广播                break;            default:                break;        }    }    @Override    protected void onResume() {        super.onResume();        IntentFilter filter = new IntentFilter("android.intent.action.MAIN");//注册广播        filter.setPriority(900);//设置优先级        receiver = new myReceiver();        registerReceiver(receiver,filter);    }    @Override    protected void onDestroy() {        super.onDestroy();        unregisterReceiver(receiver);    }}

两个接收者:
myReceiver 终止广播信息的向下传播。

public class myReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        String reStr = intent.getStringExtra("title");        Log.e("tag","myReceiver 接收消息: "+reStr);        abortBroadcast();//在配置文件的优先级高先收到广播消息,在这里终止广播,其他优先级低的接受者接收不到消息。    }}public class receiver1 extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        String str = intent.getStringExtra("title");        Log.e("tag","receiver1 接收到: "+str);    }}

由于myReceiver 900比receiver1 的优先级800高,在接收广播时,receiver1 将将接收不到广播,被myReceiver 截断。
这里写图片描述

3、补充:
广播接收者还可以接收来系统发出的广播,例如手机收到短信时会发出一条接收到短信的信号,我们可以注册一个接收者来接收广播,由于该广播是有序的,我们可以截断该广播等操作。

public class sysReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Toast.makeText(context,"无网络连接",Toast.LENGTH_LONG).show();        Log.e("tag","*******系统广播********");    }}

还有一种广播是本地广播:标准广播和有序广播都是系统全局广播,可以被其他任何程序接收到,本地程序一些敏感的数据可能会被窃取显得不安全或者其他程序向本程序不停的发送一些垃圾等。为解决安全性问题特别引入了本地广播。本地广播用LocalBroadcaseManager来进行管理,并提供发送广播和注册广播接收器的方法。
获取实例后进行注册。

localBroadcastManager = LocalBroadcastManager.getInstance(this);//获取实例IntentFilter intentFilter = new IntentFilter();intentFilter.addAction("android.intent.action.MAIN");localR = new localReceiver();localBroadcastManager.registerReceiver(localR,intentFilter);

按钮localBtn触发本地广播发送。

case R.id.localBtn:Intent intent1 = new Intent("android.intent.action.MAIN");localBroadcastManager.sendBroadcast(intent1);

接收器

public class localReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Log.e("tag","local receiver : ");    }}

这里写图片描述

注意:广播接收者重写onReceive方法里,不能执行耗时的动作,该方法规定最长时间为10s,运行在UI线程中。如果要执行耗时动作,可开启一个服务来处理。

最后附上项目测试代码:

http://download.csdn.net/download/tang_vincent/9951659

原创粉丝点击