首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >.Net Maui BroadcastReceiver没有收到任何东西

.Net Maui BroadcastReceiver没有收到任何东西
EN

Stack Overflow用户
提问于 2022-09-03 17:51:31
回答 1查看 219关注 0票数 1

我为Android-Platform实现了一个BroadcastReceiver来检测设备电池是否充电。不幸的是,它似乎不能在安装了安卓10的设备上工作(Android 10是我对应用程序的最低要求)。

即使应用程序没有运行,我也需要触发这个BroadcastReceiver。因此,隐式广播将是一个极好的选择,而不是在应用程序运行时注册BroadcastReceiver

在"AndoirdManifest.xml“中设置权限

代码语言:javascript
运行
复制
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BATTERY_STATS" />

我的PowerConnectedBroadcastReceiver看起来是这样的:

代码语言:javascript
运行
复制
    [BroadcastReceiver(Enabled = true, Exported = true)]
    [IntentFilter(new[] { Intent.ActionPowerConnected, Intent.ActionPowerDisconnected, Intent.ActionDockEvent, Intent.ActionBatteryChanged }, Priority = (int)IntentFilterPriority.HighPriority)]
    public class PowerConnectedBroadcastReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            Console.WriteLine($"PowerConnectedBroadcastReceiver received an intent: {intent}");
        }
    }  

我做错了什么?

任何建议都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-03 18:36:57

来自广播接收机文档

针对Android8.0 (API级别26)或更高的应用程序可能不会静态地为隐式广播注册。应用程序仍然可以静态地注册一个显式广播。有一小部分不受此限制的隐式广播。这些异常在Android文档中的隐式广播异常指南中进行了描述。对隐式广播感兴趣的应用程序必须使用RegisterReceiver方法动态地这样做。下面将对此进行描述。

动态配准

代码语言:javascript
运行
复制
 [BroadcastReceiver(Enabled = true, Exported = true)]
    public class PowerConnectedBroadcastReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            Console.WriteLine($"PowerConnectedBroadcastReceiver received an intent: {intent}");
        }
    }
代码语言:javascript
运行
复制
PowerConnectedBroadcastReceiver receiver;
IntentFilter intentFilter;

protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        receiver = new();
        intentFilter = new(Intent.ActionPowerConnected);

        intentFilter.AddAction(Intent.ActionPowerDisconnected);
        intentFilter.AddAction(Intent.ActionDockEvent);
        intentFilter.AddAction(Intent.ActionBatteryChanged);
        intentFilter.Priority = (int)IntentFilterPriority.HighPriority;
    }

    protected override void OnResume()
    {
        base.OnResume();
        RegisterReceiver(receiver, intentFilter);
    }

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

编辑

由于广播接收器是在活动中管理的,它具有活动的生命周期,如果您希望它出于某些原因继续运行,即使应用程序没有运行,那么我认为您应该在前台服务中注册/注销它。

相关问题:

安卓系统以BroadcastReceiver为背景

如何使广播接收机在后台运行?

额外的

当活动终止时,如果未注册广播接收器,将导致泄漏.UnregisterReceiver()是在OnPause中调用的,而不是OnDestry()中的,因为不能保证调用后者。

Activity ()并不总是被调用,如果被调用,只执行部分代码

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73594341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档