为什么BroadcastReceiver需要一个默认构造函数

本文关键字:一个 默认 构造函数 BroadcastReceiver 为什么 | 更新日期: 2023-09-27 17:51:12

我创建了一个BroadcastReceiver,它是由一个Service构造的。BroadcastReceiver需要与Service交互,因此我将this传递给构造函数。添加[BroadcastReceiver]-属性并尝试编译(使用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将无法正常工作)?

为什么BroadcastReceiver需要一个默认构造函数

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

看起来您正在使用Context.registerReceiver在代码中注册您的广播接收器。在这种情况下,你不需要在AndroidManifest

中添加receiver标签。