Я пытаюсь создать простую службу, которая запускается с загрузки устройства. Дело в том, что устройство возвращает сообщение «К сожалению, [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).
Я думаю, что это будет действительно небольшая ошибка, сделанная мной, но на самом деле я не могу ее выяснить .. Заранее спасибо за любую помощь.
да, у меня есть класс активности, где я запускаю службу. (Служба запускается нормально) проблема после перезагрузки устройства





Добавив получателя в манифест и через 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
Спасибо, Суши, метод «Через манифест» у меня хорошо сработал.
@CDrosos Задайте новый вопрос о вашей проблеме, поскольку я знаю, что это работает на 7.0 (фактически все API)
нужен ли этот фильтр намерений? Я имею в виду вопрос об общем BroadcastReceiver, должны ли мы определять фильтр намерений или просто для этого случая из-за OP, написанного в его вопросе. Я имею в виду решение через манифест. вы определяете фильтр намерений в манифесте, а также как атрибут? разве это не двойное?
@batmaci На «Шаге 3» решения манифеста вы должны определить атрибут Name для «полностью определенного класса Java», который вы определяете в манифесте вручную, поэтому их соответствие фактически устраняет проблему «двойного» дополнения (это возможно, поскольку я последний раз проверял, что процесс сборки Xamarin правильно объединяет изменения манифеста, вам нужно будет проверить это самостоятельно)
Я нашел другое решение этой проблемы,
Пожалуйста, убедитесь, что ваш 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" />
И посмотрите ответ Суши.
Чтобы уловить намерение BOOT_COMPLETED, ваше приложение также должно иметь пользовательский интерфейс, и ваш пользователь должен открыть приложение хотя бы один раз. - по соображениям безопасности.