我做了這樣的事情。它似乎工作,但它是正確的方式去呢?這是一種遞歸調用,它會泄漏內存。
服務
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);
}
}
}
有用於結合重複告警與怠速設備不支持。可能的重複:http://stackoverflow.com/questions/35629268/alarm-manager-issue-in-android-6-0-doze-mode – Krumelur