registerreceiverreceiver在manifest中注册和java注册有什么区别

registerreceiver  时间:2021-07-16  阅读:()

注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。

android中,不同进程之间传递信息要用到广播,可以有两种方式来实现。

第一种方式:在Manifest.xml中注册广播,是一种比较推荐的方法,因为它不需要手动注销广播(如果广播未注销,程序退出时可能会出错)。

具体实现在Manifest的application中添加: 上面两个android:name分别是广播名和广播的动作(这里的动作是表示系统启动完成),如果要自己发送一个广播,在代码中为: Intent i = new Intent(“android.intent.action.BOOT_COMPLETED”); sendBroadcast(i); 这样,广播就发出去了,然后是接收。

接收可以新建一个类,继承至BroadcastReceiver,也可以建一个BroadcastReceiver的实例,然后得写onReceive方法,实现如下: protected BroadcastReceiver mEvtReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(“android.intent.action.BOOT_COMPLETED”)) { //Do something } } }; 第二种方式,直接在代码中实现,但需要手动注册注销,实现如下: IntentFilter filter = new IntentFilter(); filter.addAction(“android.intent.action.BOOT_COMPLETED”); registerReceiver(mEvtReceiver, filter); //这时注册了一个recevier ,名为mEvtReceiver,然后同样用上面的方法以重写onReceiver, 最后在程序的onDestroy中要注销广播,实现如下: @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(mPlayerEvtReceiver); }

如何写注册接收android系统广播消息的插件

简单的广播接收器 实现一个最简单的广播接收器需要继承BroadcastReceiver类,并且还要实现OnReceive方法,我们可以在项目中新建一个MainReceiver类,然后写入如下代码: 1 public class MainReceiver : BroadcastReceiver 2 { 3 public override void OnReceive(Context context, Intent intent) 4 { 5 6 } 7 } 上面其实已经实现了一个简单的广播接收器,并且可以使用。

我们还需要注册广播接收器,否则广播接收器就无法接收广播,所以我们需要在MainActivity.cs中注册这个广播接收器。

当然为了能够接近现实,我们需要在OnResume中注册,在OnPause中注销。

首先我们在OnResume中注册 1 protected override void OnResume() 2 { 3 base.OnResume(); 4 receiver = new MainReceiver(); 5 RegisterReceiver(receiver, new IntentFilter(".main.receiver")); 6 } 接着我们在OnPause中注销 1 protected override void OnPause() 2 { 3 base.OnPause(); 4 UnregisterReceiver(receiver); 5 } 全部代码如下所示 View Code 注册好了广播接收器,我们还需要一个能够发送广播的地方,既然我们说了这节重点解决的是服务与活动的通信,那么我们就实现一个服务来发送广播。

为了能够贴近现实,我们的服务中将会新建一个线程,让这个线程发送一个广播给这个广播接收器。

1 [Service] 2 public class MainService : Service 3 { 4 public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) 5 { 6 new Thread(() => 7 { 8 Thread.Sleep(1000); 9 var sintent = new Intent(".main.receiver"); 10 sintent.PutExtra("_str", "来自服务"); 11 SendBroadcast(sintent); 12 }).Start(); 13 return StartCommandResult.Sticky; 14 } 15 16 public override IBinder OnBind(Intent intent) 17 { 18 return null; 19 } 20 } 这里我们通过意图传递了一个参数,而在服务中发送广播的方法是SendBroadcast。

其实我们可以看到在创建意图的时候传入了一个字符串,而这个字符串必须与注册广播接收器时指定的字符串一致,否则对应的广播接收器是无法接收到这个广播的,下面我们修改广播接收器的OnReceive方法,以便获取传递过来的字符串并显示。

1 public override void OnReceive(Context context, Intent intent) 2 { 3 string str = intent.GetStringExtra("_str"); 4 new Handler().Post(() => 5 { 6 Toast.MakeText(Application.Context, str, ToastLength.Long).Show(); 7 }); 8 } 其中我们通过意图的GetXXXX方法获取传递过来的参数,然后创建了一个Handler对象并使用Toast发送了一个提示,这里使用Handler是为了与UI线程同步。

因为前面讲过只用UI线程才能够访问控件等等对象,而这里并没有RunOnUiThread方法,所以我们需要使用Handler对象的Post方法来实现。

最后有了服务还不行,我们还需要开启这个服务。

当然我们依然还是要在OnResume中开启,在OnPause中暂停。

1 protected override void OnResume() 2 { 3 base.OnResume(); 4 receiver = new MainReceiver(); 5 RegisterReceiver(receiver, new IntentFilter(".main.receiver")); 6 StartService(new Intent(this, typeof(MainService))); 7 } 8 9 protected override void OnPause() 10 { 11 base.OnPause(); 12 UnregisterReceiver(receiver); 13 Service(new Intent(this, typeof(MainService))); 14 }

怎么取消一个静态注册的broadcast receiver

BroadcastReceiver是一个用于监听应用程序运行环境变化,并且对变化事件作出响应的组件。

譬如说,当电池电量低、SD卡拔插或者手机启动完毕等等事件发生的时候,系统都会广播相应的事件,那么,我们在应用程序中就可以利用BroadcastReceiver对这些事件进行监听,并且执行onReceive方法作出相应的处理。

  我们可以通过两种方式注册BroadcastReceiver,一是在Activity启动过程中通过代码动态注册,二是在AndroidManifest.xml文件中利用<receiver>标签进行静态注册。

对于第一种方法,我们需要养成一个良好的习惯:在Activity进入停止或者销毁状态的时候使用unregisterReceiver方法将注册的BroadcastReceiver注销掉。

基于此,我们很自然就会想,如果通过第二种方法注册的BroadcastReceiver,是否需要通过代码进行注销呢?基于这个问题,Michael在OPhoneSDN上提出这个疑问。

  最后,Michael还是从Android的源代码中找到了这样的注释:If this BroadcastReceiver was launched through a <receiver> tag, then the object is no longer alive after returning from this function. This means you should not perform any operations that return a result to you asynchronously. 这段文字告诉我们:如果通过<receiver>标签来注册的BroadcastReceiver,那么该对象的实例在onReceive被调用之后就会在任意时间内被销毁。

也就是说,我们并需要担心静态注册的BroadcastReceiver的销毁问题。

receiver在manifest中注册和java注册有什么区别

receiver在manifest中注册和java注册也就是说receiver的静态注册和动态注册 注册方式 动态注册:代码注册: 生命创建的receiver 通过IntentFilter创建并添加action 通过registerReceiver(receiver, filter)注册 静态注册: AndroidManifest.xml 中注册通过 receiver -intent-filter-action 标签 recer是标明这是个广播 intent-filter标明action可用 action就是我们的广播标识 常驻与非常驻 静态时常驻形,动态是非常驻形 动态注册时候如果在Activity.onResume()动态注册一个接收器,你应该在 Activity.onPause()取消它的活动。

registerReceiver是android.content.ContextWrapper类中的方法,Activity和Service都继承了ContextWrapper,所以可以直接调用。

如果我们在Activity或Service中注册了一个BroadcastReceiver,当这个Activity或Service被销毁时如果没有解除注册,系统会报一个异常,提示我们是否忘记解除注册了,所以要在暂停的时候给她取消活动。

CYUN(29元/月)美国、香港、台湾、日本、韩国CN2,续费原价

关于CYUN商家在之前有介绍过一次,CYUN是香港蓝米数据有限公司旗下的云计算服务品牌,和蓝米云、蓝米主机等同属该公司。商家主要是为个人开发者用户、中小型、大型企业用户提供一站式核心网络云端部署服务,促使用户云端部署化简为零,轻松快捷运用云计算。目前,CYUN主要运营美国、香港、台湾、日本、韩国CN2线路产品,包括云服务器、站群服务器和独立服务器等。这次看到CYUN夏季优惠活动发布了,依然是熟悉的...

CheapWindowsVPS:7个机房可选全场5折,1Gbps不限流量每月4.5美元

CheapWindowsVPS是一家成立于2007年的老牌国外主机商,顾名思义,一个提供便宜的Windows系统VPS主机(同样也支持安装Linux系列的哈)的商家,可选数据中心包括美国洛杉矶、达拉斯、芝加哥、纽约、英国伦敦、法国、新加坡等等,目前商家针对VPS主机推出5折优惠码,优惠后最低4GB内存套餐月付仅4.5美元。下面列出几款VPS主机配置信息。CPU:2cores内存:4GB硬盘:60G...

Hostodo商家提供两年大流量美国VPS主机 可选拉斯维加斯和迈阿密

Hostodo商家算是一个比较小众且运营比较久的服务商,而且还是率先硬盘更换成NVMe阵列的,目前有提供拉斯维加斯和迈阿密两个机房。看到商家这两年的促销套餐方案变化还是比较大的,每个月一般有这么两次的促销方案推送,可见商家也在想着提高一些客户量。毕竟即便再老的服务商,你不走出来让大家知道,迟早会落寞。目前,Hostodo有提供两款大流量的VPS主机促销,机房可选拉斯维加斯和迈阿密两个数据中心,且都...

registerreceiver为你推荐
显卡挖矿啥意思挖矿是什么意思 和显卡有什么关联0x80070005win7怎样解决0x80070005错误?settimerMFC 中,全局SetTimer函数怎么用?溢出隐藏overflow:hidden是什么意思?查字网“很”去掉双人旁读什么?qq注册账号用QQ注册有几种方法?arc是什么意思数学中的arctan是什么意思调度系统配送调度系统是干嘛的?是手机还是电脑的系统?调度系统现在有很多人说同城调度系统,这是用来干嘛的呀?索引超出了数组界限索引超出了数组界限
高防直连vps 免费域名跳转 如何注册中文域名 互联网域名管理办法 电信测速器 美国主机代购 香港新世界电讯 小米数据库 福建天翼加速 坐公交投2700元 40g硬盘 权嘉云 刀片服务器的优势 爱奇艺vip免费试用7天 美国堪萨斯 metalink 789电视剧 超级服务器 彩虹云 宏讯 更多