如何在不同的项目 Xamarin 项目中包含 BroadcastReceiver?

How to include a BroadcastReceiver in a different project Xamarin project?

我正在 Xamarin 中编写一个跨平台解决方案,并准备为第 3 方集成添加一个母项目(例如,其他 Android 方想要使用 intents 与我的应用程序集成仅在 Android 上)。

但我想保留我现在的跨平台设置 "clean" 并简单地添加一个新的 Android class 库和第 3 方集成代码。但是,我似乎无法将我的第 3 方集成项目中的 BroadcastReceiver 包含在我的 "main" android 应用程序项目中。

我已经添加了对第 3 方集成项目的引用,但这显然是不够的...我可以只在主 Android-app 项目中添加我的 BroadcastReceiver,那将是我想一切都很好,但我真的很想将第 3 方的东西隔离开来,因为我可以很好地想象将来为其他目的添加其他集成机制,然后也希望将它们保留在另一个项目中。

有什么建议吗?目前,在编译主 android 项目时,第三方项目似乎甚至没有自动编译。

编辑;

我的 BroadcastReceiver 使用属性作为 "recommended";

[BroadcastReceiver(Enabled = true)]
[IntentFilter(new[] { "se.millsys.integration.MyIntegrationIntent" })]
public class IntegrationBroadcastReceiver : BroadcastReceiver
{
    private static string DEBUG_TAG = "IntegrationBroadcastReceiver";

    public override void OnReceive(Context context, Intent intent)
    {
    }
}

假设此设置:

├── DroidMainApp
│   └── MyBroadcastReceiver (A Project level reference to DroidMainApp)
├── ADifferentApp

DroidMainApp

  • 已创建模板 Android 应用程序
  • com.sushihangover.toaster
  • 的软件包名称

MyBroadcastReceiver

  • 模板已创建Android图书馆项目
  • 包含一个 C# file/class
  • BroadcastReceiver 被命名为 com.sushihangover.toaster.receiver
  • BroadcastReceiver 是 EnabledExported
[BroadcastReceiver(Name = "com.sushihangover.toaster.receiver", Enabled = true, Exported = true)]
public class Toaster : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        Toast.MakeText(context, "Go make some toast", ToastLength.Long).Show();
        Log.Info("SO", "Go make some toast");
    }
}

一个不同的应用调用 DroidMainApp 的 BroadcastReceiver:

  • 使用 Explicit 意图
var toasterIntent = new Intent();
toasterIntent.SetClassName("com.sushihangover.toaster", "com.sushihangover.toaster.receiver");
var pendingIntent = PendingIntent.GetBroadcast(this, 0, toasterIntent, PendingIntentFlags.CancelCurrent);
var alarmService = (AlarmManager)GetSystemService(Context.AlarmService);
alarmService.SetRepeating(AlarmType.Rtc, 1000, 60000, pendingIntent);