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

JUSTG(5.99美元/月)最新5折优惠,KVM虚拟虚拟512Mkvm路线

Justg是一家俄罗斯VPS云服务器提供商,主要提供南非地区的VPS服务器产品,CN2高质量线路网络,100Mbps带宽,自带一个IPv4和8个IPv6,线路质量还不错,主要是用户较少,带宽使用率不高,比较空闲,不拥挤,比较适合面向非洲、欧美的用户业务需求,也适合追求速度快又需要冷门的朋友。justg的俄罗斯VPS云服务器位于莫斯科机房,到美国和中国速度都非常不错,到欧洲的平均延迟时间为40毫秒,...

TmhHost暑假活动:高端线路VPS季付8折优惠,可选洛杉矶CN2 GIA/日本软银/香港三网CN2 GIA/韩国双向CN2等

tmhhost怎么样?tmhhost正在搞暑假大促销活动,全部是高端线路VPS,现在直接季付8折优惠,活动截止时间是8月31日。可选机房及线路有美国洛杉矶cn2 gia+200G高防、洛杉矶三网CN2 GIA、洛杉矶CERA机房CN2 GIA,日本软银(100M带宽)、香港BGP直连200M带宽、香港三网CN2 GIA、韩国双向CN2。点击进入:tmhhost官方网站地址tmhhost优惠码:Tm...

Dataideas:$1.5/月KVM-1GB/10G SSD/无限流量/休斯顿(德州)_主机域名

Dataideas是一家2019年成立的国外VPS主机商,提供基于KVM架构的VPS主机,数据中心在美国得克萨斯州休斯敦,主机分为三个系列:AMD Ryzen系列、Intel Xeon系列、大硬盘系列,同时每个系列又分为共享CPU和独立CPU系列,最低每月1.5美元起。不过需要注意,这家没有主页,你直接访问根域名是空白页的,还好他们的所有套餐支持月付,相对风险较低。下面以Intel Xeon系列共...

registerreceiver为你推荐
swooleswoole和workerman哪个更易开发微信收款语音播报怎么设置怎么修改微信收款提示音wmiprvsewmiprvse知识库管理系统知识库管理软件与档案管理软件有什么区别oncontextmenuoncontextmenu="return false"是什么意思oracle索引Oracle中有多少种索引类型拓扑关系拓扑关系在GIS中的作用索引超出了数组界限什么是索引超出了数组界限丁奇海贼王里“D”的意思是什么?booth算法利用补码booth计算【xy】补,其中x=0.1110,y=-0.1101
com域名注册 查询ip地址 域名解析文件 sharktech enom blackfriday java主机 香港主机 godaddy续费优惠码 12u机柜尺寸 美国php空间 免费博客空间 主机合租 促正网秒杀 双拼域名 bgp双线 789电视网 腾讯实名认证中心 in域名 免费mysql数据库 更多