Android 广播接收器

来源:互联网 发布:淘宝体检中心是什么 编辑:程序博客网 时间:2024/04/30 00:14
一、特点:
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,代码如下:

<!-- 应用权限声明--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.m05_broadcastreceiver01.MainActivity" android:label="@string/app_name" > <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>

总结:在静态方法注册中,我们需要创建一个新的类,因为我们需要在清单文件中的<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();
}

}
--接着在清单文件中进行静态注册:
<receiver android:name="com.mybroad.util.MyBroadRervice">
<intent-filter >
<action android:name="com.mybroad.MyBroadRervice"/>
</intent-filter>
</receiver>
<!-- 发送的广播为:com.mybroad.MT_RECIVER -->
-----在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,。

<receiver android:name="com.mybroad.util.MyBroadRervice"
android:process="10">
<intent-filter >
<action android:name="com.mybroad.MyBroadRervice"/>
</intent-filter>
</receiver>
<!-- 发送的广播为:com.mybroad.MT_RECIVER -->

--最后如果我们想要拦截这个广播,防止后面的接收器的接收,我们只需要更改我们创建的广播接收器的一行代码即可。
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "OK", Toast.LENGTH_LONG).show();
abortBroadcast(); //进行拦截,防止后面的接收器接收次广播
}
0 0
原创粉丝点击