Приемник xamarin.android при ошибке BOOT_COMPLETED

Я пытаюсь создать простую службу, которая запускается с загрузки устройства. Дело в том, что устройство возвращает сообщение «К сожалению, [app_name] остановлено».

Я борюсь с этой проблемой несколько часов, ищу ошибку, но это слишком просто .. Надеюсь, вы, ребята, можете помочь мне с этой проблемой.

Это мой код:

AndroidManifest.xml

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

<application android:allowBackup = "true" android:label = "@string/app_name">


    <receiver android:name = ".StartReceiver">
          <intent-filter>
              <action android:name = "android.intent.action.BOOT_COMPLETED"/>
          </intent-filter>
    </receiver>

  <service android:name = ".PService" />
</application>

StartReceiver.cs

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

и, наконец, PService.cs

[Service]
    public class PService : Service
    {
        public override void OnCreate()
        {
            base.OnCreate();
        }

        public override IBinder OnBind(Intent intent)
        {
            return null;
        }


        public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
        {
            Toast.MakeText(this, "Start", ToastLength.Short).Show();
            return StartCommandResult.Sticky;
        }

        public override void OnDestroy()
        {
            base.OnDestroy(); 

            Toast.MakeText(this, "Stop", ToastLength.Short).Show();
        }
    }

Дополнительно это служебное приложение предназначено для версии Android API 19 (4.4.2 KitKat).

Я думаю, что это будет действительно небольшая ошибка, сделанная мной, но на самом деле я не могу ее выяснить .. Заранее спасибо за любую помощь.

Чтобы уловить намерение BOOT_COMPLETED, ваше приложение также должно иметь пользовательский интерфейс, и ваш пользователь должен открыть приложение хотя бы один раз. - по соображениям безопасности.

EvZ 21.03.2018 11:40

да, у меня есть класс активности, где я запускаю службу. (Служба запускается нормально) проблема после перезагрузки устройства

Grzegorz G. 21.03.2018 11:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
2
2 994
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Добавив получателя в манифест и через BroadcastReceiverAttribute, вы получите два получателя в вашем манифесте. Кроме того, имя в вашем манифесте не будет работать, поскольку это не имя Java на основе MD5, которое Xamarin создает по умолчанию.

Через атрибуты

1) Удалите приемник и разрешение на загрузку из вашего манифеста

2) Добавьте свои разрешения на загрузку через атрибут)

[assembly: UsesPermission(Manifest.Permission.ReceiveBootCompleted)]

3) Добавьте запись манифеста через атрибуты:

[BroadcastReceiver(Enabled = true)]
[IntentFilter(new[] { Intent.ActionBootCompleted })]    
public class BootBroadcastReceiver : BroadcastReceiver

Через манифест

1) Добавьте запись в манифест для разрешения загрузки

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

2) Добавьте получатель и используйте полное имя класса Java:

<receiver android:name = "com.yourpackagename.app.BootBroadcastReceiver">
      <intent-filter>
          <action android:name = "android.intent.action.BOOT_COMPLETED"/>
      </intent-filter>
</receiver>

3) Добавьте параметр Name в BroadcastReceiverAttribute для полного имени класса Java, которое вы использовали в манифесте.

[BroadcastReceiver(Name = "com.yourpackagename.app.BootBroadcastReceiver", Enabled = true)]
[IntentFilter(new[] { Intent.ActionBootCompleted })]    
public class BootBroadcastReceiver : BroadcastReceiver

Спасибо, Суши, метод «Через манифест» у меня хорошо сработал.

Grzegorz G. 26.03.2018 10:33

@CDrosos Задайте новый вопрос о вашей проблеме, поскольку я знаю, что это работает на 7.0 (фактически все API)

SushiHangover 07.06.2018 23:26

нужен ли этот фильтр намерений? Я имею в виду вопрос об общем BroadcastReceiver, должны ли мы определять фильтр намерений или просто для этого случая из-за OP, написанного в его вопросе. Я имею в виду решение через манифест. вы определяете фильтр намерений в манифесте, а также как атрибут? разве это не двойное?

Emil 24.09.2019 00:04

@batmaci На «Шаге 3» решения манифеста вы должны определить атрибут Name для «полностью определенного класса Java», который вы определяете в манифесте вручную, поэтому их соответствие фактически устраняет проблему «двойного» дополнения (это возможно, поскольку я последний раз проверял, что процесс сборки Xamarin правильно объединяет изменения манифеста, вам нужно будет проверить это самостоятельно)

SushiHangover 24.09.2019 00:51

Я нашел другое решение этой проблемы,

Пожалуйста, убедитесь, что ваш BootBroadcastReceiver присутствует в файле Yourproject.Android.csproj

<ItemGroup>
    <Compile Include = "MainActivity.cs" />
    <Compile Include = "Provider\AppVersionProvider.cs" />
    <Compile Include = "Resources\Resource.Designer.cs" />
    <Compile Include = "Properties\BootBroadcastReceiver.cs" />
    <Compile Include = "others_staf" />

И посмотрите ответ Суши.

Другие вопросы по теме