一、特点:
1.生命周期短:只在onReceive 中, 进行生命周期,onReceive结束 生命周期结束。
2.最迷你的组件。
3.运行时间短,速度快,在主线程创建,如果在10秒内没有结束,就出现错误--程序无响应。
4.每次运行都会执行onReceive()方法,在执行完毕后,会自动销毁。
5.需要完成耗时的事件时,可以通过Intent传给Service,由Service来完成。
二、接收系统的广播:
广播接收器可以接受多种形式的广播,只要事件注册了不广播,我们就可以接收广播,并做出相应的处理事件操作。
1.广播的注册:
--广播的注册分为两种:动态注册和静态注册。
****动态注册***在java文件中注册***
实例: 动态注册监听网络变化:
在MainActivity中定义一个内部类netWorkChangeReceiver
继承BroadcastReceiver ,并重写父类的onReceive()方法,这样每当网络状态发生变化时,onReceive()方法就会得到执行,这里使用Toast提示一段文本信息,代码如下:
class netWorkChangeReceiver
extends BroadcastReceiver { @Override public void
onReceive(Context context, Intent intent) { Toast.makeText(context, "network change", Toast.LENGTH_SHORT).show(); } }
接着在
onCreate()方法中进行动态注册,然后在重写
onDestroy()方法进行释放(销毁);
private IntentFilter intentFilter; 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的实例,并调用registerReceiver()方法进行注册 netWorkChangeReceiver = new netWorkChangeReceiver();
registerReceiver(netWorkChangeReceiver, intentFilter);//并调用registerReceiver()方法进行注册 } //取消注册,一定要记得,不然系统会报错 @Override protected void onDestroy() { //重写onDestroy()方法 super.onDestroy();
unregisterReceiver(netWorkChangeReceiver); //取消注册 }
总结:
1.创建一个广播接收器,创建一个相应广播的事件;--应用的方法
onReceive()
2.注册一个广播,接收到广播,并出发创建的事件;--动态注册方法-
- IntentFilter、registerReceiver
3.最后将注册销毁。--应用的方法
onDestroy()、 unregisterReceiver()
4.
动态注册的方式比较灵活,但缺点是:必须在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中的,
为了
让程序在未启动的情况下就能接收到广播,这里就需要使用到
静态注册。
***静态注册**在xml文件中*******
例子:接收手机一条开机的广播,当收到这条广播时,就可以调用onCreate()方法中的实现逻辑,实现开机启动功能。
1.
新建一个类:BootCompleteReceiver
,让他继承BroadcastReceiver,在onReceive()方法中简单地Toast一下,代码如下:
public class BootCompleteReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Boot Complete", Toast.LENGTH_SHORT).show(); }}
可以看到,
这里不再使用内部类的方式来定义广播接收器
,因为稍后我们需要在清单文件AndroidManifest.xml中将这个广播接收器的类名注册进去。
然后修改清单文件AndroidManifest.xml,代码如下:
总结:在静态方法注册中,我们需要创建一个新的类,因为我们需要在清单文件中的<
receiver
>去注册这个类,并
<
uses-permission>
标签中定义使用的权限。
三、发送自定义的广播:
1.发送标准广播:(静态注册的方式)
---在发送广播之前,我们先定义一个广播接收器来接受广播:
新创建一个类,继承BroadcastReceiver(广播接收器)
public class MyBroadRervice extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//接受广播成功,我们使用Toast,弹出“OK”,表示接受成功
Toast.makeText(context, "OK", Toast.LENGTH_LONG).show();
}
}
--接着在清单文件中进行静态注册:
-----在MainActivity.java文件中,设置按钮来触发发送广播事件:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.mybroad.MyBroadRervice");
sendBroadcast(intent);
}
});
}
四、广播的有序和无序:
广播是一种可以跨线程的通信方式,其他程序也是可以接收到的。到此处,我们以前操作的广播都是无序的,现在我们来了解有序广播。
--有序广播不仅有先后的顺序,而且前面的广播还可以将后面的广播拦截。
--实例操作--学习 有序广播:
我们将自定义广播的MainActivity.java的代码进行一下改良:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.mybroad.MyBroadRervice");
sendBroadcast(intent); //发送无序广播
sendOrderedBroadcast(intent, null); //发送有序广播
}
});
}
--接着在清单文件中在静态注册的方法中添加一个属性:android:process="10",这个属性就是设置广播的优先级的,我们设置的范围是-100~100,。
android:process="10">
--最后如果我们想要拦截这个广播,防止后面的接收器的接收,我们只需要更改我们创建的广播接收器的一行代码即可。
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "OK", Toast.LENGTH_LONG).show();
abortBroadcast(); //进行拦截,防止后面的接收器接收次广播
}