Android广播机制(2)
- 发送自定义广播
- 发送标准广播
- 步骤
- 跨进程广播
- 步骤
- 发送有序广播
- 发送标准广播
- 使用本地广播
- 实例
- 本地广播的优势
发送自定义广播
发送标准广播
步骤
1.定义一个广播接收器来接收此广播,新建MyBroadcastReceiver,代码如下:
//当MyBroadcastReceiver收到自定义的广播时,就会弹出"received in MyBroadcastReceiver"的提示
public class MyBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();}
}
2.注册广播,在AndroidManifest.xml中对这个广播接收器进行修改:
//让MyBroadcastReceiver接收一条值为com.example.broadcasttest.MY_BROADCAST的广播,所以一会我们发送的广播就是这样一条广播
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.broadcasttest"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme">...<receiverandroid:name=".MyBroadcastReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="com.example.broadcasttest.MY_BROADCAST"/></intent-filter></receiver></application>
</manifest>
3.定义一个按钮作为广播的触发点,修改MainActivity的代码:
public class MainActivity extends AppCompatActivity {...@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button= (Button) findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent("com.example.a51104.broadcasttest.MY_BROADCAST");sendBroadcast(intent,null);//发送标准广播,这样所有监听这条广播的广播接收器都可以接收到信息}});...}...
}
广播是通过Intent传递的,所以也可以携带其他数据
跨进程广播
广播是一种可以跨进程的通信方式。因此在我们应用程序内发出的广播,其他的应用程序应该也是可以收到的。
新建项目BroadcastTest2
步骤
1.创建广播接收器
public class AnotherBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"received in AnotherBroadcastReceiver",Toast.LENGTH_SHORT).show();}
}
2.修改AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.broadcasttest2"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme">...<receiverandroid:name=".AnotherBroadcastReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="com.example.a51104.broadcasttest.MY_BROADCAST"/></intent-filter></receiver></application>
</manifest>
可以看到AnotherBroadcastReceiver同样接收的是com.example.a51104.broadcasttest.MY_BROADCAST这条广播(但是这是两个程序)
3.回到BroadcastTest中点击触发广播的按钮,发现两次广播都被接收了。
疑问:这里创建的都是静态注册的广播,如果是动态的呢?
发送有序广播
回到BroadcastTest项目
1.修改MainActivity中代码:
public class MainActivity extends AppCompatActivity {...@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button= (Button) findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent("com.example.a51104.broadcasttest.MY_BROADCAST");sendOrderedBroadcast(intent,null);//发送有序广播,这样所有监听这条广播的广播接收器都可以接收到信息}});...}...
}
2.设置广播接收器的先后顺序,保证MyBroadcastReceiver一定比AnotherBroadcastReceiver先收到广播,修改AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.broadcasttest2"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme">...<receiverandroid:name=".MyBroadcastReceiver"android:enabled="true"android:exported="true"><intent-filter android:priority="100"><action android:name="com.example.broadcasttest.MY_BROADCAST"/></intent-filter></receiver></application>
</manifest>
我们通过android:priority设置了优先级,优先级越高的广播接收器就更先接收到广播。
3.为了显示有序广播的特点,我们在MyBroadcastReceiver中截断广播的传播,使得AnotherBroadcastReceiver接收不到广播,修改MyBroadcastReceiver代码:
//在MyBroadcastReceiver onReceive中添加abortBroadcast()表示将这条广播截断
public class MyBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();abortBroadcast();}
}
使用本地广播
前面我们发送和接收的广播权全部属于系统全局广播,即发出的广播可以被其他任何应用程序接收到儿,并且我们也可以接受来自于其他任何应用程序的广播。这样就很容易引起安全性的问题,比如说我们发送的一些携带关键性数据的广播很有可能被其他的应用程序截获,或者其他的程序不停地向我们广播接收器发送各种垃圾广播。
为了能够简单的解决广播的安全性问题,Android引入了一套本地广播机制,使用这个机制,发车广播只能够在应用程序内部进行传递,并且广播接收器只能接收来自本应用程序发出的广播,这样所有的安全性问题就都不存在了。
本地广播的用法并不复杂,主要是使用了一个LocalBroadcastManager来对广播进行管理,并提供了发送广播和注册广播接收器的方法。
实例
修改MainActivity中的代码:
public class MainActivity extends AppCompatActivity {private IntentFilter intentFilter;private LocalReceiver localReceiver;private LocalBroadcastManager localBroadcastManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);localBroadcastManager=LocalBroadcastManager.getInstance(this);//获取实例Button button= (Button) findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent("com.example.a51104.broadcasttest.LOCAL_BROADCAST");localBroadcastManager.sendBroadcast(intent);//发送本地广播}});intentFilter=new IntentFilter();intentFilter.addAction("com.example.a51104.broadcasttest.LOCAL_BROADCAST");localReceiver=new LocalReceiver();localBroadcastManager.registerReceiver(localReceiver,intentFilter);//注册本地广播监听器}@Overrideprotected void onDestroy() {super.onDestroy();localBroadcastManager.unregisterReceiver(localReceiver);}class LocalReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"received local broadcast",Toast.LENGTH_SHORT).show();}
}
}
其实大部分代码都和动态注册广播接收器以及发送广播的代码是一样的,但是注册、发送广播和取消注册都是通过本地广播管理器控制的。本地广播管理通过LocalBroadcastManager.getInstance(this)获取实例。这时这条广播只会在这个应用程序内部传递。
注:本地广播是无法通过静态注册的方式来接收的。因为静态注册主要就是为了让程序在未启动的情况下也能收到广播,而发送本地广播时,我们的程序是肯定已经启动了,因此也完全不需要使用静态注册的功能。我的理解是因为需要创建本地广播管理者,这个只能在程序中动态创建,所以广播是通过动态注册。
本地广播的优势
- 可以明确地知道正在发送的广播不会离开我们的程序,因此不必需要担心机密数据的泄露。
- 其他的程序无法将广播发送到我们程序的内部,因此不需要担心安全漏洞的隐患。
- 发送本地广播比发送系统全局广播将会更加高效
Android广播机制(2)相关推荐
- Android广播机制:Broadcast
转载:Android总结篇系列:Android广播机制 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广 ...
- android 广播观察者,作业三——观察者模式在Android广播机制上的应用
观察者模式在Android广播机制上的应用 点击跳转项目git地址:https://github.com/Arfer-ustc/practice-Android.git 一.观察者模式在Android ...
- Android怎么保证广播安全,Android 广播机制安全性研究.PDF
Android 广播机制安全性研究 电信 科 学 2016 年第 10 期 专题 :基 于 Android 系统 的终端安全 Android 广播机制安全性研究 卿 斯汉 1, 2, 3 (1. 中国 ...
- Android 广播机制详解
一.广播的简介 首先,当我们一听到广播这个词时.就可以想到小学是教室的广播.不错Android中的广播机制与我们生活中的广播是有异曲同工之妙的.Android中的发送广播也就像广播室播广播,可以让很多 ...
- 图解 Android 广播机制
从现实生活中理解广播机制 一听到广播我们第一感觉就会联想到小时候村里面的广播,每逢村里有什么活动都是通过广播发送的.收听收音机也是一种广播,在收音机中有很多个广播电台,每个广播电台播放的内容都不相同. ...
- android+广播+讲解,Android广播机制
主要内容: (1)广播机制介绍 (2)BroadcastReceiver实现 (3)BroadcastReceiver操作 (4)BroadcastReceiver生命周期 (5)注册Broadcas ...
- Android详细教程(基础篇):二十八、Android 广播机制BroadcastReceiver
广播机制(BroadcastReceiver) 11.1. BroadcastReceiver简介 在实际应用中,我们常需要等,等待系统抑或其他应用发出一道指令,为自己的应用擦亮明灯指明方向.而这种等 ...
- 图解 Android 广播机制-(by terry_龙)
从现实生活中理解广播机制 一听到广播我们第一感觉就会联想到小时候村里面的广播,每逢村里有什么活动都是通过广播发送的.收听收音机也是一种广播,在收音机中有很多个广播电台,每个广播电台播放的内容都不相同. ...
- android广播机制初步学习——短信黑名单
andriod广播机制中主要使用到的两个类:Broadcast和BroadcastReceiver.即一个发送一个接受. 发送的时候是用Intent来携带数据(广播)的,利用Intent中的标识来匹配 ...
- Android - 广播机制和Service
花了几天,想实现定位功能,使用的是百度的服务,有时真的很无奈,就是一小小个问题,就能折腾好几天. 首先,我是在主线程(Fragment)中单独进行定位,发现不起作用. 然后我想使用Service和广播 ...
最新文章
- html做旋转的五角星,如何用几何画板制作旋转的五角星
- 架设HmailServer邮件服务器以及webmail
- Android蓝牙开发
- Android 横竖屏切换的处理 (转载)
- 前端学习(3314):提取action
- 嫦娥回来了,还有哪些浪漫传说已经实现?
- 324. Wiggle Sort II
- 弱小无助!苹果或将出手救援屏幕供应商JDI
- 运维角度浅谈MySQL数据库优化
- SNMP原理及常用配置命令
- 解决RHEL6 vncserver 启动 could not open default font 'fixed'错误.
- 一台主机接两个显示器并独立使用_一台电脑如何满足多人同时使用?试试这招!...
- 基于java的客户关系管理系统
- 微波射频学习笔记18-------偶极子天线和微波天线设计介绍
- c++ - 虚函数表
- HDU - 6437
- c语言自动售货机实验报告,c语言自动售货机实验报告(15页)-原创力文档
- C语言值的引用传递—引用传递(地址传递)
- Outlook Express日常错误代码解析
- Python简单的操作excel表格