我有一个 BroadcastReceiver,它会在设备重启时启动前台服务。
这是代码:
[BroadcastReceiver(Enabled = true, Exported = true)]
[IntentFilter(new[] { Intent.ActionBootCompleted })]
public class ActionBootCompletedBroadcastReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
if (intent.Action == Intent.ActionBootCompleted)
{
ServicioConfiguracion miServicioConfiguracion = new ServicioConfiguracion();
bool miBlMyParamter = miServicioConfiguracion.GetParameter();
if (miBlMyParameter == true)
{
var foreGroundServiceIntent = new Intent(Android.App.Application.Context, typeof(MyForegroundService));
Android.App.Application.Context.StartForegroundService(intent);
context.StartForegroundService(foreGroundServiceIntent);
}
}
}
}
这是读取应用程序配置值的配置管理器的代码:
public bool GetParameter()
{
return Preferences.Default.Get<bool>("MyParameter", false);
}
问题是BroadCastReceiver似乎无法获取参数的值,因为如果我评论确定是否启动前台服务的if,它就会启动。
我遇到的另一个问题是我不知道如何调试 BroadcastReceiver,因为当设备重新启动时,调试器会停止。
我的想法是用户可以在应用程序中配置设备启动时是否启动前台服务。
如何在 BroadCastReceiver 中获取应用程序的配置值?
谢谢。
由于某些原因,我无法使用adb命令发送广播,所以我使用了Toast来显示结果:
[BroadcastReceiver(Exported = true)]
[IntentFilter(new[] {Intent.ActionBootCompleted})]
public class MyReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
var a = Preferences.Default.Get<bool>("Test", false);
Toast.MakeText(context, a.ToString(), ToastLength.Long).Show();
}
}
并在MainActivity中设置值:
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Preferences.Default.Set<bool>("Test", true);
}
结果图:
更新1:
我成功地在visual studio中使用了adb。首先点击Tools->Android->Android Adb Command Prompt打开adb命令面板
然后使用
adb root
命令进入root模式。在此之后,我可以发送启动完成的广播。
另外,如果想在后台启动前台服务(设备启动完成后),可以在AndroidManifest.xaml中添加如下权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND" />
我在重启模拟器android api 33的时候可以在OnReceive方法中启动前台服务
我在 OnReceive 方法中检查了您的代码:
Android.App.Application.Context.StartForegroundService(intent);
应该删除这一行。 intent
是 OnReceive 方法的参数。你的前台服务意图是foreGroundServiceIntent
.