Xamarin Android后台计时器服务

时间:2016-05-30 14:30:48

标签: android service xamarin xamarin.android mvvmcross

在我正在开发的应用程序中,我需要在活动之间运行一个计时器来跟踪OAuth令牌的持续时间。为此,我实施了一项服务。

这是服务代码:

[return: GeneratedEnum]
public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
{
    // Gets the token duration in seconds
    tokenDuration = Convert.ToInt32(intent.GetStringExtra("tokenDuration"));

    tokenStart = Convert.ToDateTime(intent.GetStringExtra("tokenStart"));
    tokenEnd = Convert.ToDateTime(tokenStart.AddSeconds(tokenDuration));
    t = new Thread(() =>
    {
        timer = new Timer(tokenDuration);
        timer.Interval = 60000;
        timer.Elapsed += OnTimedEvent;
        timer.Enabled = true;

    });
    t.Start();

    return StartCommandResult.Sticky;
    //return base.OnStartCommand(intent, flags, startId);
}

private void OnTimedEvent(object sender, System.Timers.ElapsedEventArgs e)
{
    timeElapsed++;
    System.Diagnostics.Debug.WriteLine("Minute elapsed,  Total Token duration {0}s, Total time elapsed {1}min", tokenDuration, timeElapsed);


    if (tokenEnd.Add(new TimeSpan(0, -3, 1)) == tokenStart.AddMinutes(timeElapsed))
    {
        timer.Stop();

        Intent intent = new Intent();
        intent.SetAction(action);
        intent.PutExtra("AskRefreshToken", true);
        SendBroadcast(intent);
    }
}

我的问题是如何在令牌需要更新时获取活动中的信息,以便我可以更新视图模型。 有没有更好的方法来解决这个问题? 请注意,我在Android开发中有点像初学者。 提前谢谢。

1 个答案:

答案 0 :(得分:2)

我要使用messenger插件进行消息传递。 https://github.com/MvvmCross/MvvmCross-Plugins/tree/master/Messenger

制作特殊消息

public class TokenRefreshedMessage
    : MvxMessage
{
    public TokenRefreshedMessage(object sender) 
        : base(sender)
    {
    }
}

在您的服务中发布消息

Mvx.Resolve<IMvxMessenger>().Publish(new TokenRefreshedMessage(this));

订阅讯息

public class MyViewModel : MvxViewModel
{
    private readonly MvxSubscriptionToken _token;

    public LocationViewModel(IMvxMessenger messenger)
    {
        _token = messenger.Subscribe<TokenRefreshedMessage>(OnTokenRefreshed);
    }

    private void OnTokenRefreshed(TokenRefreshedMessage locationMessage)
    {
        // update properties
    }
}
相关问题