[我在Xamarin.Android中编写了一个广播接收器,它看起来很完美,但是我不知道为什么在设备启动时没有调用它,有人可以告诉我我的代码有什么问题吗?
[BroadcastReceiver(Enabled = true, Exported = true)]
[IntentFilter(new[] { Intent.ActionBootCompleted })]
public class BootReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
if (intent.Action.Equals("android.intent.action.BOOT_COMPLETED"))
{
Toast.MakeText(context, "1 Received intent! You can run your background task here.", ToastLength.Short).Show();
}
}
}
我如上所述编写了广播接收器,但是在启动时无法启动。
您不必显式设置Exported = "true"
,因为您已经至少有一个意图过滤器,因此它是多余的。接收者也缺少您的许可,这是必需的。不要手动编辑您的AndroidManifest.xml
,因为它会被Xamarin覆盖。
您还必须配置您的手机正在运行的任何电池优化服务,例如华为。您必须为此应用禁用电池优化,否则它将不会收到任何广播。
安装该应用程序后,您必须至少从图标中打开一次,否则它将被Android系统以任何广播的形式传送。
示例代码:
namespace AZ.Sample.Notifications
{
using System;
using Android;
using Android.App;
using Android.Content;
[BroadcastReceiver(Enabled = true, Permission = Manifest.Permission.ReceiveBootCompleted)]
[IntentFilter(new[] { Intent.ActionBootCompleted }, Priority = (int)IntentFilterPriority.LowPriority, Categories = new[] { Intent.CategoryDefault })]
public class BootBroadcastReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
Toast.MakeText(Android.App.Application.Context, "Broadcast Received", ToastLength.Long).Show();
var uri = Android.Net.Uri.Parse("http://www.google.com");
var intent1 = new Intent(Intent.ActionView, uri);
intent1.AddFlags(ActivityFlags.NewTask);
intent1.SetPackage("com.android.chrome");
try
{
context.StartActivity(intent1);
}
catch (ActivityNotFoundException ex)
{
ex.PrintStackTrace();
//Chrome browser not installed
intent.SetPackage(null);
context.StartActivity(intent1);
}
}
}
}
Chrome应该安装在您将在其上运行此示例代码的移动设备上,重新启动设备后,请勿使其休眠并等待至少2分钟。之后,它将显示一条祝酒消息,并在Chrome浏览器中打开一个网站。
Sloution
Permission
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
接收器
<receiver android:name=".BootCompletedReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
这些是参考链接
xamarin.android Receiver on BOOT_COMPLETED error和BOOT_COMPLETED not working Android