Android 与 MvvmCross 的服务绑定

Android Service binding with MvvmCross

我正在 MvvmCross 中开发 xamarin.Android 应用程序。即使应用程序处于后台并且用户已登录,我也想调用服务。问题是,无论应用程序是在前台还是后台,我都想在每 2 小时内调用此服务,只是应用程序的用户需要待登录。

Intent loggedintent = new Intent(this,typeof(DeviceLoginHelper));
                loggedintent.PutExtra("LoggedIn", true);
                StartService(loggedintent);

我写了一个android服务

 [Service]
    public class DeviceLoginHelper : IntentService
    {
        protected override void OnHandleIntent(Intent intent)
        {
            try
            {
                if(intent.HasExtra("LoggedIn"))
                {
                }
            }
            catch(Exception ex) { }
        }
    }

但是我该如何实现计时器呢?我在哪里初始化和处理计时器的事件。当计时器结束时,我应该什么时候打电话?

 public override void OnDestroy()
        {
            try
            {
                base.OnDestroy();
            }
            catch(Exception ex){}

        }

当用户注销时,我想停止这项服务。在 MvvmCross

中调用 StopService() 的位置

我不会使用 Timer。相反,您应该配置 AlarmManager.

[BroadcastReceiver]
public class AlarmReceiver : BroadcastReceiver
{
    private static AlarmManager alarmMgr;
    private static PendingIntent alarmIntent;
    public const int NOTIFICATION_ID = 1;
    public const int IDLE_TIME_MS = 30 * 1000; // 30-seconds (update here)
    private NotificationManager mNotificationManager;
    Notification.Builder builder;

    public override void OnReceive(Context context, Intent intent)
    {
        // Do something when alarm triggers (here I'm building notification)
        BuildNotification(context);

        // reschedule alarm
        ScheduleAlarm(IDLE_TIME_MS);
    }

    public static Context ApplicationContext { get; set; }
    public static void ScheduleAlarm(int milliseconds)
    {
        if (milliseconds == 0) return;

        alarmMgr = (AlarmManager)ApplicationContext.GetSystemService(Context.AlarmService);
        var intent = new Intent(ApplicationContext, typeof(AlarmReceiver));
        alarmIntent = PendingIntent.GetBroadcast(ApplicationContext, 0, intent, 0);

        alarmMgr.Set(AlarmType.ElapsedRealtimeWakeup, 
            SystemClock.ElapsedRealtime() + milliseconds, alarmIntent);
    }

    private void BuildNotification(Context context)
    {
        mNotificationManager = (NotificationManager)context.GetSystemService(Context.NotificationService);

        var contentIntent = PendingIntent.GetActivity(context, 0, new Intent(context, typeof(MainView)), 0);
        var message = $"Time is up";
        var mBuilder = new Notification.Builder(context)
            .SetAutoCancel(true)
            .SetPriority(NotificationCompat.PriorityMax)
            .SetDefaults(NotificationDefaults.All)
            .SetContentTitle("Time is up")
            .SetStyle(new Notification.BigTextStyle()
                .BigText(message))
            .SetContentText(message)
            .SetSmallIcon(Resource.Drawable.ic_launcher);

        mBuilder.SetContentIntent(contentIntent);
        mNotificationManager.Notify(NOTIFICATION_ID, mBuilder.Build());
    }
}

在您的启动代码中,只需调用:

AlarmReceiver.ApplicationContext = context;
AlarmReceiver.ScheduleAlarm(timeInMs);