热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android四大组件BroadCasrReciver

写给初学者20_android_四大组件_BroadCastReciver作者:Mofeel_安卓20_四大组件-BroadcastReceiverBroadcast


写给初学者20_android_四大组件_BroadCastReciver

作者:Mofeel_

安卓20_四大组件-BroadcastReceiver

BroadcastReceiver单从字面上解释是广播接受者的意思,那么这里很容易知晓,我们还需要一个广播发送者。这个过程其实和我们日常生活中收听广播一样,发送广播信号的电台会非常多,但是我们只会选择我们感兴趣的选择收听。这里安卓也是一样,并且其实我们的手机时时刻刻都在发送着广播,比如我们电量,由系统随时更新着,而我们大部分的应用都会选择接收它,从而随时知晓电量情况。

广播是一种应用程序之间传输信息的机制。

广播的分类

  1. 无序广播(普通)
  2. 有序广播
  3. 异步广播

广播接收者也需要注册

广播接收者也是四大组件之一,所以它也是需要我们进行注册的,在这里注册的方式有两种。

  • 静态注册 mainfest中注册
  • 代码注册 java代码中注册

通过案例来简单解释

普通广播(无序)

1.发送一个广播

public class MainActivity extends AppCompatActivity {@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
}public void send(View view){switch (view.getId()){case R.id.btnNormal:Intent normal = new Intent();// 添加一个action 就想电台的电台号一样 以便接收者监听normal.setAction("normal");// 发送一个普通广播sendBroadcast(normal);break;}
}
}

这里是开启了一个普通广播,并且广播的标示是 
normal。当然光发送肯定不够我们还需要一个接受者。

2.创建广播接受者

public class NormalReceiver extends BroadcastReceiver {/*** 接收到广播以后的操作* @param context 上下文对象* @param intent 意图对象*/
@Override
public void onReceive(Context context, Intent intent) {String msg = intent.getStringExtra("msg");// 获取其中消息Toast.makeText(context,msg,Toast.LENGTH_SHORT).show();
}
}

到这里我们还需要去注册广播

3.广播的注册

静态注册在mainfest当中添加标签


注意其中添加了一个,目的就是过滤筛选,保证接收着能接收的就是我们发送的这个广播。

动态注册

public class MainActivity extends AppCompatActivity {
IntentFilter intentFilter;
NormalReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);intentFilter = new IntentFilter("normal");receiver = new NormalReceiver();registerReceiver(receiver,intentFilter);// 注册
}public void send(View view){switch (view.getId()){case R.id.btnNormal:Intent normal = new Intent();normal.putExtra("msg","普通广播");normal.setAction("normal");sendBroadcast(normal);break;}
}@Override
protected void onDestroy() {super.onDestroy();unregisterReceiver(receiver);// 取消注册
}
}

两者区别:

静态注册存在于mainfest.xml是全局的,当应用启动就会存在,而代码注册是只有当相应组件启动后才会有,比如这里的Activity。而且代码注册的方式,一定不要忘记取消注册。

结果:



执行流程分析


理解普通广播,有序和异步其实就会简单很多了。主要是注册和接收回调前期会比较难理解。后面的我就只写一种注册方式了

有序广播

有序广播,既然是有序也就是以为着我们能够决定接收着接收的顺序。接收的顺序可以通过优先级来设置,这个谷歌官方是要求在-1000-1000,其实你写到int最大取值也没毛病,但是既然是谷歌推荐,咱们照办就好。有序比无序更加灵活,可以截断,可以传递数据等。

1.发送有序广播

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
}public void send(View view) {switch (view.getId()) {case R.id.btnNormal:Intent normal = new Intent();normal.putExtra("msg", "普通广播");normal.setAction("normal");sendBroadcast(normal);break;case R.id.btnOrder:Intent order = new Intent();order.putExtra("msg", "Order");order.setAction("order");sendOrderedBroadcast(order, null);break;}
}@Override
protected void onDestroy() {super.onDestroy();
}
}

和发送普通广播只有调用的方法不一样,调用的是sendOrderedBroadcast

2.接收没有太大变化

public class MyReceiverOne extends BroadcastReceiver {@Override
public void onReceive(Context context, Intent intent) {String msg = intent.getStringExtra("msg");Log.i("receiver","One接收到了消息"+msg);
}
}

3.主要是在注册当中变化明显


这里有两个广播接收者,同时都是接收的为order的广播,需要注意的是在intent-filter中有一个priority属性,两个接收者的属性值是不一样的,Two要比One高,也就意味着Two是先接收到,有就反应出有序了。

结果 


当然有序广播还可以进行截断、处理后再传递。比如我这里让Two先接收后处理一些信息后,再传递给One。

Two中代码:

public class MyReceiverTwo extends BroadcastReceiver {@Override
public void onReceive(Context context, Intent intent) {String msg = intent.getStringExtra("msg");Log.i("receiver","Two接收到了消息"+msg);Bundle bundle = new Bundle();bundle.putString("result","Two处理过后的数据");// 设置处理过后的数据setResultExtras(bundle);
}
}

One中代码:

public class MyReceiverOne extends BroadcastReceiver {@Override
public void onReceive(Context context, Intent intent) {String msg = intent.getStringExtra("msg");Log.i("receiver","One接收到了消息"+msg);Bundle bundle = getResultExtras(true);// 获取已经被处理过的数据String data = bundle.getString("result");Log.i("receiver","One:"+data);
}
}

结果: 

有序广播和普通广播的比较

异步广播

异步可以先发送后注册

发送

public class MainActivity extends AppCompatActivity {
MyReceiverThree receiver;
IntentFilter filter;
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);receiver = new MyReceiverThree();filter = new IntentFilter("sticky");}public void send(View view) {switch (view.getId()) {case R.id.btnNormal:Intent normal = new Intent();normal.putExtra("msg", "普通广播");normal.setAction("normal");sendBroadcast(normal);break;case R.id.btnOrder:Intent order = new Intent();order.putExtra("msg", "Order");order.setAction("order");sendOrderedBroadcast(order, null);break;case R.id.btnSticky:Intent sticky = new Intent();sticky.setAction("sticky");sticky.putExtra("msg","Sticky");sendStickyBroadcast(sticky); // 先发送registerReceiver(receiver,filter);// 后注册break;}
}@Override
protected void onDestroy() {super.onDestroy();unregisterReceiver(receiver);
}
}

接收就没什么好说的了。

重要的是发送异步广播需要在清单文件添加权限: 不然就会出现错误,结果也就不演示了

掌握好广播的发送,数据的传递,并且不要在广播中做耗时操作。




推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
author-avatar
窝窝笑丫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有