我下面的代码不适用于androind 8.0+,但在8.0之前可以使用。 因此,似乎将其视为隐式广播。
[BroadcastReceiver(Enabled = true, Exported = true)]
[IntentFilter(new[] { "notpackagename.com.IntentReceiver.MySampleBroadcastReceiver" })]
public class MySampleBroadcastReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
String value = intent.GetStringExtra("key");
Console.WriteLine(value);
}
}
var intent = new Intent("notpackagename.com.IntentReceiver.MySampleBroadcastReceiver");
intent.PutExtra("key", "MySampleBroadcastReceiver");
SendBroadcast(intent);
我想知道什么是显式广播或隐式广播?
因为我需要该应用在未运行时接收消息,如下所示:
https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/broadcast-receivers
清单注册接收者与清单接收者之间的主要区别 上下文注册的接收者是上下文注册的接收者 仅在应用程序运行时对广播做出响应 清单注册的接收者可以响应广播,即使 该应用程序可能未运行。
https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/broadcast-receivers
Android识别两种广播类型:
显式广播-这些类型的广播针对特定的 应用。显式广播的最常见用法是开始 一个活动。应用程序需要进行显式广播的示例 拨打电话号码;它将分派针对手机的Intent Android上的应用程序,并传递要拨打的电话号码。安卓系统 然后会将意图路由到“电话”应用。
隐式广播–这些广播被分发到上的所有应用 装置。隐式广播的一个示例是 ACTION_POWER_CONNECTED意图。每次发布此意图 Android检测到设备上的电池正在充电。安卓系统 会将此意图路由到已为此目的注册的所有应用 事件。
更新
如果我错了,请纠正我:
根据下面的描述,上面的MySampleBroadcastReceiver
是清单注册的接收者,因此它应该能够接收消息。但这甚至没有用。我必须将其更改为动态注册。
意图过滤器用于注册广播接收器,以便 Android可以正确路由消息。意图过滤器可以是 在运行时指定(有时称为 上下文注册的接收者或作为动态注册),也可以是 在Android清单中静态定义(清单清单 接收器)。
https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/broadcast-receivers
答案 0 :(得分:0)
什么是显式广播或隐式广播?
明确广播
发送的Intent是广播,其中显示了Intent。通过指定Intent组件的名称,通常用于了解目标组件的名称,以调用以下方法。意图很明确,指定了要激活的组件,通常在同一应用程序中实现。
Intent.setComponent()
Intent.setClassName()
Intent.setClass()
new Intent(A.this,B.class)
隐性广播
由意图过滤器实现,该过滤器通常在未明确指示目标组件名称的情况下使用。 Android系统将根据隐式意图中设置的操作,类别,数据(URI和数据类型)找到最合适的组件,从而处理此意图。通常在不同的应用程序之间使用
您的代码是明确广播的
我需要该应用在未运行时接收消息
根据我的研究,无法在“显式广播”中实现,如果关闭了应用程序,则“显式广播”将被关闭。
如果要实现应用程序从服务器接收消息并且Android系统不会关闭该消息,建议您像此链接一样在前台启动服务。 How to create service doing work at period time in Xamarin.Forms?