- 广播有两种,一种是无序广播,一种是有序广播。
- 无序广播:也称为标准广播,是一种完全异步的广播,在广播发出后,几乎同一时间,所有的广播接收器都可以接受到这广播。他没有先后顺序,这也就是说,他的效率会比较高,而且无法被截断。
- 有序广播:是一种同步执行的广播,在广播发出后,同一时间,只有一个广播接收器能够接受到该广播,当这个广播接收器中的逻辑执行完毕后,广播才可以继续传递。广播接收器是有优先级的,优先级的高低,决定了接受广播的顺序。并且,在高优先级可以截断广播,使低优先级的接收器无法接受广播。
- 广播有注册的方式有两种:
- 静态注册:在清单文件中注册,和动态注册相比,可以让广播接收器在程序未启动的状态也可以接受广播。
- 清单文件:
<?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()运行较长时间而没有结束的话,系统就会报错。所以,我们常用广播实现打开程序其他组件。