四大组件-广播
广播接收器(Broadcast Receiver)
Android 中每个程序都可以对自己需要的广播进行注册,这样的话就能就收到注册广播所发送的内容。
这些广播可以是系统的也可以其他应用程序的。
1.广播类型
广播分两种类型:
标准广播:完全异步的广播,发出广播后所有注册这个广播的程序都会在同一时刻收的这条广播。
有序广播:是一种同步执行的广播,在广播发出后同一时刻只能有一个广播接收器接收这条广播,只有这个接收器中的逻辑执行完毕后,广播才会继续传递。广播是有先后顺序的,优先级高的广播接收器先接收到广播,可以通过 <receiver ... <intent-filter android:priority="100">
来设置优先级,并且还可以通过 abortBroadcast();
将这条广播截断。
2.接收广播
注册广播的两种方式:动态 注册、静态注册
- (1)动态注册(监听网络状态变化案例)
动态注册可以自由的控制注册和注销,但是必须得在程序运行之后才可以接收到广播。
首先声明网络权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
创建一个NetworkChangeReceiver类继承自BroadcastReceiver
class NetworkChangeReceiver extends BroadcastReceiver {
@Override //当网络状态发生变化时执行
public void onReceive(Context context, Intent intent) {
//得到ConnectivityManager实例 再得到NetworkInfo实例 来判断网络状态
ConnectivityManager connectivityManager = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable()) {
Toast.makeText(context, "Network is available", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Network is unavailable", Toast.LENGTH_SHORT).show();
}
}
}
然后MainActivity重注册广播
public class MainActivity extends AppCompatActivity {
private NetworkChangeReceiver networkChangeReceiver; //接收器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//动态注册
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); //添加想要监听的广播
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter); //注册广播
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver); //活动销毁后 取消注册
}
- (2)静态注册(开机启动)
未启动程序的情况下就可以接收到广播
首先声明权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
通过Android Studio 来快捷的创建一个广播接收器。
右键包名 --》New--》Other--》Broadcast Receiver ,接着会弹出创建窗口,我们可以设置两个属性,
这两个属性分别是:
Exported :是否允许这个广播接收器接收本程序以外的广播;
Enabled :是否启用这个广播接收器。
接着就帮我们创建好了 MyReceiver,
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Starting up", Toast.LENGTH_SHORT).show(); //Toast
}
}
我们只需要在 onReceive() 写入我们想要执行的逻辑就行。
注意:onReceive()方法中不要在执行过多逻辑或者耗时操作,而且该方法中不允许开启线程,
并且清单文件中自动创建了注册代码
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
android:name 指定注册哪一个广播接收器
在
<intent-filter>
中添加我们要监听的 Action
3.发送自定义广播
- 发送标准广播:
Intent intent=new Intent("com.tiger.broadcasttest.mytest");
sendBroadcast(intent);
这样的话所有监听 com.tiger.broadcasttest.mytest
这条广播的接收器都会受到这条消息。
另外因为我们是通过Intent进行传递的,我们还可以携带一些数据给其他广播接收器。
- 发送有序广播:
Intent intent=new Intent("com.tiger.broadcasttest.mytest");
sendOrderedBroadcast(intent,null);
4.Receiver 中开启活动
如果想要在广播接收器中开启活动需要 在Intent中添加 FLAG_ACTIVITY_NEW_TASK,否则会报错,因为需要一个栈来存储打开互动
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Boot complete!", Toast.LENGTH_SHORT).show();
Intent intentStartActivity=new Intent(context,MainActivity.class);
intentStartActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intentStartActivity);
}
5.Receiver 中开启服务
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Start myservice ", Toast.LENGTH_SHORT).show();
Intent startService=new Intent(context,MyService.class);
context.startService(startService);
}