2016-05-30 102 views
1

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

这里的服务代码:

[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开发初学者。 预先感谢您。

回答

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 
    } 
} 
+0

谢谢,稍后会检查出来:) –