2016-08-11 41 views
0

在Android上棉花糖服務或後臺進程被暫停/休眠,一種方法是設置一個鬧鐘管理器定時器,以每9分鐘喚醒一次服務。如果我從活動中設置鬧鐘,它只會被調用一次。如何設置重複報警SetAndAllowWhileIdle?謝謝Xamarin Android SetAndAllowWhileIdel重複

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。此服務將由另一個AlarmManager通過該警報將在9分鐘後重新安排。

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