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