设备启动时,我的BroadcastReceiver无法正常工作

时间:2016-11-24 19:05:01

标签: android xamarin broadcastreceiver cross-platform bootcompleted

我的AndroidManifestBroadcastreceiver和服务类如下所示。

DetectBootUp.cs:

[BroadcastReceiver]
    [IntentFilter(new[] { Intent.ActionBootCompleted })]
    public class DetectBootUp : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            Intent bootUp = new Intent(context, typeof(AndroidService));
            context.StartService(bootUp);
        }
    }

AndroidService.cs

[Service]
    public class AndroidService : Service
    {
        public override void OnCreate()
        {
            Toast.MakeText(this, "Service Created", ToastLength.Long).Show();
            Log.Debug("BroadCastReceiverBoot", "OnCreate");
        }
        public override IBinder OnBind(Intent intent)
        {
            return null;
        }
        public override void OnDestroy()
        {
            Toast.MakeText(this, "Service Destroyed", ToastLength.Long).Show();
            Log.Debug("BroadCastReceiverBoot", "onDestroy");
            ApplicationContext.StartService(new Intent(ApplicationContext, typeof(AndroidService)));
        }
        [return: GeneratedEnum]
        public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
        {
            Toast.MakeText(this, "Service Started", ToastLength.Long).Show();
            Log.Debug("BroadCastReceiverBoot", "OnStart");
            return StartCommandResult.Sticky;
        }
    }

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-sdk android:minSdkVersion="15" />

  <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application android:label="NotificationExample">
    <receiver
      android:name=".DetectBootUp"
      android:enabled="true"
      android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
      <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
        <category android:name="android.intent.category.DEFAULT"/>
      </intent-filter>
    </receiver>

    <service android:name=".AndroidService"
             android:enabled="true"
             android:exported="false">
    </service>
  </application>

</manifest>

MainActivity.cs

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            global::Xamarin.Forms.Forms.Init(this, bundle);
            LoadApplication(new App());
            StartService(new Android.Content.Intent(Application.Context, typeof(AndroidService)));
        }

    }

重启设备时,我希望执行服务类中的进程。但它给出了一个错误。为什么? 当我运行应用程序时它工作正常,但我希望它在设备重启时自动执行。可能接收器上有错误但我无法找到位置。

1 个答案:

答案 0 :(得分:0)

在Android 3.1之后“系统将FLAG_EXCLUDE_STOPPED_PACKAGES添加到所有广播意图。”这意味着在3.1之后,所有应用程序都会在启动时停止。为什么?出于安全考虑。

有标准关闭FLAG_EXCLUDE_STOPPED_PACKAGES

(1)您的应用需要手机存储,而不是SD卡,否则标志设置。在安装外部存储之前发送BOOT_COMPLETE。如果应用程序安装到外部存储,它将不会收到BOOT_COMPLETE广播消息。

(2)如果用户从设置或“无响应的应用程序”按钮按下“强制关闭”,则设置该标志。

(3)如果应用程序从未运行过,则设置标志(从不相对于当前引导状态; O)从不意味着在此引导中或者在上次引导状态中使标志无效。)

如果您遵守规则,您的Receiver将在启动时运行(标记未设置)。