我为Android-Platform实现了一个BroadcastReceiver
来检测设备电池是否充电。不幸的是,它似乎不能在安装了安卓10的设备上工作(Android 10是我对应用程序的最低要求)。
即使应用程序没有运行,我也需要触发这个BroadcastReceiver
。因此,隐式广播将是一个极好的选择,而不是在应用程序运行时注册BroadcastReceiver
。
在"AndoirdManifest.xml
“中设置权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BATTERY_STATS" />
我的PowerConnectedBroadcastReceiver看起来是这样的:
[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}");
}
}
我做错了什么?
任何建议都将不胜感激。
发布于 2022-09-03 18:36:57
来自广播接收机文档
针对Android8.0 (API级别26)或更高的应用程序可能不会静态地为隐式广播注册。应用程序仍然可以静态地注册一个显式广播。有一小部分不受此限制的隐式广播。这些异常在Android文档中的隐式广播异常指南中进行了描述。对隐式广播感兴趣的应用程序必须使用RegisterReceiver方法动态地这样做。下面将对此进行描述。
动态配准
[BroadcastReceiver(Enabled = true, Exported = true)]
public class PowerConnectedBroadcastReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
Console.WriteLine($"PowerConnectedBroadcastReceiver received an intent: {intent}");
}
}
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();
}
编辑
由于广播接收器是在活动中管理的,它具有活动的生命周期,如果您希望它出于某些原因继续运行,即使应用程序没有运行,那么我认为您应该在前台服务中注册/注销它。
相关问题:
额外的
当活动终止时,如果未注册广播接收器,将导致泄漏.UnregisterReceiver()
是在OnPause
中调用的,而不是OnDestry()
中的,因为不能保证调用后者。
https://stackoverflow.com/questions/73594341
复制相似问题