-4

I'm trying to start a 1 minute alarm from a dialog box. This is my dialog method (with AlarmManager and everything):

    public void Dialog2(){
    new AlertDialog.Builder(context)
            .setTitle("Email!")
            .setMessage("Would You Like to Set a 1 Minute Reminder?\nRemember to Email Your Professor!")
            .setPositiveButton("Set Alarm!", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
                    Intent intent = new Intent(context, AlarmReceiver.class);
                    PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

                    alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                            SystemClock.elapsedRealtime() +
                                    60 * 1000, alarmIntent);


                }
            })
            .setNegativeButton("Cancel!", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                }
            })
            .show();
}

This is my AlarmReceiver Class:

public class AlarmReceiver extends WakefulBroadcastReceiver{
@Override
public void onReceive(final Context context, Intent intent) {
    Toast.makeText(context, "Don't Forget To Email Your Teacher!.",
            Toast.LENGTH_LONG).show();
    Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
    vibrator.vibrate(2000);
    Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
    if (alarmUri == null) {
        alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    }
    Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri);
    ringtone.play();
}
}

In my AndroidManifest, I've included:

    <service android:enabled="true" android:name=".ServiceClass" />
    <receiver android:name=".AlarmReceiver" />

This is my Service Class:

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;


public class ServiceClass extends Service{

@Override
public void onCreate() {
    super.onCreate();
}

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

@Override
public void onDestroy() {
    super.onDestroy();
}

@Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
}

}

Please help! Thanks in advance!!

Meenal
  • 2,879
  • 5
  • 19
  • 43
Yikes
  • 87
  • 1
  • 11

2 Answers2

1

Your code based on Android Dev Guide is working, to be more precise, this one:

alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
alarmMgr.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime() + 10 * 1000, alarmIntent);

Alarm.Receiver.java:

public class AlarmReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {

            /* class1 = new MainActivity();
            class1.message();*/
        Toast.makeText(context, "Don't Forget To Email Your Teacher!.",
                Toast.LENGTH_LONG).show();
        Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
        vibrator.vibrate(1000);
        Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
        if (alarmUri == null)
        {
            alarmUri =       RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        }
        Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri);
        ringtone.play();

    }
}

3 things I needed to do to make it work (on API 16 to 25):

Add permissions BEFORE application in your manifest:

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.SET_ALARM" />
<uses-permission android:name="android.permission.VIBRATE" />

Move receiver WITHIN application:

<receiver android:name=".Action.AlarmReceiver"> //change according to your path
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

And finally ... reboot Android Studio. Yep, I don't know why, but I had to do it to make it work in my case.

Hope it helps!

user8036224
  • 420
  • 1
  • 4
  • 11
0

If you want to start a service from AlarmManager you should start the service in onReceive method of AlarmReceiver class

Darshana
  • 406
  • 5
  • 18