广播有两种,一种是无序广播,一种是有序广播。
无序广播:也称为标准广播,是一种完全异步的广播,在广播发出后,几乎同一时间,所有的广播接收器都可以接受到这广播。他没有先后顺序,这也就是说,他的效率会比较高,而且无法被截断。有序广播:是一种同步执行的广播,在广播发出后,同一时间,只有一个广播接收器能够接受到该广播,当这个广播接收器中的逻辑执行完毕后,广播才可以继续传递。广播接收器是有优先级的,优先级的高低,决定了接受广播的顺序。并且,在高优先级可以截断广播,使低优先级的接收器无法接受广播。 广播有注册的方式有两种:
静态注册:在清单文件中注册,和动态注册相比,可以让广播接收器在程序未启动的状态也可以接受广播。
清单文件:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mac.broadcast_demo"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />S
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!--静态注册服务--> <receiver android:name=".BootCompleteReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> </application> </manifest>我们需要新建一个类来继承我们的广播类BroadcastReceiver,然后在onReceive()中写逻辑代码就可以了。
package com.example.mac.broadcast_demo
; import android.content.BroadcastReceiver
; import android.content.Context
; import android.content.Intent
; import android.content.IntentFilter
; import android.net.ConnectivityManager
; import android.net.NetworkInfo
; import android.util.Log
; /** * Created by mac on 16/8/13. */ public class BootCompleteReceiver
extends BroadcastReceiver {
@Override public void onReceive(Context context
, Intent intent) { Log.
d(
"zlx","系统启动了")
; } }这样就完成了广播的静态注册。 动态注册:在代码中注册,广播接收器可以自由的进行注册和注销,具有很高的灵活性,但是必须是程序启动后才可以注册广播。因为注册的代码时是写在onCreate()方法中的。
新建一个类,让他继承父类BroadcastReceiver,并重写父类onReceive()方法就可以了。当接收到广播的时候,在这个方法里面实现逻辑即可。如下,实现了一个查询是否有网络的广播:
public class MainActivity
extends AppCompatActivity {
private IntentFilter
intentFilter; private NetworkBroadcast
networkBroadcast; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
; setContentView(R.layout.
activity_main)
; intentFilter=
new IntentFilter()
; networkBroadcast=
new NetworkBroadcast()
; //添加动作,检测网络状态 intentFilter.addAction(
"android.net.conn.CONNECTIVITY_CHANGE")
; //启动服务 registerReceiver(
networkBroadcast,intentFilter)
; }
@Override protected void onDestroy() {
super.onDestroy()
; //关闭广播 unregisterReceiver(
networkBroadcast)
; }
class NetworkBroadcast
extends BroadcastReceiver{
@Override public void onReceive(Context context
, Intent intent) { Log.
d(
"zlx","网络状态发生改变了")
; } } } 注意点:因为广播中时不可以开启线程的,所以,耗时操作不能放到onReceive()中执行,当onReceive()运行较长时间而没有结束的话,系统就会报错。所以,我们常用广播实现打开程序其他组件。
转载请注明原文地址: https://ju.6miu.com/read-1295455.html