【问题标题】:Timertask Run() method is not working for longer period like 2 hoursTimertask Run() 方法不能工作更长的时间,比如 2 小时
【发布时间】:2020-05-17 03:06:48
【问题描述】:

创建了一个自己的应用程序,该应用程序自动启动,尽管它被用户使用 Timertask 类运行方法删除或关闭,但它可以正常延迟长达 15 分钟和 20 分钟,但运行操作在延迟 2 小时后不起作用。这是我的代码

timerTask = new LoginTimerTask(this);
timer.Schedule(timerTask,(long) TimeSpan.FromHours(2).TotalMilliseconds , (long)TimeSpan.FromHours(2).TotalMilliseconds);

 public class LoginTimerTask : TimerTask
    {
        MainActivity mainActivity;

        public LoginTimerTask(MainActivity activity)
        {
            mainActivity = activity;
        }

        public override void Run()
        {
            var intent = new Intent(mainActivity, typeof(MainActivity));
            mainActivity.StartActivity(intent);
        }
    } 

【问题讨论】:

  • 使用AlarmManager
  • @AjitK,你的意思是当你设置 15 分钟或 20 分钟时,TimerTask 工作正常,但如果你设置 2 小时,它就不起作用?如果是的话,我看到一个帖子说当屏幕关闭时定时器不工作,你可以看看:*.com/questions/12684604/…
  • 请检查我编辑的答案

标签: android xamarin.android timertask


【解决方案1】:

首先添加此权限

<uses-permission android:name="android.permission.WAKE_LOCK" />

更新:你也必须使用服务在后台运行,使用下面的代码

using System;
using System;
using System.Threading;
using Android.App;
using Android.Content;
using Android.OS;
using OomaAndroid.Models;
using SQLite;

namespace OomaAndroid
{
    [Service]
    public class ServiceTest : Service
    {
        Timer timer;        
        public override void OnCreate()
        {
            base.OnCreate();
        }
        public override IBinder OnBind(Intent intent)
        {            
            return null;
        }


        public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
        {            
            timer = new Timer(HandleTimerCallback, 0, 0, 43200000);
            return base.OnStartCommand(intent, flags, startId);
        }

        private void HandleTimerCallback(object state)
        {
            //Start your Activity Here, it runs every 2 hours
            var intent = new Intent(mainActivity, typeof(MainActivity));
            mainActivity.StartActivity(intent);
        }
    }    
}

您也可以在主要活动中运行一次服务

  Intent intSer = new Intent(base.ApplicationContext, typeof(ServiceTest));
  StartService(intSer);

【讨论】:

  • 我改了答案;您可以使用此服务在后台运行
  • 使用警报管理器达到了我的要求,但感谢您的宝贵回复@hadilionson
  • @AjitK,看来你的问题已经解决了,请记得把有用的帖子标记为答案,对其他遇到同样问题的社区成员有帮助,谢谢。
【解决方案2】:

使用警报管理器修复了这个问题。

 public void startAlert()
        {
            var alarmIntent = new Intent(this, typeof(AlarmReceiver));
            var pending = PendingIntent.GetBroadcast(this, 0, alarmIntent, PendingIntentFlags.UpdateCurrent);
            var alarmManager = GetSystemService(AlarmService).JavaCast<AlarmManager>();
            alarmManager.Set(AlarmType.ElapsedRealtime,(long)(SystemClock.ElapsedRealtime() + TimeSpan.FromHours(2).TotalMilliseconds), pending);
        }

    [BroadcastReceiver]
    public class AlarmReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            intent = new Intent(context, typeof(MainActivity));
            intent.AddFlags(ActivityFlags.NewTask);
            context.StartActivity(intent);
        }
    }

【讨论】: