动态注册和静态注册
静态注册:不论程序是否处于活动状态,都可以进行监听。
下面为静态注册一个 BootCompleteReceiver(启动后被触发)的步骤
- 定义一个广播接受器类继承自BroadcastReceiver
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//接收到系统消息 ACTION_BOOT_COMPLETE 弹出提示
Toast.makeText(context, "Boot Complete",Toast.LENGTH_LONG).show();
}
}
- 在AndroidManifest.xml中声明 receiver
<receiver android:name=".BootCompleteReceiver">
<intent-filter>
<actionandroid:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
- 增加本例需要用到系统启动通知权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
动态注册:无需在配置文件中注册<reciever />组件,通过context的registerReceiver()注册。
动态注册的广播非常驻型,生命周期随Activity,在Activity结束前记得移除unregisterReceiver()。
下面以监听网络状态为例注册一个广播(这个例子需要在配置文件中获取ACCESS_NETWORK_STATE的权限)
- 创建IntentFilter实例,添加action,值为android.net.conn.CONNECTIVITY_CHANGE
private IntentFilter filter;
filter = new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
- 创建NetworkStateChangeReceiver实例,用registerReceiver注册
privateNetworkStateChangeReceivermReceiver;
mReceiver = new NetworkStateChangeReceiver();
registerReceiver(mReceiver, filter);
- 广播事务处理在其onReceive()中实现
class NetworkStateChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
ConnectivityManager manager =(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
if ((info != null) && (info.isAvailable())) {
Toast.makeText(context, "network is available",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "network is unavailable",
Toast.LENGTH_SHORT).show();
}
}}
- 最后要记得在onDestroy()中取消注册
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
unregisterReceiver(mReceiver);
}
自定义广播
自定义广播也有两种方式:静态和动态
自定义广播与系统广播的区别就在于Intent里面的Action,系统的广播都有固定的Action,对应着系统的一些状态或者特定触发事件,而自定义的广播主要在Action的定制。
按钮触发事件演示静态注册自定义广播
- 监听按钮点击事件,当点击时,实例化一个Intent以指定Action为构造参数
btnSendCustomBroadcast=(Button)
findViewById(R.id.btn_send_custom_broadcast);
btnSendCustomBroadcast.setOnClickListener(newOnClickListener() {
public void onClick(View v) {
Intent intent = newIntent("CUSTOM_BROADCAST_RECEIVER");
//CUSTOM_BROADCAST_RECEIVER为自定义的Action,等下必须要在配置文件中注册
sendBroadcast(intent);
}
});
- 定义一个CustomBroadcastReceiver (继承自BroadcastReceiver )
public class CustomBroadcastReceiver extendsBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Toast.makeText(context, "Received CustomBroadcastReceiver",
Toast.LENGTH_LONG).show();
}
}
- 注册该广播接收器,在 AndroidManifest.xml 配置文件中声明 receiver,并且要加上action字段
<receiverandroid:name=".CustomBroadcastReceiver" >
<intent-filter>
<action android:name="CUSTOM_BROADCAST_RECEIVER"/>
</intent-filter>
</receiver>
动态注册与静态不同的地方在:1.删除配置文件中的广播的注册 2.在Activity中注册广播
- 在Activity中注册广播
myReceiver = new BroadCastActivity();
IntentFilter filter = new IntentFilter();
filter.addAction(MY_ACTION);//与非自定义相同,但ACTION是自定义的,只要和系统的不冲突就行
registerReceiver(myReceiver, filter);
- 启动广播
Intent intent = new Intent();
intent.setAction(MY_ACTION);
intent.putExtra("msg","blablabla");
sendBroadcast(intent);
贴一下前辈的提醒:
l onReceiver方法在主线程中运行,不要做耗时的工作,否则会导致ANR(Application NotResponding)异常。
l最好不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉。
l耗时的较长的工作一般放在服务中完成。
为了学习相关知识而做的音乐播放器DEMO
如果帮到你,欢迎+Star
github:https://github.com/Zeashon/MusicPlayer