VSB
VSB

Reputation: 10415

Android: Alarm is not triggered sometimes

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

Answers (1)

Kuffs
Kuffs

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

Related Questions