Reputation: 10415
I have an application which schedule some activities using AlarmManager service. It works most of times, however sometimes it does not send broadcast and so broadcast receiver does not receive anything (even when the app is up and running and is front activity). I read the alarm time from a TimePicker widget. Here are my code snippets:
Set Alarm:
private void setAlarm(int hour, int minute) {
//define intent and parameters
Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
intent.putExtra(TAG_NAME, name);
intent.putExtra(TAG_ADDRESS, address);
intent.putExtra(TAG_AVERAGE, average);
intent.putExtra(TAG_DATABASE_ID, dbID);
//define alarm pedning intent
PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(),(int)dbID,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
//calculate alarm time
Calendar currentTimeCalendar = Calendar.getInstance();
currentTimeCalendar.set(Calendar.HOUR_OF_DAY, hour);
currentTimeCalendar.set(Calendar.MINUTE, minute);
currentTimeCalendar.set(Calendar.SECOND, 0);
int h = currentTimeCalendar.get(Calendar.HOUR_OF_DAY);
int m = currentTimeCalendar.get(Calendar.MINUTE);
int s= currentTimeCalendar.get(Calendar.SECOND);
Toast.makeText(getApplicationContext(), "Hour "+h+":"+m+":"+s, Toast.LENGTH_LONG).show();
SimpleDateFormat dateFormat = new SimpleDateFormat("DD-MMM-yyyy hh:mm:ss");
String date = dateFormat.format(currentTimeCalendar.getTime());
Log.v("VSB_TAG","Alarm Time: "+date);
// set alarm
AlarmManager alarmMgr = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmMgr.set(AlarmManager.RTC_WAKEUP, currentTimeCalendar.getTimeInMillis(), alarmIntent);
}
Broadcast receiver:
public class AlarmReceiver extends BroadcastReceiver {
public AlarmReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Log.v("VHB_TAG", "Alarm Received");
if (bundle == null)
return;
String name = bundle.getString(StudentDetailsActivity.TAG_NAME);
String address = bundle.getString(StudentDetailsActivity.TAG_ADDRESS);
double average = bundle.getDouble(StudentDetailsActivity.TAG_AVERAGE);
long dbID = bundle.getLong(StudentDetailsActivity.TAG_DATABASE_ID);
Toast.makeText(context, "Alarm for " + name, Toast.LENGTH_LONG).show();
displayStudentNotification(context, name, address, dbID,bundle);
}
private void displayStudentNotification(Context context, String name, String address, long dbID, Bundle bundle) {
....
....
}
}
And here is the manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.evegroup.studentslist">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".StudentDetailsActivity" />
<receiver
android:name=".AlarmReceiver"
android:enabled="true"
android:exported="true"></receiver>
</application>
</manifest>
Upvotes: 1
Views: 190
Reputation: 35651
As your issue is intermittent, it is likely that the problem is not in the code you have shown.
If an alarm is set, it fires so you need to check that you are setting it correctly or when expected.
You could also be overwriting the alarm you want with a different one set at a later time.
Upvotes: 1