一、首先,先介绍一下广播。
1.广播是Android四大组件之一,全称Broadcast Receiver。2.广播分为发送方和接收方,就算没有接受方,发送方也会分发送数据。3.广播可以实现跨多个页面的数据通信。4.广播可以实现跨进程间的数据通信。
广播可分为静态注册无序广播、静态注册有序广播和动态注册无序广播、动态注册有序广播。所谓静态注册简单来说就是在Manifest中注册,而动态注册就是在代码中注册。所谓无序广播是一种完全异步执行的广播,在发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,他们之间没有先后顺序。有序广播则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息。
二、先来看一下静态注册无序广播的使用。
1.先建一个广播接收器MyReceiver继承BroadcastReceiver,然后实现它的onReceive()方法
2.然后在Manifest中注册,在<application><application/>的标签之间
<receiver android:name="com.receiver.MyReceiver1"> --> <intent-filter > <action android:name="com.lk.broadcast1"/> <action android:name="com.lk.broadcast2"/> <action android:name="com.lk.broadcast3"/> </intent-filter> </receiver>
3.在需要发送广播的地方写发送广播的逻辑
@Override public void onClick(View arg0) { switch (arg0.getId()) { case R.id.button_guangbo1: Intent intent = new Intent(); // 相当于电台,发送指定频道的广播 intent.setAction("com.lk.broadcast1"); intent.putExtra("FM", "我是央广天下财经"); // 发送广播 sendBroadcast(intent); break;
4.在广播接受器中再写接收广播的逻辑
public class MyReceiver1 extends BroadcastReceiver { @Override public void onReceive(Context arg0, Intent arg1) { String action = arg1.getAction(); if (action.equals("com.lk.broadcast1")) { String fm = arg1.getStringExtra("FM"); Toast.makeText(arg0, "我接受到了广播:" + fm, Toast.LENGTH_SHORT).show(); } else if (action.equals("com.lk.broadcast2")) { Toast.makeText(arg0, "我接受到了广播:" + "第二个", Toast.LENGTH_SHORT).show(); } else if (action.equals("com.lk.broadcast3")) { } } }
三,然后再看一下 静态注册有序广播的使用。
1.逻辑和无序广播一样,不同的是Manifest中注册是多了一个属性android:priority设置优先级,优先级高的广播接收器就可以先接受到。
<receiver android:name="com.receiver.MyReceiverYX" > <intent-filter android:priority="10" > <action android:name="com.lk.broadcast4" /> </intent-filter> </receiver> <receiver android:name="com.receiver.MyReceiverYx2" > <intent-filter android:priority="100" > <action android:name="com.lk.broadcast4" /> </intent-filter> </receiver>
2.还有一点不同的是在发送广播时,有序用的是sendOrderedBroadcast。
case R.id.button_guangbo2: Intent intent2 = new Intent(); intent2.setAction("com.lk.broadcast4"); sendOrderedBroadcast(intent2, null); break;
四、再来看一下动态注册无序广播的使用。
1.逻辑和静态注册也一样,只是把在Manifest中注册的逻辑改成在代码中注册的逻辑就OK了。
case R.id.button_guangbo3: // 动态注册广播 myreceiver1 = new MyReceiver1(); IntentFilter filter = new IntentFilter(); filter.addAction("com.lk.broadcast1"); registerReceiver(myreceiver1, filter); Intent intent3 = new Intent(); intent3.setAction("com.lk.broadcast1"); sendBroadcast(intent3); break;
2.还有一点需要注意的是要在onDestroy()方法中取消注册。
@Override protected void onDestroy() { super.onDestroy(); if (myreceiver1 != null) { unregisterReceiver(myreceiver1); } if (myreceiveryx != null) { unregisterReceiver(myreceiveryx); } if (myreceiveryx2 != null) { unregisterReceiver(myreceiveryx2); } } }
动态注册有序广播,只需要价格优先级属性和发送时用sendOrderedBroadcast(),其余都一样,也需要在onDestroy()方法中取消注册。
case R.id.button_guangbo4: // 动态注册广播 myreceiveryx = new MyReceiverYX(); myreceiveryx2 = new MyReceiverYx2(); IntentFilter filter2 = new IntentFilter(); filter2.setPriority(100); filter2.addAction("com.lk.broadcast4"); registerReceiver(myreceiveryx, filter2); IntentFilter filter3 = new IntentFilter(); filter3.setPriority(10); filter3.addAction("com.lk.broadcast4"); registerReceiver(myreceiveryx2, filter3); Intent intent4 = new Intent(); intent4.setAction("com.lk.broadcast4"); sendOrderedBroadcast(intent4, null); break;
五,系统广播
Android内置了许多系统级别的广播,我们可以在应用程序中通过监听这些广播来得到各种系统的状态信息。比如手机开机完成后会发一条广播,电池的电量发生变化会发出一条广播,等等。例如:静态注册获取网络连接状态。这里必须在配置文件中声明权限。
<receiver android:name="com.receiver.MyReceiverNet" > <intent-filter > <action android:name="android.net.wifi.STATE_CHANGE"/> </intent-filter> </receiver> </application> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
然后在广播接收器中接收
public class MyReceiverScreen extends BroadcastReceiver{ @Override public void onReceive(Context arg0, Intent arg1) { String action =arg1.getAction(); if(action.equals(Intent.ACTION_SCREEN_OFF)){ Log.e("SCREEN", "off"); }else if(action.equals(Intent.ACTION_SCREEN_ON)){ Log.e("SCREEN", "on"); } } }
注:动态注册的广播可以自由的控制注册与注销,在灵活性方面有很大的优势,但是他也存在着一个缺点,即必须在程序启动之后才能接受到广播,因为注册的逻辑实在onCreate()方法中的。如果想让程序在未启动的情况下就能接受广播就得用静态注册。