0

created an own application which gets started automatically although it gets removed or closed by the user by using Timertask class run method but it is working fine for delay upto 15min and 20 min but the run action not works after delay of 2 hrs. Here are my codes

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);
        }
    } 
AjitK
  • 33
  • 8
  • 1
    Use `AlarmManager` – PPartisan Jan 31 '20 at 12:38
  • 1
    @AjitK,You mean that when you set 15 min or 20 min, the TimerTask works fone, but if you set 2 hours, it doesn't work? if yes, I see one thread that said Timer doesn't work when screen is off, you can take a look:https://stackoverflow.com/questions/12684604/android-timer-schedule-vs-scheduleatfixedrate – Cherry Bu - MSFT Feb 03 '20 at 02:28
  • Please check my edited answer – hadilionson Feb 03 '20 at 13:07

2 Answers2

0

First Add this permission

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

update: also you have to use service for run at background, use bellow code

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);
        }
    }    
}

also you run your service once in main activity

  Intent intSer = new Intent(base.ApplicationContext, typeof(ServiceTest));
  StartService(intSer);
  • 1
    I changed my answer; you can use this service to run in background – hadilionson Feb 03 '20 at 13:05
  • Achieved my requirement using the Alarm Manager but thanks for your valuable reply @hadilionson – AjitK Feb 05 '20 at 05:27
  • 1
    @AjitK,It seems that you have solved your issue now, please remember to mark the helpful post as answer, it is beneficial to other community members who face the same issue, thanks. – Cherry Bu - MSFT Feb 06 '20 at 06:40
0

Fixed this issue using Alarm Manager.

 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);
        }
    }
AjitK
  • 33
  • 8