【问题标题】:BroadcastReceiver must provide a public default constructor - Xamarin.AndroidBroadcastReceiver 必须提供公共默认构造函数 - Xamarin.Android
【发布时间】:2020-09-21 16:42:24
【问题描述】:

好的,我正在运行一个广播接收器:

public class SyncServiceBroadcastReceiver : BroadcastReceiver
{
    public static string syncStarted = "SyncRuns";

    private readonly PendingOrdersActivity pendingOrdersActivity;

    public SyncServiceBroadcastReceiver(PendingOrdersActivity pendingOrdersActivity)
    {
        this.pendingOrdersActivity = pendingOrdersActivity;
    }

    public override void OnReceive(Context context, Intent intent)
    {
        this.pendingOrdersActivity.RefreshPendingOrdersOnSync();

        Toast.MakeText(context, "Datele se actualizează...", ToastLength.Short).Show();
    }
}

每次命中时,我都希望它从活动中运行一个方法(方法 RefreshPendingOrdersOnSync)。这就是为什么我创建了一个接受活动的构造函数。

在我注册 BroadcastReceiver 的活动中,在 OnResume 方法中,通过传入“this”:

 var filter = new IntentFilter(SyncServiceBroadcastReceiver.syncStarted);
 filter.AddCategory(Intent.CategoryDefault);
 this.syncServiceBroadcastReceiver = new SyncServiceBroadcastReceiver(this);
 this.RegisterReceiver(this.syncServiceBroadcastReceiver, filter);

不过,在 Receiver 部分,它给出了标题中的错误.... 如果我添加一个空的构造函数,我怀疑它会通过那里并且 OnReceive 中的这一行会中断,因为 this.pendingOrdersActivity 是 null

this.pendingOrdersActivity.RefreshPendingOrdersOnSync();

我很困惑为什么

【问题讨论】:

标签: c# android xamarin


【解决方案1】:

BroadcastReceiver 必须提供一个公共的默认构造函数

需要默认的构造方法。因为在使用AndroidManifest.xml注册BroadcastReceiver时,Android使用反射来实例化接收器,需要一个默认的构造函数。

参考:https://stackoverflow.com/a/14266261/11083277

如果我添加一个空构造函数,我怀疑它会通过那里并且 OnReceive 中的这一行会中断

我测试了一个基本的演示来测试代码,添加了默认的构造函数方法,代码工作正常。参数化的构造函数将被执行。你在AndroidManifest.xml注册了接收者吗?如果是这样,请尝试在代码中完成这项工作。

[BroadcastReceiver]
public class CustomReceiver : BroadcastReceiver
{
    private readonly MainActivity activity;

    public CustomReceiver()
    {
    }

    public CustomReceiver(MainActivity activity)
    {
        this.activity = activity;
    }
    public override void OnReceive(Context context, Intent intent)
    {
        activity.method();
    }
}

活动类

public class MainActivity : AppCompatActivity
{
    CustomReceiver receiver;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        SetContentView(Resource.Layout.activity_main);

        receiver = new CustomReceiver(this);
    }
    public void method()
    {
        ...
    }

    protected override void OnResume()
    {
        base.OnResume();
        RegisterReceiver(receiver, new IntentFilter("package_name"));
    }

    protected override void OnDestroy()
    {
        base.OnDestroy();
        UnregisterReceiver(receiver);
    }
}

【讨论】:

  • 活动课呢?我贴出了activity类的代码,大家可以参考一下。
  • 是一样的。当服务运行时我正在广播。也许这是问题所在? (对不起,我正在发送图片,在 cmets 中更容易)i.imgur.com/2rq5MRQ.png
  • 基本上,我从活动中注册它(传递给它) - 但我从服务中使用它(每次服务运行时我都在广播 - 每 x 分钟)
  • 是的,通过空构造函数初始化接收器是来自服务。但是如果我这样广播: this.SendBroadcast(new Intent(SyncServiceBroadcastReceiver.syncRuns)); - 应用停止响应 :((
  • var broadcastIntent = new Intent(this,typeof(SyncServiceBroadcastReceiver)); 中的“this”是服务而不是 PendingOrdersActivity 类。但是自定义接收器类中 OnReceive 的上下文应该是 PendingOrdersActivity 类的类型。尝试将代码更改为var broadcastIntent = new Intent(typeof(PendingOrdersActivity),typeof(SyncServiceBroadcastReceiver));
猜你喜欢
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多