您的位置:首页 > 其它

BroadCastReceiver

2016-02-24 23:47 260 查看
1.广播接收器:BroadCastReceiver

四大组件之一,需要注册
系统级别的通知(通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。)


BroadCast:广播器

Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一
类组件。


2.注册的两种方式:

(1)静态注册;在AndroidManifest.xml中注册

使用步骤:
1.写一个类继承Broadcastreceiver实现onReceive(Context context, Intent intent)方法
2.在清单文件中注册你的广播
<receiver android:name=".MyBroadCaseReceiver2">
<intent-filter>
<!--解锁的action-->
<action android:name="android.intent.action.USER_PRESENT"/>
</intent-filter>
</receiver>
3.实现你的广播逻辑在onReceive()中
if(intent.getAction().equals("android.intent.action.USER_PRESENT")){
//解锁的时候
Toast.makeText(context,"解锁了",Toast.LENGTH_SHORT).show();
}
注意:一般监听系统都是需要权限的,必须开启权限才能监听
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>开机权限


(2)动态注册:

使用步骤:
1.创建一个广播,写一个类继承BroadCastReceiver,实现onReceive(Context context, Intent intent)方法
2.用代码写IntentFilter添加监听到action(在Activity中),然后调用registerReceiver()动态注册的方式进行注册
//创建一个广播对象
myReceiver = new MyReceiver();
//创建意图过滤器
IntentFilter intentFilter = new IntentFilter();
//锁屏过滤器
intentFilter.addAction(Intent.ACTION_USER_PRESENT);
//动态注册广播.参数1:创建的广播;参数2:意图过滤器
registerReceiver(myReceiver,intentFilter);
3.实现你的广播逻辑在onReceive()中
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("Intent.ACTION_USER_PRESENT")){
Toast.makeText(context,"解锁了",Toast.LENGTH_SHORT).show();
}
}
4.在退出界面的时候,动态注册广播要解绑
protected void onDestroy() {
super.onDestroy();
//特别注意:在退出界面的时候,动态注册广播要解绑
unregisterReceiver(myReceiver);
}


3.静态注册与动态注册的区别:

a.静态注册在清单文件中进行,并在过滤器中添加action意图;
动态注册在java代码中并创建意图过滤器添加action,并且动态注册需要解绑
b.静态注册在应用退出之后仍然可以监听,动态注册只有在当前界面上注册有效


4.自定义广播:需要发送广播,而系统广播不需要发送(若系统广播为动态广播,则需要注册广播)

步骤:
(1).创建一个广播(写一个类继承BroadCastReceiver,实现onReceive(Context context, Intent intent)方法)
(2).定义一个频道(action字符串),在清单文件中注册
<receiver android:name=".MyBroadCastReceiver">
<intent-filter>
<action android:name="com.action.TRANSLATE"/>
</intent-filter>
</receiver>
(3).定义一个意图开启广播,并通过sendBroadcast()发送广播
Intent intent = new Intent();
//设置广播的action
intent.setAction("com.action.TRANSLATE");
intent.putExtra("value","小花");
//发送广播
sendBroadcast(intent);
(4)可以在广播中接收传过去的值
//接收到传递过来的值
String data = intent.getStringExtra("value");


5.有序的广播:

优先级:
一般情况下不设置广播优先级的情况下所有相同广播接收到消息都是同时的
有序广播设置他们的优先级后:
1.高级别的广播优先接收数据
2.高级别的广播可以中断广播继续向下进行传递
3.更改高级别接收到的广播数据 , 然后在继续向下传递

优先级在清单文件中的intent-filter设置,优先级别的值为-1000到1000,值越大,优先级越高
<receiver android:name=".MyBroadCastReceiver">
<!--android:priority优先级,取值为-1000到1000,值越大,优先级越高-->
<intent-filter
android:priority="1000">
<action android:name="com.niu.receiver"/>
</intent-filter>
</receiver>
使用有序广播的步骤:
(1).创建一个广播(写一个类继承BroadCastReceiver,实现onReceive(Context context, Intent intent)方法)
(2).定义一个频道(action字符串),在清单文件中注册(可以写系统的action也可以自定义)
<receiver android:name=".MyBroadCastReceiver">
<!--android:priority优先级,取值为-1000到1000,值越大,优先级越高-->
<intent-filter
android:priority="0">
<action android:name="com.niu.receiver"/>
</intent-filter>
</receiver>
(3).定义一个意图开启广播,并通过sendOrderedBroadcast()发送有序广播
Intent intent = new Intent();
intent.setAction("com.niu.receiver");
intent.putExtra("value", "小花");
//sendOrderedBroadcast()发送有序广播方法
//参数1.intent, 参数2:自定义的权限
sendOrderedBroadcast(intent,"com.niu.receiver");

**自定义权限(在清单文件中)
<permission android:name="android.myaction.TAN"/>
<uses-permission android:name="android.myaction.TAN"/>

(4)可以在优先级高的广播中用abortBroadcast()方法中断优先级别低广播
将值进行修改传递
Bundle bundle = new Bundle();
//增加新值进行传递
bundle.putString("order","123"+data);
setResultExtras(bundle);
在优先级比当前广播低的广播中可以获得修改的值:
String value = getResultExtras(true).getString("order");


5.广播的生命周期:

生命周期只有十秒左右,如果在onReceive()内做超过十秒内的事情,就会报ANR错
调用对象-->实现onReceiver()-->结束

注意:
BroadCastReceiver的生命周期只有10 秒
在BroadCastReceiver中不能做耗时操作
应该通过Intent给Service,由service来完成
不能使用子线程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: