广播是android的四大组件之一。要使用广播,需要以下步骤:
1.定义广播接收器。
2.注册广播接收器。
3.向接收器发送广播。
定义广播接收器
定义一个广播接收器,继承BroadcastReceiver并重写onReceive(Context context, Intent intent)方法:
package com.zzj.ui.broadcastreceiverdemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, intent.getExtras().getString("msg"),
Toast.LENGTH_LONG).show();
}
}
注册广播接收器
有两种方式注册广播接收器:静态注册和动态注册。通过静态方式注册的广播接收器叫常驻广播,通过动态方式注册的广播接收器叫非常驻广播。
常驻广播
当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接收到。
常驻广播就是在Androidmanifest.xml注册的广播:
<receiver
android:name="com.zzj.ui.broadcastreceiverdemo.MyBroadcastReceiver"
android:exported="false" >
<intent-filter>
<action android:name="Action.StaticBroadcastReceiver" />
</intent-filter>
</receiver>
非常驻广播
当应用程序结束了,广播自然就没有了。
非常驻广播在代码中注册:
receiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("Action.DynamicBroadcastReceiver");
registerReceiver(receiver, intentFilter);
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)方法在android.content.ContextWrapper类中。
我们一般都是在组件创建的时候注册动态广播,然后在组件销毁的时候注销广播:
unregisterReceiver(receiver);
发送广播
发送广播调用android.content.ContextWrapper.sendBroadcast(Intent intent)方法。可以使用显示Intent,也可以使用隐式Intent。需要注意的是,向动态广播接收器发送广播必须使用隐式Intent。
使用显示intent发送静态广播:
// 使用显示intent发送静态广播
Intent intent = new Intent(this, MyBroadcastReceiver.class);
intent.putExtra("msg", "IntentBroadcastReceiver");
sendBroadcast(intent);
使用隐式Intent发送静态广播:
// 使用隐式Intent发送静态广播
Intent staticIntent = new Intent();
staticIntent.setAction("Action.StaticBroadcastReceiver");
staticIntent.putExtra("msg", "StaticBroadcastReceiver");
sendBroadcast(staticIntent);
使用隐式Intent发送动态广播:
// 使用隐式Intent发送动态广播
Intent dynamicIntent = new Intent();
dynamicIntent.setAction("Action.DynamicBroadcastReceiver");
dynamicIntent.putExtra("msg", "DynamicBroadcastReceiver");
sendBroadcast(dynamicIntent);
通常情况下应该使用隐式intent发送广播。实际上由于广播的性质,即使广播接收器不存在,也可以发送广播,因为广播发送出去之后,广播发送者并不关心广播是否被接收。这一点与启动一个activity不一样。
使用系统广播
如果要使用系统广播,则只需要定义广播接收器和注册广播接收器,然后使用IntentFilter拦截系统广播,不需要应用程序主动发送广播,因为系统广播由系统发送。下面附上几个常用的系统广播:
开机广播:
public static final String ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
开屏广播:
public static final String ACTION_SCREEN_ON = "android.intent.action.SCREEN_ON";
关屏广播:
public static final String ACTION_SCREEN_OFF = "android.intent.action.SCREEN_OFF";
以上几个常量都定义在Intent类中。
网络连接变化广播:
public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
这个常量定义在ConnectivityManager类中。