码迷,mamicode.com
首页 > 其他好文 > 详细

Broadcast Receiver基本使用

时间:2017-02-09 17:45:04      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:好处   final   ota   ext   length   static   字符串   参数   传递   

Broadcast Receiver介绍

Broadcast Receiver翻译成中文叫“广播接收器”,所以它的作用是用来接收发送过来的广播的。

Android应用程序可以发送或接收来自Android系统和其他Android应用程序的广播消息,类似于发布订阅设计模式。当有兴趣的事件发生时发送这些广播。例如,Android系统在各种系统事件发生时发送广播,例如当系统启动或设备开始充电时。应用程序也可以发送自定义广播,例如,通知其他应用程序的东西,他们可能感兴趣(例如,一些新的数据已被下载)。应用程序可以注册接收特定的广播。当发送广播时,系统自动将广播路由到订阅该特定类型广播的应用程序。
一般来说,广播可以作为跨应用程序和正常用户流之外的消息传递系统。

动态注册广播

动态注册广播是一种灵活的注册方式,通过代码来注册广播,销毁广播。

首先我们新建DynamicBroadcast类,继承自BroadcastReceiver,用来接收广播,重写onReceive方法,通过intent可以获取发送广播时传入的参数。

public class DynamicBroadcast extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent){
        String data = intent.getStringExtra("data");
        Log.i("data",data);
    }
}

在activity_main.xml文件中增加一个按钮

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <Button
        android:id="@+id/btn_dynamic_broadcast_send_message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="给动态注册的广播发送消息"/>
</LinearLayout>

最后我们下来看MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    public static final String ACTION_DYNAMIC_BROADCAST="android.intent.action.DYNAMIC_BROADCAST";
    private DynamicBroadcast dynamicBroadcast;

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

        findViewById(R.id.btn_dynamic_broadcast_send_message).setOnClickListener(this);

        //动态注册广播
        dynamicBroadcast=new DynamicBroadcast();
        IntentFilter intentFilter=new IntentFilter(ACTION_DYNAMIC_BROADCAST);
        registerReceiver(dynamicBroadcast,intentFilter);
    }

    @Override
    public void onClick(View v){
        switch (v.getId()){
            case R.id.btn_dynamic_broadcast_send_message:
                Intent intent = new Intent(ACTION_DYNAMIC_BROADCAST);
                intent.putExtra("data","Dynamic Broadcast Parameter");//通过intent传参
                sendBroadcast(intent);//发送广播消息
                break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("MainActivity onDestroy","销毁广播");
        unregisterReceiver(dynamicBroadcast);
    }
}

我们在onCreate中通过registerReceiver方法注册一个广播,需要两个参数(BroadcastReceiver跟IntentFilter对象)。同时给”发送广播”按钮设置点击监听,点击之后通过sendBroadcast方法发送广播,这里需要一个Intent对象,构造Intent对象的时候传入Action,这个Action跟我们注册广播的时候Action要一致。

我们还重写了onDestroy方法,当Activity销毁的时候同时销毁广播,所以,在本例中,广播的生命周期跟Activity一样。

我们运行代码,点击”给动态注册的广播发送消息”按钮,Log打印如下:

02-03 16:32:11.194 7095-7095/com.ansen.broadcastreceiver I/data: Dynamic Broadcast Parameter

静态注册广播

静态注册广播是在AndroidManifest.xml文件中注册的,无论这个程序是否启动,当收到广播时,都会接收的到。

我们在动态注册广播的Demo上增加代码,新建StaticBroadcast类,继承BroadcastReceiver,实现onReceive方法,跟动态广播的接收器代码几乎一样。

public class StaticBroadcast extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent){
        String data = intent.getStringExtra("data");
        Log.i("data",data);
    }
}

接下来我们需要在AndroidManifest.xml文件中注册这个广播,通过receiver标签的name属性指定这个类,再增加intent-filter标签,给action标签设置name属性值,我们发送广播的时候需要用到这个值。

<receiver android:name=".StaticBroadcast" android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.STATIC_BROADCAST"/>
    </intent-filter>
</receiver>

在activity_main.xml文件中增加一个按钮,”给静态注册的广播发送消息”。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <Button
        android:id="@+id/btn_dynamic_broadcast_send_message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="给动态注册的广播发送消息"/>
    <Button
        android:id="@+id/btn_static_broadcast_send_message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="给静态注册的广播发送消息"/>
</LinearLayout>

给按钮设置点击监听事件,在对应的onClick回掉方法中发送广播,我们看到Intent的构造方法有传入一个字符串,这个值跟我们在xml中receiver标签->intent-filter->action的name属性的值必须要一致。在广播底层源码中就是通过action来区分不同的广播接收者。

Intent staticIntent = new Intent("android.intent.action.STATIC_BROADCAST");
staticIntent.putExtra("data","Static Broadcast Parameter");//通过intent传参
sendBroadcast(staticIntent);//发送广播消息

因为没有增加很多代码,MainActivity的代码就不全部贴出来了,重新运行代码,点击“给静态注册的广播发送消息”按钮,打印的log如下:

02-06 14:02:38.735 10749-10749/com.ansen.broadcastreceiver I/data: Static Broadcast Parameter

广播基本总结

动态注册广播跟静态注册广播区别

前面我们写了Demo,也介绍了动态注册广播跟静态注册广播,这里我再来总结一下:
- 动态注册 广播的生命周期自己灵活控制,消耗资源少。
- 静态注册 广播一直存在,除非软件卸载。消耗资源稍微大一些。当然现在的手机硬件都跟的上了,这点资源可以忽略不计。

广播注意事项

我们都知道收到了广播就会执行onReceive方法,但是在这个方法里面不能做耗时超过10秒的事情,否则会弹出ANR(Application NoResponse)的对话框。如果有需要就另外启动一个Thread处理耗时操作。

LocalBroadcastManager解决BroadcastReceiver安全问题

LocalBroadcastManager是Android Support包提供了一个工具,是用来在同一个应用内的不同组件间发送Broadcast的
。可以解决BroadcastReceiver的安全问题(恶意程序脚本不断的去发送你所接收的广播)。

使用LocalBroadcastManager有以下好处:
- 发送的广播只会在自己App内传播,不会泄露给其他App,确保隐私数据不会泄露
- 其他App也无法向你的App发送该广播,不用担心其他App会来搞破坏
- 比系统全局广播更加高效

使用方法跟动态注册广播类似。首先需要获取LocalBroadcastManager对象,单例模式获取,然后调用registerReceiver方法。

broadcastManager = LocalBroadcastManager.getInstance(this);
localReceiver=new LocalBroadcastReceiver();
broadcastManager.registerReceiver(localReceiver,new IntentFilter(ACTION_LOCAL_BROADCAST));

发送广播也类似。这里一定需要调用LocalBroadcastManager对象的sendBroadcast方法发送广播哦,不然接收不到广播

Intent localIntent=new Intent(ACTION_LOCAL_BROADCAST);
localIntent.putExtra("data","Local Broadcast Parameter");//通过intent传参
LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent);

顺便在onDestroy方法中取消注册。

@Override
protected void onDestroy(){
    super.onDestroy();
    Log.i("MainActivity onDestroy","销毁广播");
    unregisterReceiver(dynamicBroadcast);
    broadcastManager.unregisterReceiver(localReceiver);
}

因为跟动态注册广播类似,所以只贴出了关键代码。

源码下载

Broadcast Receiver基本使用

标签:好处   final   ota   ext   length   static   字符串   参数   传递   

原文地址:http://blog.csdn.net/lowprofile_coding/article/details/54892997

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!