2016-08-11 10 views
0

Android Marshmallowのサービスまたはバックグラウンドプロセスを一時停止または休止状態にする方法と、アラームマネージャーのタイマーを設定して、09分ごとにサービスを起動する方法があります。アクティビティからアラームを設定すると、アラームは1回だけ呼び出されます。繰り返しSetAndAllowWhileIdleアラームを設定するにはどうすればよいですか?ありがとうXamarin Android SetAndAllowWhileIdel Repeat

AlarmManager manager = (AlarmManager)GetSystemService(AlarmService); 
long triggerAtTime = SystemClock.ElapsedRealtime() + (9 * 60 * 1000); 
Intent alarmintent = new Intent(this, typeof(AlarmReceiver)); 
PendingIntent pendingintent = PendingIntent.GetBroadcast(this, 0, alarmintent, 0); 
if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.M) 
{ 
     manager.Cancel(pendingintent); 
     manager.SetAndAllowWhileIdle(AlarmType.ElapsedRealtimeWakeup, triggerAtTime, pendingintent); 
} 
else 
{ 
     manager.Set(AlarmType.ElapsedRealtimeWakeup, triggerAtTime, pendingintent); 
} 
+0

アイドリングデバイスとの組み合わせで繰り返しアラームのサポートはありません。可能な複製:http://stackoverflow.com/questions/35629268/alarm-manager-issue-in-android-6-0-doze-mode – Krumelur

答えて

0

AlarmManagerを定義できるスティッキーサービスを作成します。このサービスは、アラームが9分後に再スケジュールされることによって、別のAlarmManagerによって呼び出されます。

0

私はこのようなことをしました。それはうまくいくようですが、それについては正しい方法ですか?これは再帰呼び出しの一種であり、メモリをリークします。

サービス

namespace MyApp 
{ 
    [Service(Name = "com.MyApp.simpleservice", Enabled = true, Process = ":bgservice") ] 
    public class SimpleService : Service 
    { 
     private const string TAG = "MyApp.simpleservice"; 


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

     } 


     public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) 
     { 


      AlarmManager manager = (AlarmManager)GetSystemService(AlarmService); 
      long triggerAtTime = SystemClock.ElapsedRealtime() + (5 * 60 * 1000); 
      Intent alarmintent = new Intent(this, typeof(AlarmReceiver)); 
      PendingIntent pendingintent = PendingIntent.GetBroadcast(this, 0, alarmintent, 0); 
      if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.M) 
      { 

       manager.Cancel(pendingintent); 
       manager.SetAndAllowWhileIdle(AlarmType.ElapsedRealtimeWakeup, triggerAtTime, pendingintent); 
      } 
      else 
      { 
       manager.Set(AlarmType.ElapsedRealtimeWakeup, triggerAtTime, pendingintent); 
      } 

     DoWork(); 

      return StartCommandResult.Sticky; 
     } 

    public void DoWork() 
    { 
     //Do Some Serious Work here 
    } 
    public override IBinder OnBind(Intent intent) 
     { 
      // This example isn't of a bound service, so we just return NULL. 
      return null; 
     } 
} 

BroadCastReceiver

namespace MyApp 
{ 
    [BroadcastReceiver(Enabled = true) ] 
    class AlarmReceiver : BroadcastReceiver 

    { 
     public override void OnReceive(Context context, Intent intent) 
     { 
      Intent rintent = new Intent(context, typeof(SimpleService)); 

      rintent.PutExtra("AlarmReceiver","Broadcast Alarm"); 
      context.StartService(rintent); 
     } 
    } 
} 
関連する問題