Xamarin Android 后台定时器服务

Xamarin Android Background Timer Service

在我正在开发的应用程序中,我需要 运行 活动之间的计时器来跟踪 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);
    }
}

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

我会使用 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
    }
}