当前位置: 首页 > 编程语言 > C#

如何在我的Xamarin应用程序后台运行方法?Share

时间:2023-04-10 23:27:42 C#

如何在我的Xamarin应用程序后台运行方法?一旦应用程序启动并运行,我想要一个后台进程来检查数据库并根据数据库中的数据更新它。我想每分钟检查一次。我只希望当应用程序位于前台并在用户视图中时发生这种情况。有人可以给我一些建议吗?我假设我可以从这里调用一个方法,但我不知道如何调用。另外,我不知道如何停止,甚至需要手动取消/停止该过程。是否会在应用不在前台时自动取消,当应用回到前台时自动重启?publicpartialclassApp:Application{protectedoverridevoidOnStart(){App.DB.InitData();MainPage=newJapanese.MainPage();但是我需要在不同的线程上运行它吗?如果需要,我应该怎么做。抱歉,如果我的问题不清楚。请,如果它没有意义,我可以更新。我们在表单应用程序中所做的是利用System.Diagnostics和Xamarin.Forms中可用的Device.Timer和Stopwatch类来创建一个非常通用的托管计时器,我们可以使用onStart、onSleep和onResume与之交互。Xamarin.Forms中的方法。这个特定的解决方案不需要任何特殊的平台特定逻辑,并且设备计时器和秒表是非UI阻塞的。使用Xamarin.Forms;使用系统;使用System.Linq;使用系统诊断;namespaceYourNamespace{publicpartialclassApp:Application{privatestaticStopwatchstopWatch=newStopwatch();私有常量intdefaultTimespan=1;protectedoverridevoidOnStart(){//当您的应用程序从关闭状态启动时开始运行,if(!StopWatch.IsRunning){StopWatch.Start();}Device.StartTimer(newTimeSpan(0,0,1),()=>{//如果设备在一段时间内处于非活动状态,则用于注销的逻辑。if(StopWatch.IsRunning&&StopWatch.Elapsed.Minutes>=defaultTimespan){//准备在此处执行数据拉取,因为我们已达到1分钟标记//在此处执行长时间运行的操作。InvokeOnMainThread(()=>{//如果您需要对UI执行任何操作,则需要});stopwatch.Restart();}//始终返回true以保持我们的设备计时器运行。returntrue;});}protectedoverridevoidOnSleep(){//确保我们的秒表已重置,因此经过的时间为0。StopWatch.Reset();}protectedoverridevoidOnResume(){//App进入前台,所以再次启动我们的秒表。秒表开始();有关上述解决方案如何逐步工作的一些背景知识:应用程序从关闭状态开始,'OnStart()'方法创建我们的Device.Timer,它每秒滴答一次,它还会启动我们的秒表计时一分钟。当应用程序进入后台时,如果我们将“false”值传递给Device.StartTimer()操作,此时它会触发“OnSleep”方法,并且无法再次启动。所以我们只是在应用程序再次打开时重置我们的秒表。当应用程序回到前台时,它会调用“OnResume”方法,这只会启动现有的秒表。2018年编辑:这个答案在2018年仍然有一些优点,但主要针对非常具体的情况。即使在Xamarin.Forms中,也有更好的特定于平台的方法来复制此功能。考虑到用户活动/不活动,上述仍然是一段时间后执行任务的平台无关方式。您可以使用它,System.Threading.Tasks.Task.Run(()=>{//在此处添加您的代码。}).ConfigureAwait(false);要运行后台任务,请使用服务。任务通常分为长时间运行或周期性任务。android中的服务代码如下[Service]publicclassPeriodicService:Service{publicoverrideIBinderOnBind(Intentintent){returnnull;}publicoverrideStartCommandResultOnStartCommand(Intentintent,StartCommandFlagsflags,intstartId){//来自共享代码或在您的PCL中returnStartCommandResult.NotSticky;}}并在后台调用服务varintent=newIntent(this,typeof(PeriodicService));启动服务(意图);如果想在每分钟后调用并检查privatevoidStartBackgroundDataRefreshService(){varpt=newPeriodicTask.Builder().SetPeriod(1800)//以秒为单位;最小为30秒.SetService(Java.Lang.Class.FromType(typeof(BackgroundService))).SetRequiredNetwork(0).SetTag(yourpackagename)//包名.Build();GcmNetworkManager.GetInstance(this).Schedule(pt);要找出适合您的服务类型,请阅读本教程服务类型Xamarin博客定期后台服务Xamarin服务博客另一个示例是publicclassPeriodicService:Service{privatestaticTimertimer=newTimer();公共重写IBinderOnBind(Intentintent){返回null;}publicoverrideStartCommandResultOnStartCommand(Intentintent,StartCommandFlagsflags,intstartId){timer.scheduleAtFixedRate(newmainTask(),0,5000);返回StartCommandResult.NotSticky;}privateclassmainTaskextendsTimerTask{publicvoidrun(){//yourcode}}}这是XAMARINAndroid服务的示例代码,它将在每10秒后执行一次任务usingSystem;使用系统线程;使用Android.App;使用Android.Content;使用Android.OS;使用Android.Util;namespaceSimpleService{[Service]publicclassSimpleStartedService:Service{staticreadonlystringTAG="X:"+typeof(SimpleStartedService).Name;静态只读intTimerWait=10000;定时器定时器;日期时间开始时间;boolisStarted=false;publicoverridevoidOnCreate(){base.OnCreate();}publicoverrideStartCommandResultOnStartCommand(Intentintent,StartCommandFlagsflags,intstartId){Log.Debug(TAG,$"OnStartCommandcalledat{startTime},flags={flags},startid={startId}");如果(isStarted){TimeSpanruntime=DateTime.UtcNow.Subtract(startTime);Log.Debug(TAG,$"此服务已经启动,它已经运行了{runtime:c}。");}else{startTime=DateTime.UtcNow;Log.Debug(TAG,$"在{startTime}启动服务。");timer=newTimer(HandleTimerCallback,startTime,0,TimerWait);已启动=真;}返回StartCommandResult.NotSticky;}publicoverrideIBinderOnBind(Intentintent){//这是一个启动服务,不是绑定服务,所以我们只返回null。返回空值;}publicoverridevoidOnDestroy(){timer.Dispose();定时器=空;isStarted=false;TimeSpanruntime=DateTime.UtcNow.Subtract(startTime);Log.Debug(TAG,$"简单服务在运行{runtime:c}后在{DateTime.UtcNow}销毁。");base.OnDestroy();}voidHandleTimerCallback(objectstate){TimeSpanrunTime=DateTime.UtcNow.Subtract(startTime);Log.Debug(TAG,$"此服务已运行{runTime:c}(自${state}起)。");}有几种方法可以在iOS和Android中执行此操作在XamarinForms中,大部分功能都属于Backgrounding名字对象。那里有很多教程。这个非常详细,绝对值得一试:http://arteksoftware.com/backgrounding-with-xamarin-forms/在Android中,很多此类工作都是在后台服务中完成的。对于iOS,请查看长时间运行或有限长度的任务。从这一点可以看出,没有XamarinForms方法可以做到这一点。您将需要编写Xamarin.Android和Xamarin.iOS特定代码。您可以使用Device.StartTimer(TimeSpan.FromMinutes(1),()=>{varshouldTimerContinueWork=true;/*您的代码*/returnshouldTimerContinueWork;});此计时器在后台线程上运行,使用设备时钟并重置为安全。要在应用程序处于后台时停止此计时器,您可以使用此处所述的Xamarin.Forms.Application方法OnSleep和OnResume我正在做的是我的XamarinForms应用程序。publicvoidexecute(){varthread=newThread(newThreadStart(startAuthenticationProcess)){IsBackground=true};线程。开始();}privatevoidstartAuthenticationProcess(){Thread.Sleep(2000);if(!Utils.isNetworkAvailable(splashActivity)){splashActivity.RunOnUiThread(()=>Utils.showToast(splashActivity,splashActivity.GetString(Resource.String.r30025)));splashActivity.FinishAffinity();}else{try{if(StringUtils.isBlank(strIPAdd)||(StringUtils.isNotBlank(strIPAdd)&&(StringUtils.isBlank(strDbName)||“site”.Equals(strDbName,StringComparison.OrdinalIgnoreCase)))){splashActivity.RunOnUiThread(()=>DependencyService.Get().showAuthenticationDialog(newCommand(()=>{varintent=newIntent(splashActivity,typeof(MainActivity));intent.PutExtra("startLoginActivity",false);splashActivity.StartActivity(意图);splashActivity.Finish();})));}else{gotoLoginScreen();}}catch(Exceptione){Log.Error(TAG,e.Message);很简单,尝试这样的事情,并在这些方法中实现你的逻辑:publicpartialclassApp:Application{protectedoverridevoidOnStart(){//你的AppOn启动代码应该在这里......//然后:Task.Run(()=>{//在这里添加你的代码,它可能看起来像:CheckDatabase();MakeAnUpdateDependingOnDatabase();});我希望它有助于我的Xamarin应用程序的后台运行方法?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: