成都创新互联网站制作重庆分公司

android启动广播,android 自定义广播

Android本地广播的使用

为了解决广播的安全性问题,Android引入了本地广播机制,使用该机制发出的广播只能在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播。

创新互联是一家专业提供桃山企业网站建设,专注与成都网站设计、网站制作、H5技术、小程序制作等业务。10年已为桃山众多企业、政府机构等服务。创新互联专业网站制作公司优惠进行中。

本地广播是无法通过静态注册的方式来接收的。我们知道静态注册主要是为了在程序未启动的情况下能接收广播,而当我们发送本地广播的时候,程序肯定是已经启动的了,所以我们需要动态注册方式创建接收器。

在这里我们创建一个继承于BroadcastReceiver的类LocalReceiver。onReceive()处理你接收到的广播内容,在这里我用Toast来创建一个提示接收到消息的弹窗

在activity_main.xml文件创建一个用于发送广播的按钮

首先通过本地广播管理器LocalBroadcastManager的getInstance()方法获取一个实例,并分别创建过滤器IntentFilter和自定义接收器LocalReceiver的实例。给IntentFilter的实例添加一个action:localbroadcast(接收的广播的名称),然后调用LocalBroadcastManager的registerReceiver()方法进行注册,并将LocalReceiver的实例和IntentFilter的实例都传进去。这样本地监听器就创建完成了。

调用LocalBroadcastManager的sendBroadcast()发送本地广播。运行程序,点击Send Button按钮,我们可以看到弹窗显示“This is in LocalReceiver”,说明本地广播发送和接收成功了。

当然,我们最后一定不要忘了取消注册。我们可以通过调用unregisterReceiver()方法来实现。至此,Android的标准广播发送就完成了。

1.发送的广播只能在本程序内传递,不必担心数据泄露

2.其它程序广播无法发送到本程序的内部,不必担心安全漏洞隐患

3.本地广播比系统全局广播更加高效

Android 使用广播系统解决app开机自启动问题

关注 【网罗开发】微信公众号,回复【160】便可领取。

网罗天下方法,方便你我开发 ,更多Android技术干货等待领取,所有文档会持续更新,欢迎关注一起成长!

总结一下使用ACTION_BOOT_COMPLETED的广播,解决app开机自启动的问题

1.首先在你的工程上建一个广播接受的类,继承BroadcastReceiver:

2.然后要在AndroidManifest.xml中加入权限和配置相关信息:

3.在application标签中,配置以下相关信息:

补充说明:

1.查看系统中是否安装了类似360管家的软件,为了加快开机速度,默认是关闭掉开机广播的,只需要在设置中打开即可。

2.如果监听不到广播,可以尝试同时监听广播和sd卡。

3.同时监听广播和sd卡,在application标签中,配置以下相关信息:

说说Android的广播(1)

对于Activity的启动流程,我们已经有了几个版本的分析了。这里我们分析一个更容易一些的,四大组件中最简单的Broadcast Receiver。

关于Broadcast,有几点需要了解。首先是广播的类型,然后是广播的发送方法,最后是广播是如何被接收的。这三者相辅相承的,比如普通广播和有序广播只有在详细了解了广播的接收过程了之后,才能真正明白它的含义。

普通的广播是不在意顺序的,最简单的理解是同时可以收到这个广播。如果应用是动态注册这个广播的,且广播发送时这个进程还活着,那么当然可以并发的把广播尽快地传送出去是最好的。

但是,如果是通过AndroidManifest.xml静态注册的情况,也就是说这个广播首先要把一个进程启动起来,这时并发启动很多进程就是个问题了。Android目前的做法是,对这种静态的广播接收者,自动按有序广播的方式来串行处理。但是这对应用是透明的,应用不能假设系统已经把静态的无序广播当成有序广播来处理。

这个时候讲粘性广播有福了,因为从Android 5.0(API 21)开始,因为安全性的问题,官方已经正式废弃了粘性广播。

Context类提供两个方法可以用于发送普通广播:

差别是第二个设置权限。

发给特定的用户:

有序广播因为要处理消息的处理结果,所以要复杂一些。

如果只是想让广播可以按优先级来收取,并不在意处理的结果,可以用下面的版本:

同样,在多用户环境下,也可以选择给哪个用户发广播:

不管是普通的还是有序的广播都对应有粘性的版本:

以上的API都是定义于Context类中:

首先我们先看看发送端是如何发送的。

我们首先先放一个大图,让大家先有一个直观的印象,不管普通广播、有序广播、粘性广播如何组合,最终都汇集到一个大方法中。

我们先看应用发送普通广播的一个简单的例子:

非常简单,调用ContentWrapper的sendBroadcast方法就可以了。

然后我们顺藤摸瓜就好了。

Activity中的sendBroadcast,实际上调用的是:

我们来看frameworks/base/core/java/android/content/ContextWrapper.java中对sendBroadcast的定义:

ContextWrapper只是一个包装,真正的实现在ContextImpl中

我们来看/frameworks/base/core/java/android/app/ContextImpl.java中真正实现sendBroadcast的功能:

它会通过IPC去调用AMS的broadcastIntent。由于我们这个普通的广播的方法参数最少,所以好多都是传null。

加锁,定参数,然后调用真正的逻辑的实现。

我们先把broadcastIntentLocked的真正逻辑放一下,先看看有序广播是如何发送的。

ContextWrapper.sendOrderedBroadcast

Context是abstract方法,调用的是ContextWrapper的实现:

跟普通广播一样,还是会调用到ContextImpl.sendOrderedBroadcast

有序广播调用broadcastIntent的区别在于serialized参数,普通广播为false,有序广播为true.

原型为:

前面讲过带有回调的版本,我们看看它是如何实现的:

当然还是调用ContextImpl.sendOrderedBroadcast

这次变成只是一个封装了,它会调用一个更多参数的版本:

这次是一个全参数调用broadcastIntent的版本了,除了sticky就齐了

我们也不绕圈子了,直接看ContextImpl.sendStickyBroadcast.


网站栏目:android启动广播,android 自定义广播
网页URL:http://cxhlcq.com/article/dsgsehp.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部