Android之BroadcastReceiver组件

一、 定义

  当一个事件发生的时候,就会发送一个广播,所有注册了这个广播的接收者都可以接收这个广播,也就是说一个广播可以被多个接收者接收

二 、广播的接收

    1、清单文件中注册(永久注册,除非卸载)    
1 public class Receiver extends BroadcastReceiver {
2     @Override
3     public void onReceive(Context context, Intent intent) {
4         // TODO Auto-generated method stub
5         Bundle bundle=intent.getExtras();
6     }
7 
8 }
1 <receiver android:name="com.example.receiver.Receiver">
2     <intent-filter android:priority="1000">
3         <action android:name="android.intent.action.ACTION_SHUTDOWN"/>
4     </intent-filter>
5 </receiver>
  2、代码注册临时的广播接收者
  在activity启动时注册广播接收者(onCreate()),在activity退出时注销广播接收者(onDestroy())  
 1 @Override
 2 protected void onCreate(Bundle savedInstanceState) {
 3     super.onCreate(savedInstanceState);
 4     setContentView(R.layout.activity_main);
 5     
 6     receiver = new Receiver();
 7     IntentFilter filter=new IntentFilter("com.broadcast.ORDER");
 8     filter.setPriority(1000);
 9     registerReceiver(receiver, filter);
10 }
11 
12 @Override
13 protected void onDestroy() {
14     // TODO Auto-generated method stub
15     super.onDestroy();
16     unregisterReceiver(receiver);
17 }

三、发送广播

     a、普通广播:接受者之间不能中断(absort),不能互传数据(result) 
1      Intent intent=new Intent("com.broadcast.NORMAL");
2      sendBroadcast(intent,null);
  b、有序广播:接收者之间可以中断,可以传递数据, 接收有序广播时,先发布的先接收,优先级大的先接收
1      Intent intent=new Intent("com.broadcast.ORDER");
2      intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);//包含从未启动过的程序(3.1以后默认不包含),也可以不写
3      sendOrderedBroadcast(intent,null);//不指定权限,赋值为null

四、发送广播时传递数据

  a、intent传递数据,该数据不可被修改(需要重新发布)
    向intent中添加数据
intent.putExtra("data","添加数据");

    获取各自对应的数据

intent.getStringExtra("data");

  b、ResultAPI传递数据,有序广播可以使用ResultAPI传递数据

1 Bundle bundle=new Bundle();
2 bundle.putString("name","张三");
3 bundle.putInt("age",21);
4 sendOrderedBroadcast(intent,null,null,null,1,"MainActivity",bundle);

  获取各自的数据 

1 int code=getResultCode();//结果数据中的int型参数
2 String data=getResultData();//结果数据中String型参数
3 Bundle bundle=getResultExtras(true);     //结果数据中的bundle,若之前的操作结果数据bundle改为null,表示前面没有bundle集合true就会返回一个new Bundle(),创建一个集合,false的话则返回null,因为之前就没有bundle集合
  修改结果数据
    在有序广播中,接收者是将数据一个给一个传递的,是个链式结构,后面的接收者可以接收前面修改后的数
1 bundle.putString("name","王族");
2 bundle.putInt("age",25);
3 setResult(6,"Paris",bundle);//修改Result数据,后面的接收者将收到这个修改后的数据

五、中断广播(有序广播中可操作)

  abortBroadcast()可中断广播,后面就不会收到广播,sendOrderedBroadcast()中若第三个参数赋值ResultReceiver,      还是会收到广播,始终都是最后一个接收到

六、广播权限

  a、发送端要求接收端的权限(要求接收者必须有权限)
    接收端必须持有发送端的权限才可以接收这个广播
    <permission/>声明权限---在发送端声明这个权限
    <uses-permission/>使用权限---在接收端使用这个权限才可以收到广播
  b、接收端要求发送端的权限
    在<receiver/>标签中指定android:permission=""权限,发送端必须有这个权限,接收端才会接收它的广播;若无权限,接收端不接收广播

七、生命周期

      从收到广播的时候生命周期开始,到执行onReceive()方法执行结束,生命周期结束,进程中如果没有其他组件,容易被杀死

Android之BroadcastReceiver组件,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。