-2

Мои AndroidManifest, Broadcastreceiver и классы обслуживания показаны ниже.My BroadcastReceiver не работает, когда устройство запущено

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))); 
     } 

    } 

Когда устройство перезагружается, я хочу, чтобы процессы внутри класса служб выполнялись. Но это дает ошибку. Почему? Когда я запускаю приложение, он работает нормально, но я хочу, чтобы он выполнялся автоматически при перезапуске устройства. Вероятно, на приемнике есть ошибка, но я не могу найти, где.

+0

Какая ошибка? У вас есть стек? – Demitrian

+0

Не имеет stacktrace. Я не знаю stacktrace :) – oflu1071

ответ

0

После Android 3.1 «система добавляет FLAG_EXCLUDE_STOPPED_PACKAGES ко всем вещательным намерениям». Это означает, что после 3.1 все приложения будут остановлены при загрузке. Зачем ? По соображениям безопасности.

Есть ПРАВИЛА, чтобы выключить флаг FLAG_EXCLUDE_STOPPED_PACKAGES.

(1) Ваше приложение должно быть в телефоне, а не в SD-карте, иначе установлен флаг. BOOT_COMPLETE отправляется перед установкой внешнего хранилища. если приложение установлено на внешнее хранилище, оно не получит широковещательное сообщение BOOT_COMPLETE.

(2) Если пользователь нажимает кнопку «Принудительное закрытие» из настроек или кнопку «не отвечает», устанавливается флаг.

(3) Если приложение никогда не запускалось, флаг устанавливается (никогда не относится к текущему состоянию загрузки, O) НИКОГДА не означает в ЭТОЙ загрузке, или вы аннулировали флаг в последнем состоянии загрузки).

Ваш приемник будет запускаться при загрузке (флаг не установлен), если вы следуете правилам.

+0

Могу ли я заставить приложение быть сохраненным в памяти телефона, когда приложение установлено? Если это возможно, как это делается? – oflu1071

+0

Я не понимаю «сохраненный в памяти телефона», если он находится в памяти (позволяет называть его ОЗУ, даже если это не так), то он не «постоянно сохраняется», то есть не хранится. Чтобы быть ясным, ОС Android отслеживает FLAGS, а не приложение. –

+0

Могу ли я решить эту проблему? Чтобы записать этот код в AndroidManifest.xml. – oflu1071

Смежные вопросы