Broadcast的学习

动态注册和静态注册

静态注册:不论程序是否处于活动状态,都可以进行监听。

下面为静态注册一个 BootCompleteReceiver(启动后被触发)的步骤

  1. 定义一个广播接受器类继承自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();

}

}

  1. AndroidManifest.xml中声明 receiver

<receiver android:name=".BootCompleteReceiver">

<intent-filter>

<actionandroid:name="android.intent.action.BOOT_COMPLETED" />

</intent-filter>

</receiver>

  1. 增加本例需要用到系统启动通知权限

<uses-permission  android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

 

动态注册:无需在配置文件中注册<reciever />组件,通过contextregisterReceiver()注册。

动态注册的广播非常驻型,生命周期随Activity,在Activity结束前记得移除unregisterReceiver()

下面以监听网络状态为例注册一个广播(这个例子需要在配置文件中获取ACCESS_NETWORK_STATE的权限)

  1. 创建IntentFilter实例,添加action,值为android.net.conn.CONNECTIVITY_CHANGE

private IntentFilter filter;

filter = new IntentFilter();

filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");

  1. 创建NetworkStateChangeReceiver实例,用registerReceiver注册

privateNetworkStateChangeReceivermReceiver;

mReceiver = new NetworkStateChangeReceiver();

registerReceiver(mReceiver, filter);

  1. 广播事务处理在其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();

}

}}

  1. 最后要记得在onDestroy()中取消注册

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

unregisterReceiver(mReceiver);

}

自定义广播

自定义广播也有两种方式:静态和动态

自定义广播与系统广播的区别就在于Intent里面的Action,系统的广播都有固定的Action,对应着系统的一些状态或者特定触发事件,而自定义的广播主要在Action的定制。

按钮触发事件演示静态注册自定义广播

  1. 监听按钮点击事件,当点击时,实例化一个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);

}

});

  1. 定义一个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();

}

}

  1. 注册该广播接收器,在 AndroidManifest.xml 配置文件中声明 receiver,并且要加上action字段

<receiverandroid:name=".CustomBroadcastReceiver" >

<intent-filter>

<action android:name="CUSTOM_BROADCAST_RECEIVER"/>

</intent-filter>

</receiver>

动态注册与静态不同的地方在:1.删除配置文件中的广播的注册  2.Activity中注册广播

  1. Activity中注册广播

myReceiver = new BroadCastActivity();  

IntentFilter filter = new IntentFilter();  

filter.addAction(MY_ACTION);//与非自定义相同,但ACTION是自定义的,只要和系统的不冲突就行

registerReceiver(myReceiver, filter);              

  1. 启动广播

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


 

 

 

 

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值