为啥 BroadcastReceiver 需要一个默认构造函数?

Posted

技术标签:

【中文标题】为啥 BroadcastReceiver 需要一个默认构造函数?【英文标题】:Why does BroadcastReceiver need a default constructor?为什么 BroadcastReceiver 需要一个默认构造函数? 【发布时间】:2012-12-25 07:25:14 【问题描述】:

我创建了一个由 Service 构建的 BroadcastReceiver。 BroadcastReceiver 需要与Service 交互,所以我将this 传递给构造函数。添加 [BroadcastReceiver]-Attribute 并尝试编译(使用 MonoDevelop)后,我得到了

D:\Programme\MSBuild\Novell\Novell.MonoDroid.Common.targets(3,3): Error MSB4018: Unerwarteter Fehler bei der GenerateJavaStubs-Aufgabe.

System.InvalidOperationException: The type 'keepass2android.TimeoutService/MyBroadcastReceiver' needs to have a public default constructor.
   at Xamarin.Android.Tasks.ManifestDocument.Merge(List`1 subclasses, List`1 selectedWhitelistAssemblies, Boolean embed)
   at Xamarin.Android.Tasks.GenerateJavaStubs.Execute()
   at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   at Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask(ITaskExecutionHost taskExecutionHost, TaskLoggingContext taskLoggingContext, TaskHost taskHost, ItemBucket bucket, TaskExecutionMode howToExecuteTask, Boolean& taskResult) (MSB4018) (keepass2android)

为什么 Mono for Android 需要这个默认构造函数?它是否会使用默认构造函数创建我的 BroadcastReceiver(在这种情况下,BroadcastReceiver 将无法正常工作)?

【问题讨论】:

【参考方案1】:

仅当您使用AndroidManifest 注册BroadcastReceiver 时才需要。 Android 使用反射来实例化接收器,它需要一个默认构造函数(否则它不知道应该传递哪些参数)。

您似乎正在使用Context.registerReceiver 在代码中注册广播接收器。在这种情况下,您不需要在AndroidManifest 中添加receiver 标记

【讨论】:

如何以编程方式执行“exported=true”?我需要它,因为我想为我的 BroadcastReceiver 提供构造函数参数。

以上是关于为啥 BroadcastReceiver 需要一个默认构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥Android要使用各种BroadcastReceiver

为啥动态注册的BroadCastReceiver在其进程死亡后无法接收广播?

BroadcastReceiver详解(基础篇)

BroadcastReceiver

解析BroadcastReceiver之你需要了解的一些东东

为啥 GCM 推送通知会重复?