From http://karanbalkar.com/2013/07/tutorial-41-using-alarmmanager-and-broadcastreceiver-in-android/
Hello friends!
Sometimes we need to create an application that notifies a user at a particulartime/date even though the user has not opened the application. The Android SDK provides developers an abstract class called BroadcastReceiver which is used to pass a notification to the user in case any specific event occurs.
In addition, developers can also schedule and add events using theAlarmManager class. As stated in the Android developer’s guide, when an alarm goes off, the Intent that had been registered using AlarmManager is broadcasted by the system, automatically starting the target application if it is not already running.
Using the above concepts, we will now create an Android application that sends anotification message to the user at a particular time (for example: 11:25:00 AM).
Pre-requisites: Eclipse IDE (preferably latest version) , Android SDK (tested below code on Android 2.3.3)
Create a new Android application project named AndroidAlarmManagerDemowith package name com.example. Select Target SDK as Android 2.3.3
Now, let’s create our startup Activity called MainActivity by adding the following code!
MainActivity.java
package
com.example;
import
java.util.Calendar;
import
android.app.Activity;
import
android.app.AlarmManager;
import
android.app.PendingIntent;
import
android.content.Intent;
import
android.os.Bundle;
public
class
MainActivity
extends
Activity
{
private
PendingIntent pendingIntent;
@Override
public
void
onCreate(Bundle savedInstanceState)
{
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MONTH,
6
);
calendar.set(Calendar.YEAR,
2013
);
calendar.set(Calendar.DAY_OF_MONTH,
13
);
calendar.set(Calendar.HOUR_OF_DAY,
20
);
calendar.set(Calendar.MINUTE,
48
);
calendar.set(Calendar.SECOND,
0
);
calendar.set(Calendar.AM_PM,Calendar.PM);
Intent myIntent =
new
Intent(MainActivity.
this
, MyReceiver.
class
);
pendingIntent = PendingIntent.getBroadcast(MainActivity.
this
,
0
, myIntent,
0
);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);
}
//end onCreate
}
|
As stated earlier, we need to create a BroadcastReceiver that will that receive Intents. I have named my receiver class as MyReceiver.
MyReceiver.java
package
com.example;
import
android.content.BroadcastReceiver;
import
android.content.Context;
import
android.content.Intent;
public
class
MyReceiver
extends
BroadcastReceiver
{
@Override
public
void
onReceive(Context context, Intent intent)
{
Intent service1 =
new
Intent(context, MyAlarmService.
class
);
context.startService(service1);
}
}
|
We also need to implement a Service that represents the application’s need to run a longer operation in the background without interacting with the user. For this purpose let’s create a Service called MyAlarmService.
package
com.example;
import
android.app.Notification;
import
android.app.NotificationManager;
import
android.app.PendingIntent;
import
android.app.Service;
import
android.content.Intent;
import
android.os.IBinder;
public
class
MyAlarmService
extends
Service
{
private
NotificationManager mManager;
@Override
public
IBinder onBind(Intent arg0)
{
// TODO Auto-generated method stub
return
null
;
}
@Override
public
void
onCreate()
{
// TODO Auto-generated method stub
super
.onCreate();
}
@SuppressWarnings
(
"static-access"
)
@Override
public
void
onStart(Intent intent,
int
startId)
{
super
.onStart(intent, startId);
mManager = (NotificationManager)
this
.getApplicationContext().getSystemService(
this
.getApplicationContext().NOTIFICATION_SERVICE);
Intent intent1 =
new
Intent(
this
.getApplicationContext(),MainActivity.
class
);
Notification notification =
new
Notification(R.drawable.ic_launcher,
"This is a test message!"
, System.currentTimeMillis());
intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP| Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingNotificationIntent = PendingIntent.getActivity(
this
.getApplicationContext(),
0
, intent1,PendingIntent.FLAG_UPDATE_CURRENT);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.setLatestEventInfo(
this
.getApplicationContext(),
"AlarmManagerDemo"
,
"This is a test message!"
, pendingNotificationIntent);
mManager.notify(
0
, notification);
}
@Override
public
void
onDestroy()
{
// TODO Auto-generated method stub
super
.onDestroy();
}
}
|
Finally, don’t forget to change the AndroidManifest.xml file to include theService and the Receiver entries along with the necessary permissions. Save all changes and run the project on an Android device. You should see the following output!
AndroidManifest.xml
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
package
=
"com.example"
android:versionCode
=
"1"
android:versionName
=
"1.0"
>
<
uses-sdk
android:minSdkVersion
=
"8"
android:targetSdkVersion
=
"10"
/>
<
uses-permission
android:name
=
"android.permission.WAKE_LOCK"
/>
<
application
android:allowBackup
=
"true"
android:icon
=
"@drawable/ic_launcher"
android:label
=
"@string/app_name"
android:theme
=
"@style/AppTheme"
>
<
activity
android:name
=
"com.example.MainActivity"
android:label
=
"@string/app_name"
>
<
intent-filter
>
<
action
android:name
=
"android.intent.action.MAIN"
/>
<
category
android:name
=
"android.intent.category.LAUNCHER"
/>
</
intent-filter
>
</
activity
>
<
activity
android:name
=
"com.example.NextActivity"
android:label
=
"Next Screen"
>
</
activity
>
<
service
android:name
=
".MyAlarmService"
android:enabled
=
"true"
/>
<
receiver
android:name
=
".MyReceiver"
/>
</
application
>
</
manifest
>
|
Source code for this tutorial can be found over here