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被销毁时如果没有解除注册,系统会报一个异常,提示我们是否忘记解除注册了,所以要在暂停的时候给她取消活动。

Sharktech:美国/荷兰独立服务器,10Gbps端口/不限流量/免费DDoS防护60G,319美元/月起

sharktech怎么样?sharktech (鲨鱼机房)是一家成立于 2003 年的知名美国老牌主机商,又称鲨鱼机房或者SK 机房,一直主打高防系列产品,提供独立服务器租用业务和 VPS 主机,自营机房在美国洛杉矶、丹佛、芝加哥和荷兰阿姆斯特丹,所有产品均提供 DDoS 防护。此文只整理他们家10Gbps专用服务器,此外该系列所有服务器都受到高达 60Gbps(可升级到 100Gbps)的保护。...

PQS彼得巧 年中低至38折提供台湾彰化HiNet线路VPS主机 200M带宽

在六月初的时候有介绍过一次来自中国台湾的PQS彼得巧商家(在这里)。商家的特点是有提供台湾彰化HiNet线路VPS主机,起步带宽200M,从带宽速率看是不错的,不过价格也比较贵原价需要300多一个月,是不是很贵?当然懂的人可能会有需要。这次年中促销期间,商家也有提供一定的优惠。比如月付七折,年付达到38折,不过年付价格确实总价格比较高的。第一、商家优惠活动年付三八折优惠:PQS2021-618-C...

搬瓦工:新增荷兰机房 EUNL_9 测评,联通 AS10099/AS9929 高端优化路线/速度 延迟 路由 丢包测试

搬瓦工最近上线了一个新的荷兰机房,荷兰 EUNL_9 机房,这个 9 的编号感觉也挺随性的,之前的荷兰机房编号是 EUNL_3。这次荷兰新机房 EUNL_9 采用联通 AS9929 高端路线,三网都接入了 AS9929,对于联通用户来说是个好消息,又多了一个选择。对于其他用户可能还是 CN2 GIA 机房更合适一些。其实对于联通用户,这个荷兰机房也是比较远的,相比之下日本软银 JPOS_1 机房可...

registerreceiver为你推荐
元数据管理请元数据管理包括哪些内容?bloomfilterJAVA怎么弄爬虫qq号查询现成的qq号和密码查询拓扑关系什么是空间数据的拓扑关系jdk6jdk-6u14-windows-i586.exe是什么,具体点,谢谢jdk6java—JDK6,在SUN公司官网下载的链接,rownumbersql server 2005中row_number怎么用radius认证电信或网通的RADIUS认证都记录些什么?谁能说说ISP的宽带帐号检查流程微信论坛手机微信论坛如何实现booth算法用Booth算法计算-4×3的4位补码乘法运算,要求写出每一步运算过程及运算结果 麻烦详细说明每一步的操作
河南虚拟主机 中文域名查询 免费注册网站域名 openv technetcal directspace enzu 便宜服务器 edis 线路工具 元旦促销 admit的用法 泉州移动 国外代理服务器软件 isp服务商 服务器干什么用的 能外链的相册 登陆空间 中国电信网络测速 smtp服务器地址 更多