• 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()方法执行结束,生命周期结束,进程中如果没有其他组件,容易被杀死
  • 相关阅读:
    LeetCode刷题记录2020-10-07之动态规划入门!!!线性DP(二)
    LeetCode刷题记录2020-10-06之动态规划入门!!!线性DP
    LeetCode刷题记录2020-10-05之Double Pointer!!!
    Python核心编程之属性查找过程!
    Python核心编程之元类!
    Python配置文件的导入方式和源码分析!
    大数据架构入门之二:埋点数据流程
    day46 css第二part
    day44天 HTTP协议 和前端html协议
    day39 视图 触发器 事务 存储过程 函数 流程控制 索引与慢查询优化
  • 原文地址:https://www.cnblogs.com/myxiaoQ/p/3650076.html
Copyright © 2020-2023  润新知