Android_BroadcastReceiver
作为一个Android小白,这是我的第一篇CSDN博客,这篇博客的主要内容介绍的是Android中的四大组件之一:广播
(BroadcastReceive),这些只是我的理解,如有差错,留言或者androidchw@163.com联系,谢谢。
Android中的广播主要分为两种形式:
标准广播(Normal Broadcasts)
一种异步执行的广播,所有的广播接收器几乎都在同一时刻接收到这条广播消息。它们之间没有任何顺序可言。这种广播的优点是效率比较高,但是这种广播无法拦截。并且在程序启动之后才能接收广播。
有序广播(Ordered Broadcastss)
一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播能接收到这条广播,当这个广播接收器中的逻辑执行完毕后,广播才会继续传播。此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播,并且前面的广播可以拦截广播。
上面说的可能太书本话了,下面就让我举个例子帮助大家更好的理解标准广播和有序广播。
标准广播
相信在帝都工作的程序猿都遇见过这种情况,公交车来了以后,人们都争先恐后的去公交车门那里挤公交。这就相当于系统发出一条广播,手机中的App争先恐后的抢这个广播。就像人们争先恐后的挤公交车一样,完全没有顺序可言。
有序广播
相信大家上学的时候,都遇见过大扫除这个事情吧。老师先把大扫除的消息给卫生委员分布下去,卫生委员又把大扫除的消息分布给各个组长,组长又把大扫除的消息分布个各个组员。有序广播就是这样传播的。它是有先后顺序的,级别越高的获取广播也就越早,并且还能够拦截不让后面级别低的获取到广播。
手机开机完成后会发出一条广播,电池的电量发生变化会发出一条广播,时间或者时区发生改变也会发出一条广播。一个广播的完成需要两个步骤:发送广播和接收广播。现在,我们就从最基础的接收系统广播开始学习吧。
如果你想了解更多有关Android系统的中的广播,可以查看 Android系统广播大全
现在我们就从最简单的接收系统广播开始学习吧,学习之前我们还是先了解一下广播的注册方式,Android中广播的注册方式有两种:(1)动态注册广播:在代码中注册。(2)静态注册广播:在AndroidManifest.xml中注册。
动态注册广播
public class MainActivity extends Activity {
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 动态注册广播
intentFilter = new IntentFilter();
//广播接收器想要监听什么样的广播,就在这里添加响应的action就行了。
intentFilter.addAction("android.net.con.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter);
}
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netWorkInfo = connectivityManager.getActiveNetworkInfo();
if (netWorkInfo != null && netWorkInfo.isAvailable()) {
Toast.makeText(MainActivity.this, "network is available", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "network is not_available", Toast.LENGTH_SHORT).show();
}
}
}
// 这一步至关重要
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册的广播
unregisterReceiver(networkChangeReceiver);
}
}
接收系统网络变化的广播还需要权限,所以我们在AndroidManifest.xml中添加一个权限。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
静态注册广播
以下的代码主要是实现了开机启动的功能。
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();
}
}
在AndroidManifest.xml中的静态注册广播的代码:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name=".BootCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>