Search code examples
javaandroidmultithreadingalarmmanagertimertask

What are the ways to check 24 hours are completed?


In my application I have to check whether the 24 hours are completed. How do I check such things using Thread, TimerTask and Alaram Manager.

Let me know how do I achieve this thing using TIMERTASK and THREAD ?


Solution

  • Use Alarm Manager:

    A small example:

    This is working code. It wakes CPU every 10 minutes until the phone turns off.

    Add to Manifest.xml:

    ...
    <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
    ...
    <receiver  android:process=":remote" android:name="Alarm"></receiver>
    ...
    

    Code:

        package YourPackage;
        import android.app.AlarmManager;
        import android.app.PendingIntent;
        import android.content.BroadcastReceiver;
        import android.content.Context;
        import android.content.Intent;
        import android.os.PowerManager;
        import android.widget.Toast;
    
        public class Alarm extends BroadcastReceiver 
        {    
             @Override
             public void onReceive(Context context, Intent intent) 
             {   
                 PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
                 PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
                 wl.acquire();
    
                 // Put here YOUR code.
                 Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example
    
                 wl.release();
             }
    
         public void SetAlarm(Context context)
         {
             AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
             Intent i = new Intent(context, Alarm.class);
             PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
             am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 10, pi); // Millisec * Second * Minute
         }
    
         public void CancelAlarm(Context context)
         {
             Intent intent = new Intent(context, Alarm.class);
             PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
             AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
             alarmManager.cancel(sender);
         }
     }
    

    Set Alarm from Service:

    package YourPackage;
    import android.app.Service;
    import android.content.Context;
    import android.content.Intent;
    import android.os.IBinder;
    
    public class YourService extends Service
    {
        Alarm alarm = new Alarm();
        public void onCreate()
        {
            super.onCreate();       
        }
    
        public void onStart(Context context,Intent intent, int startId)
        {
            alarm.SetAlarm(context);
        }
    
        @Override
        public IBinder onBind(Intent intent) 
        {
            return null;
        }
    }
    

    If you want set alarm repeating at phone boot time:

    Add permission to Manifest.xml:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
    ...
    <receiver android:name=".AutoStart">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"></action>
        </intent-filter>
    </receiver>
    ...
    

    And create new class:

    package YourPackage;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class AutoStart extends BroadcastReceiver
    {   
        Alarm alarm = new Alarm();
        @Override
        public void onReceive(Context context, Intent intent)
        {   
            if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED"))
            {
                alarm.SetAlarm(context);
            }
        }
    }
    

    Alarms work in a different manner on and after API 19, make sure you are using API 18 and below if you want this to work. Otherwise you can include methods for API 19 from the official Docs.