Android Core

Android AlarmManager tutorial

While writing an application, need arises to schedule execution of code in future. You may require AlarmManager to schedule your work at a specified time. AlarmManager accesses to system alarm and schedules the execution of code even when the application is not running.

Project Information: Meta-information about the project. Platform Version : Android API Level 10.
IDE : Eclipse Helios Service Release 2
Emulator: Android 4.1

Prerequisite: Preliminary knowledge of Android application framework, and Intent Broadcast receiver.

AlarmManager:

AlarmManager has access to the system alarm services. With the help of AlarmManager you can schedule execution of code in future. AlarmManager object can’t instantiate directly however it can be retrieved by calling Context.getSystemService(Context.ALARM_SERVICE). AlarmManager is always registered with intent. When an alarm goes off, the Intent which has been registered with AlarmManager, is broadcasted by the system automatically. This intent starts the target application if it is not running. It is recommended to use AlarmManager when you want your application code to be run at a specific time, even if your application is not currently running. For other timing operation handler should be used because it is easy to use. Handler is covered in other tutorial.

MethodDescription
set()Schedules an alarm for one time.
setInexactRepeating()Schedules an alarm with inexact repeating. Trigger time doesn’t follow any strict restriction.
setRepeating()Schedules an alarm with exact repeating time.
setTime()Sets the system’s wall clock time.
setTimeZone()Sets the system’s default time zone.

Check out the AlarmManager documention for more info.

In this tutorial let’s learn to create one-time timer and the repeating timer, and also to cancel the repeating timer. Here timer and alarm have been used interchangeably, but in this tutorial context both of them have the same meaning.

Example Code:

Let’s create three buttons start repeating timer, cancel repeating timer and one-time timer in the layout file. These buttons are attached with methods i.e startRepeatingTimer, cancelRepeatingTimer and onetimeTimer respecitively. These methods will be defined in the Activity class. The layout file is shown below(activity_alarm_manager.xml).

 <linearlayout android:layout_height='match_parent' 
    android:layout_width='match_parent' android:orientation='vertical' 
    xmlns:android='http://schemas.android.com/apk/res/android' 
    xmlns:tools='http://schemas.android.com/tools'>

    <button android:id='@+id/btStart' android:layout_height='wrap_content' 
      android:layout_width='match_parent' android:onclick='startRepeatingTimer' 
      android:padding='@dimen/padding_medium' android:text='@string/btStart'   
      tools:context='.WidgetAlarmManagerActivity'/>
    <button android:id='@+id/btCancel' android:layout_height='wrap_content' 
      android:layout_width='match_parent' android:onclick='cancelRepeatingTimer'  
      android:padding='@dimen/padding_medium' android:text='@string/btCancel' 
      tools:context='.WidgetAlarmManagerActivity'/>
     <button android:id='@+id/btOneTime' android:layout_height='wrap_content' 
     android:layout_width='match_parent' android:onclick='onetimeTimer' 
     android:padding='@dimen/padding_medium' android:text='@string/btOneTime'   
     tools:context='.WidgetAlarmManagerActivity'/>
   </linearlayout>

We are going to define the BroadcastReciever which handles the intent registered with AlarmManager. In the given class onReceive() method has been defined. This method gets invoked as soon as intent is received. Once we receive the intent we try to get the extra parameter associated with this intent. This extra parameter is user-defined i.e ONE_TIME, basically indicates whether this intent was associated with one-time timer or the repeating one. Once the ONE_TIME parameter value has been extracted, Toast message is displayed accordingly. Helper methods have also been defined, which can be used from other places with the help of objects i.e setAlarm(), cancelAlarm() and onetimeTimer() methods. These methods can also be defined somewhere else to do operation on the timer i.e set, cancel, etc. To keep this tutorial simple, we have defined it in BroadcastReceiver.

setAlarm(): This method sets the repeating alarm by use of setRepeating() method. setRepeating() method needs four arguments:

  1. type of alarm,
  2. trigger time: set it to the current time
  3. interval in milliseconds: in this example we are passing 5 seconds ( 1000 * 5 milliseconds)
  4. pending intent: It will get registered with this alarm. When the alarm gets triggered the pendingIntent will be broadcasted.

cancelAlarm(): This method cancels the previously registered alarm by calling cancel() method. cancel() method takes pendingIntent as an argument. The pendingIntent should be matching one, only then the cancel() method can remove the alarm from the system.

onetimeTimer(): This method creates an one-time alarm. This can be achieved by calling set() method. set() method takes three arguments:

  1. type of alarm
  2. trigger time
  3. pending intent
package com.rakesh.alarmmanagerexample;

import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.PowerManager;
import android.widget.Toast;

public class AlarmManagerBroadcastReceiver extends BroadcastReceiver {

 final public static String ONE_TIME = 'onetime';

 @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, 'YOUR TAG');
         //Acquire the lock
         wl.acquire();

         //You can do the processing here.
         Bundle extras = intent.getExtras();
         StringBuilder msgStr = new StringBuilder();
         
         if(extras != null && extras.getBoolean(ONE_TIME, Boolean.FALSE)){
          //Make sure this intent has been sent by the one-time timer button.
          msgStr.append('One time Timer : ');
         }
         Format formatter = new SimpleDateFormat('hh:mm:ss a');
         msgStr.append(formatter.format(new Date()));

         Toast.makeText(context, msgStr, Toast.LENGTH_LONG).show();
         
         //Release the lock
         wl.release();
 }

 public void SetAlarm(Context context)
    {
        AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
        intent.putExtra(ONE_TIME, Boolean.FALSE);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
        //After after 5 seconds
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 5 , pi); 
    }

    public void CancelAlarm(Context context)
    {
        Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
        PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(sender);
    }

    public void setOnetimeTimer(Context context){
     AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
        intent.putExtra(ONE_TIME, Boolean.TRUE);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi);
    }
}

Given below is the manifest file. Here, WAKE_LOCK permission is required because the wake lock is being used while processing in onReceive() method present in AlarmManagerBroadcastReceiver class. AlarmManagerBroadcastReceiver has been registered as broadcast receiver.

<manifest android:versioncode='1' android:versionname='1.0' 
       package='com.rakesh.alarmmanagerexample' 
       xmlns:android='http://schemas.android.com/apk/res/android'>

   <uses-sdk android:minsdkversion='10' android:targetsdkversion='15'/>
   <uses-permission android:name='android.permission.WAKE_LOCK'/>
    <application android:icon='@drawable/ic_launcher' 
       android:label='@string/app_name' android:theme='@style/AppTheme'>
        <activity android:label='@string/title_activity_alarm_manager' 
           android:name='com.rakesh.alarmmanagerexample.AlarmManagerActivity'>
            <intent-filter>
                <action android:name='android.intent.action.MAIN'/>
                <category android:name='android.intent.category.LAUNCHER' />
          </intent-filter>
        </activity>
        <receiver android:name='com.rakesh.alarmmanagerexample.AlarmManagerBroadcastReceiver'>
        </receiver>
    </application>
</manifest>

Now let’s define the activity class which defines some methods. These methods are going to handle the button clicks. Here in this class we create an instance of AlarmManagerBroadcastReciever which will help us to access setAlarm(), cancelAlarm() and setOnetime(). Rest of the code is easy to understand.

package com.rakesh.alarmmanagerexample;

import com.rakesh.alarmmanagerexample.R;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import android.support.v4.app.NavUtils;

public class AlarmManagerActivity extends Activity {

 private AlarmManagerBroadcastReceiver alarm;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alarm_manager);
        alarm = new AlarmManagerBroadcastReceiver();
    }
    
    @Override
 protected void onStart() {
  super.onStart();
 }

    public void startRepeatingTimer(View view) {
     Context context = this.getApplicationContext();
     if(alarm != null){
      alarm.SetAlarm(context);
     }else{
      Toast.makeText(context, 'Alarm is null', Toast.LENGTH_SHORT).show();
     }
    }
    
    public void cancelRepeatingTimer(View view){
     Context context = this.getApplicationContext();
     if(alarm != null){
      alarm.CancelAlarm(context);
     }else{
      Toast.makeText(context, 'Alarm is null', Toast.LENGTH_SHORT).show();
     }
    }
    
    public void onetimeTimer(View view){
     Context context = this.getApplicationContext();
     if(alarm != null){
      alarm.setOnetimeTimer(context);
     }else{
      Toast.makeText(context, 'Alarm is null', Toast.LENGTH_SHORT).show();
     }
    }
    
 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_widget_alarm_manager, menu);
        return true;
    }
}

Once you are done with the coding, just execute the project and you will find the similar kind of application running in your emulator.

Please download AlarmManagerExample code, if you need reference code.

Happy coding and don’t forget to share!

Reference: Tutorial on Android AlarmManager from our JCG partner Rakesh Cusat at the Code4Reference blog.

Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

14 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
shareef
shareef
11 years ago

greate the code is running ggod ; but still can add more details on intent to clarify more the articile explanation thanks so much

newDev
newDev
10 years ago

Using a button, you can directly cancel the alarm. But is there a way to count how many times the alarm has been called off? I need to cancel the alarm after n executions. How can i do that?

kavitha
kavitha
10 years ago
Reply to  newDev

Alarm intents are delivered with a data extra of type int called Intent.EXTRA_ALARM_COUNT that indicates how many past alarm events have been accumulated into this intent broadcast

gaurav
gaurav
10 years ago

Hi.. M new to android and want to make an app to perform task in future time given by user, could u plz help me with that. Where can I contact u??

Pradip Kumbhar
Pradip Kumbhar
10 years ago

Hello,
Thanks for this tutorial, I am following this tutorial, My app is already having one more receiver it’s for different purpose and I have added receiver for showing toast message as per your tutorial but problem is that message is getting displayed once app is launched, it’s not waiting for user to click on button i.e onreceive() is getting called from start i.e from app is launced.

Can you please tell me what wrong i am doing?

joy
joy
10 years ago

good one and nice

if any one looking for Android Alarm Manager to set a Remainder with Notification and Sound
Have a look
http://clearosapps.blogspot.in/p/android.html

behnoud
behnoud
9 years ago

Hi , thanks for the tutorial.
I have a question.
Which part of the code is executed every time that the alarm fires?
Consider that I want to increase a counter every five minutes.
where do I put “counter+=1”?
thanks for your answer:)

Nitin
Nitin
9 years ago

hi..

In my application , i Have to set 6 different notifications at different dates & Time .

How to do it that ?

I am trying to setting alarm 1st then, then In broadcast receiver i m calling / setting notifications.

Is this approach is correct ? Can you help me more ….!!!

Nitram
Nitram
9 years ago

Hi …
I’m programming an alarm. But the problem is that if you completely turn off the phone, then does not turn on at the programmed time. How I can turn the phone from my application?
A greeting and thank you very much

Aman Deep
Aman Deep
9 years ago

Hello,
I download your sample code and run it on my Mobile.
It did not call OnReceive ..

srinivaas
srinivaas
8 years ago

Your website is great and all the android tutorials are excellent. I love the fact that you give a complete working example to explain any feature which makes it very easy to understand things.

Deepanshu sharma
Deepanshu sharma
7 years ago

I am getting toast of Null alarm always when i press the button…..means object of AlarmManagerBroadcastReceiver is null.
what did i miss? please rply

Sitwell Kahilu
Sitwell Kahilu
7 years ago

Thanks for the tutorial

Jon Kinadan
Jon Kinadan
7 years ago

THis is good tutorial,
you are lifeSaver

Back to top button