Android四大组件之Broadcast

来源:互联网 发布:免费淘宝兼职 编辑:程序博客网 时间:2024/05/16 08:59

1、BroadcastReceive概述

1.1、BroadcastReceive简介

Broadcast是一种运用的在应用程序之间传输信息的机制。而BroadcastReceiver是用于接收系统或app发送的广播事件。

1.2、广播的种类

Android中的广播主要可以分为两种类型,标准广播和有序广播。

有序广播:

是一种同步执行的广播,广播接受者收广播是有先后顺序的的,优先级高的广播接受者先收到广播,级别低的广播后受到广播,并且级别高的广播接受者可以修改广播里的内容,甚至是终止广播的传输。

使用abortbroadcast() 方法可以终止广播事件

无序广播:

也称标准广播,是一种完全异步执行的广播,所有广播接受者同时接收到广播是,广播的效率比较高,无法被截断的。

1.3、广播的两种注册方式

静态注册:在 AndroidManifest.xml 中注册广播。清单文件中声明 ,需要在其中配置 <intent-filter> 指定接收广播的动作 (action) 。

动态注册java代码中注册

两种注册区别

代码注册,它不是常驻型广播,也就是说广播跟随程序的生命周期,一旦代码所在进程被杀死,广播接收者就失效。

清单文件注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

2、接收系统广播 

Android内置了很多系统级别的广播。比如手机开机完成后会发出一条广播,电池的电量发生变化会发出一条广播,时间或时区发生改变也会发出一条广播等等。广播接收器只需对自己感兴趣的广播进行注册,这样当有相应的广播发出时,广播接收器就能够收到该广播。

下面用两个例子分别介绍动态注册和静态注册方式来接受系统广播。

1)动态注册监听网络变化

public class MainActivity extends Activity {private IntentFilter intentFilter;private NetworkChangeReceiver networkChangeReceiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);intentFilter = new IntentFilter();intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");networkChangeReceiver = new NetworkChangeReceiver();registerReceiver(networkChangeReceiver, intentFilter);}@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(networkChangeReceiver);}class NetworkChangeReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfonetworkInfo = connectionManager.getActiveNetworkInfo();if (networkInfo != null && networkInfo.isAvailable()) {Toast.makeText(context, "network is available",Toast.LENGTH_SHORT).show();} else {Toast.makeText(context, "network is unavailable",Toast.LENGTH_SHORT).show();}}}}

从以上代码知,自定义类NetworkChangeReceiver继承自BroadcastReceiver的,并重写了父类的onReceive()方法。接着在onCreate()方法中创建了一个 IntentFilter的实例,并添加值为android.net.conn.CONNECTIVITY_CHANGE 的 action表示网络发生变化时,系统就会发出的正是一条值为 

android.net.conn.CONNECTIVITY_ CHANGE 的广播,也就是说我们的广播接收器想要监听什么广播,就在这里添加相应的action就行了。接下来调registerReceiver() 方法进行注册,将 NetworkChangeReceiver的实例和IntentFilter的实例都传了进去,这就实现了监听网络变化的功能。 

注:需添加权限android:name="android.permission.ACCESS_NETWORK_STATE" 

2)静态注册实现开机启动

动态注册的广播接收器可以自由地控制注册与注销,但也存在着一个缺点,即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在 onCreate()方法中的。因此要让程序在未启动的情况下就能接收到广播就需要使用静态注册的方式了。 

如下,实现开机启动只需在清单文件进行注册,然后定义BroadcastReceiver 的子类就可以接受到开机广播了,就能收到开机广播了。当然也许添加权限,

android.permission.RECEIVE_BOOT_COMPLETED

public class BootCompleteReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();}}

清单文件中注册广播接收器:

<span style="white-space:pre"></span><receiver android:name=".BootCompleteReceiver" >            <intent-filter>                <actionandroid:name android.intent.action.BOOT_COMPLETED="" />            </intent-filter>        </receiver>

3、发送自定义广播

1)发送标准广播

首先创建MyBroadcastReceiver 继承BroadcastReceiver ,用户接收自定义的广播。

public class MyBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "received in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();}}

接着在清单文件中对自定义的广播接收器进行注册,并指定需要监听的广播即待会需要发送的广播。

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

最后发送自定义的广播了,在布局文件中定义一个button按钮,用于发送广播。

button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent("com.example.broadcasttest. MY_BROADCAST");sendBroadcast(intent);}});

2)发送有序广播

广播是一种可以跨进程的通信方式,实现发送有序广播是通过ContextsendOrderedBroadcast(intent, receiverPermission)方法,其次需要设定广播接收器的先后顺序,即指定广播接收者的优先级,在清单文件中通过priority属性声明优先级;这样优先级高的广播接收者就先收到广播,并有权终止广播的传输。

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

4、使用本地广播

前面我们发送和接收的广播全部都是属于系统全局广播,即发出的广播可以被其他任何 的任何应用程序接收到,并且我们也可以接收来自于其他任何应用程序的广播,这样就很容 易会引起安全性的问题。为了能够简单地解决广播的安全性问题Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播,这样所有的安全性问题就都不存在了。

使用本地广播主要是用LocalBroadcastManager这个类来对广播进行管理的。

通过LocalBroadcastManager.getInstance(this)获取LocalBroadcastManager对象,然后使用LocalBroadcastManager对象的sendBroadcast(intent)registerReceiver(localReceiver, intentFilter)即可实现注册本地广播和接收本地广播了。以下是动态注册广播方式。

public class MainActivity extends Activity {private IntentFilter intentFilter;private LocalReceiver localReceiver;private LocalBroadcastManager localBroadcastManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);localBroadcastManager = LocalBroadcastManager.getInstance(this); // 获取实例Button button = (Button) findViewById(R.id.button);button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {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); // 注册本地广播监听器}@Overrideprotected void onDestroy() {super.onDestroy();localBroadcastManager.unregisterReceiver(localReceiver);}class LocalReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "received local broadcast",Toast.LENGTH_SHORT).show();}}}
 

1 0
原创粉丝点击