【问题标题】:Android Service binding with MvvmCrossAndroid Service 与 MvvmCross 绑定
【发布时间】:2017-10-30 08:36:44
【问题描述】:

我正在 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){}

        }

当用户注销时,我想停止此服务。我在哪里拨打StopService()MvvmCross

【问题讨论】:

    标签: xamarin xamarin.android mvvmcross


    【解决方案1】:

    我不会使用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);
    

    【讨论】:

    • 谢谢。这解决了我的问题。你能告诉我为什么你更喜欢 AlarmManager 而不是 Timer 吗?
    • AlarmManager 是一项系统服务,会在需要时唤醒您的应用。计时器将要求您的进程正在运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    相关资源
    最近更新 更多