我的代码在Android 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识别两种类型的广播:
显式广播 - 这些类型的广播以特定应用为目标。显式广播的最常见用途是启动活动。应用程序需要拨打电话号码时显式广播的示例;它将发送一个针对Android手机应用程序的Intent并传递要拨打的电话号码。 Android然后将意图路由到手机应用程序。
隐式广播 - 这些广播将分发到设备上的所有应用程序。隐式广播的一个示例是ACTION_POWER_CONNECTED意图。每次Android检测到设备上的电池正在充电时,都会发布此意图。 Android会将此意图发送给已注册此活动的所有应用。
更新
如果我错了,请纠正我:
根据下面的描述,上面的MySampleBroadcastReceiver
是清单注册的接收器,因此它应该能够接收消息。但它甚至没有工作。我必须将其更改为动态注册。
意图过滤器用于注册广播接收器,以便Android可以正确地路由消息。意图过滤器可以在运行时指定(这有时称为上下文注册的接收器或动态注册),也可以在Android Manifest(清单注册的接收器)中静态定义。
https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/broadcast-receivers
什么被定义为显式广播或隐式广播?
明确的广播
发送的Intent是显示Intent的广播。通过指定Intent组件的名称,它通常用于知道目标组件的名称,以调用以下方法。目的很明确,指定要激活哪个组件,这通常在同一个应用程序中实现。
Intent.setComponent()
Intent.setClassName()
Intent.setClass()
new Intent(A.this,B.class)
隐含广播
它由Intent Filter实现,通常在没有明确指示目标组件名称的情况下使用。 Android系统将通过根据隐式intent中设置的操作,类别,数据(URI和数据类型)查找最合适的组件来处理此意图。通常用于不同的应用程序
您的代码是显式广播
我需要应用程序在它未运行时接收消息
根据我的研究,它无法在显式广播中实现,如果应用程序已关闭,则显式广播将被关闭。
如果你想从服务器获得应用程序接收消息并且它不会被Android系统关闭,我建议你像这个链接一样在前台启动服务。 How to create service doing work at period time in Xamarin.Forms?