Android_BroadcastReceiver(二)

原创 2016年05月31日 15:37:23

如果你看过我写的第一篇Android_BroadcastReceiver(一),那么你一定了解到广播分为标准广播和有序广播。下面我们就来学习一下发送自定义广播:
发送标准广播
发送一个自定义的广播的主要步骤是:
1、自定义类MyBroadcastReceiver继承BroadcastReceiver类,重写onReceive()方法。
2、在AndroidManifest.xml文件中注册。
3、在MainActivity中点击一个按钮发送指定的广播。

以下是具体代码的实现
1、

public class AnotherBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "receiver in AnotherBroadcastReceiver", Toast.LENGTH_LONG).show();
    }
}

2、

<receiver android:name=".MyBroadcastReceiver">
            <intent-filter >
                <action android:name="com.example.broadcasttest.MY_BROADCAST"/>
            </intent-filter>
        </receiver>

3、

public class MainActivity extends Activity {
    private Button sendBroadcast;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sendBroadcast= (Button) findViewById(R.id.button);
        sendBroadcast.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            //由代码可以看出发送一个广播是用Intent,我们就可以用Intent携带一些数据。
                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
                sendBroadcast(intent);
            }
        });
    }
}

发送有序广播
有序广播的发送其实跟标准广播的发送大概是一样的。有序广播的发送如下:
有序广播的发送

我们都知道有序广播是有优先级的,优先级越高,那么得到广播越早,也可以拦截广播或者篡改数据。
那么如何设置优先级的?如下图:

设置有序广播优先级

最为程序猿的我们来说,特别是对于我这种有强迫症的人来说,我当然愿意是自己程序拥有最高的优先级。
并且让,后面的接收相同的广播的程序都不能接收到。那么你就要这么办了:

阻止广播的传播

有序广播的接收者们的接收顺序
通过配置IntentFilter的priority可以设置各个广播接收者的优先级,priority的值越高,则优先级越高,则更加优先接收到广播
动态注册广播接收者时,通过IntentFilter对象的setPriority()方法配置,
静态注册时,为节点配置android:priority属性即可
官方推荐priority值不超过1000,实际开发时,为了抢占优先级,可以使用Integer.MAX_VALUE
当多个广播接收者的priority值相同时,动态注册的广播接收者的优先级高于静态注册的广播接收者
如果多个动态注册的广播接收者的priority值相同,先注册的先接收,后注册的后接收
如果多个静态注册的广播接收者的priority值相同,则根据各广播接收者所在的应用程序的包名进行排序

如何让广播接收者尽量获取更高的优先级
1) 指定最大值的priority
2) 可行的情况下,设置排序可以更靠前的包名
3) 使用静态注册的方式,接收“系统开机”的广播,并且在接收到该广播后,使用动态注册的方式注册广播接收者

有序广播的拦截
在广播接收者处理广播时,调用abortBroadcast()可以终止广播向后继续传递,则会导致优先级更低的广播接收者不会收到该广播

有序广播的篡改
在有序广播的传递过程中,可以通过setResult???()配置数据,优先级更低的广播接收者可以通过匹配的getResult???()获取这些数据,甚至进行篡改,而后续的接收者会收到篡改后的数据

使用本地广播
当我们的程序中使用广播发送一些关键性的数据有可能被其他的应用程序截取,或者 其他的程序不能地向我们的广播接收器里发送各种垃圾广播。为了能够简单的解决广播的安全性问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播。这样所有的安全性问题就不存在了。

public class MainActivity extends Activity {
    private Button sendOrderBroadcast;
    private IntentFilter intentFilter;
    private LocalReceiver localReceiver;
    private LocalBroadcastManager localBroadcastManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取localBroadcastManager的实例
        localBroadcastManager = LocalBroadcastManager.getInstance(this);
        //获取点击按钮
        sendOrderBroadcast = (Button) findViewById(R.id.button);
        sendOrderBroadcast.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
                localBroadcastManager.sendBroadcast(intent);
            }
        });
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
        localReceiver = new LocalReceiver();
        localBroadcastManager.registerReceiver(localReceiver, intentFilter);
    }

    class LocalReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "receiverd local broadcast", Toast.LENGTH_LONG).show();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(localReceiver);
    }
}

注意点
本地广播注意点

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android 之 BroadcastReceiver (二) 常见的几个系统广播

常见的几个系统广播

Android 源码系列之<二>从安全的角度深入理解BroadcastReceiver(上)

提起BroadcastReceiver大家都很熟悉,它和Activity,Service以及ContentProvider并称为Android的四大组件(四大金刚),可见BroadcastReceiv...

Android Service 服务(二)—— BroadcastReceiver

一、 BroadcastReceiver简介BroadcastReceiver,用于异步接收广播Intent,广播Intent是通过调用Context.sendBroadcast()发送、Broadc...

(4.1.18.3)Android Service 服务(二)—— BroadcastReceiver

一、 BroadcastReceiver简介 BroadcastReceiver,用于异步接收广播Intent,广播Intent是通过调用Context.sendBroadcast()发送、Broa...

Android的四大组件之二--BroadcastReceiver(相关内容,开机启动Service)

[html] view plaincopyprint? 前面介绍了Service,接着介绍下相对简单的BroadcastReceiver;   Base cla...

Android四大组件之BroadcastReceiver工作原理

1.广播的注册 As we all know,广播的注册也是分两种:动态注册和静态注册,前者是在Activity生命周期中用java代码注册和解除注册,后者是在AndroidManifest文件中。后...

Android BroadcastReceiver

  • 2014年10月23日 11:13
  • 2.16MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android_BroadcastReceiver(二)
举报原因:
原因补充:

(最多只允许输入30个字)