-2

私のAndroidManifestBroadcastreceiverとサービスクラスを以下に示します。デバイスの起動時に私の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を知っていません:) – oflu1071

答えて

0

Android 3.1以降では、システムによってすべてのブロードキャストインテントにFLAG_EXCLUDE_STOPPED_PACKAGESが追加されます。つまり、3.1以降は、起動時にすべてのアプリが停止します。どうして ?セキュリティ上の理由から。

フラグをオフにする規則があります。FLAG_EXCLUDE_STOPPED_PACKAGES

(1)あなたのアプリは携帯電話のストレージに必要であり、そうでなければsdcardでなければなりません。外部ストレージがマウントされる前にBOOT_COMPLETEが送信されます。アプリが外部ストレージにインストールされている場合は、BOOT_COMPLETEブロードキャストメッセージは受信されません。

(2)ユーザーが設定または「応答しないアプリケーション」ボタンから「強制終了」を押すと、フラグが設定されます。

(3)アプリケーションが実行されていない場合、フラグは設定されます(現在のブートステートには絶対的に関係ありません)。このブートではNEVERは意味しません。

ルールに従えば、レシーバーは起動時に実行されます(フラグは設定されません)。

+0

アプリケーションがインストールされているときに電話機のメモリにアプリケーションを強制的に保存することはできますか?これが可能であれば、これはどのように行われますか? – oflu1071

+0

「電話のメモリに保存されています」とは分かりません。メモリに保存されている場合は、RAMに保存されていない場合でもRAMに保存されます。 Android OSは、アプリではなくFLAGSを追跡していることを明確にします。 –

+0

このような問題を解決できますか? このコードをAndroidManifest.xmlに書き込むには – oflu1071

関連する問題