Search code examples
androidservicenotificationsbroadcastreceiver

Alarm Manager showing abnormality


I have set an Alarm Manager which will show Notification 10 seconds after app will be destroyed.

But it's not working.

Here's my onDestroy() code:

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

Intent myIntent = new Intent(this, alarmManager.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, myIntent,0);

        AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
        //alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 10*1000, 10*1000, pendingIntent);
        alarmManager.cancel(pendingIntent);
}

and here is alarmManager.class:

public class alarmManager extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent service1 = new Intent(context, Notification.class);
           context.startService(service1);
    }

}

and here is Notification.class:

public class Notification extends Service {

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

        Intent mainIntent = new Intent(this, Main.class);

        NotificationManager notificationManager
            = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

        android.app.Notification noti = new NotificationCompat.Builder(this)
            .setAutoCancel(true)
            .setContentIntent(PendingIntent.getActivity(this, 0, mainIntent,
                              PendingIntent.FLAG_UPDATE_CURRENT))
            .setContentTitle("Title")
            .setContentText("It's been so Long!!!")
            .setSubText("Please return back to App")
            .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
            .setVibrate(new long[] {1000,1000,1000,1000})
            .setSmallIcon(R.drawable.ic_launcher)
            .setTicker("Important Notification")
            .setWhen(System.currentTimeMillis())
            .build();

        notificationManager.notify(0, noti);
    }

*I've been working on this since many days, but I am unable to get through it.

Any Help would be highly* appreciated.

Thanks in advance.


Solution

  • There are some relatively minor changes to make, but overall you've got the necessary code.

    1. You don't need a Service for this. Move the code to create the Notification to the BroadcastReceiver, and replace this with context everywhere.
    2. Make sure your BroadcastReceiver is listed in the manifest.
    3. Don't use setRepeating() for the alarm; use set(). You only need it to fire once.
    4. Remove the following line: alarmManager.cancel(pendingIntent);

    Those are the changes necessary to get it working. However, you might also consider removing the sound and vibration from the Notification, and treat it more like a status message. It would also be preferable to rename your BroadcastReceiver class. Perhaps something like AlarmReceiver, to be in keeping with Java class naming conventions, and to avoid confusion with the AlarmManager class.