notification does not appear

215 Views Asked by At

The code bellow is supposed to show a heads up notification, but it is not appearing. However, the MessageActivity is starting without the notification shows up. This activity was supposed to start just when clicking the notification.

This problem does not occurs in API 23 (M). It only occurs in API 16 (JELLY_BEAN). Why the heads up notification appears in android M and is not appearing on android JellyBean?

Thank you in advance.

public class RunAlarm extends BroadcastReceiver{

    public static final String ACTION = "br.com.irms.randomalarm.RUN_ALARM_ACTION";
    private static final int ID_NOTIFICATION = 1;

    @Override
    public void onReceive(Context context, Intent intent) {
        String source = intent.getStringExtra("source");

        if(source.equals("scheduled_alarm")) {
            Intent showNotificationIntent = new Intent(context, MessageActivity.class);
            String contentTitle = context.getString(R.string.alarm);
            String contentText = intent.getStringExtra("hour");
            createHeadsUpNotificationWithAction(context, showNotificationIntent, contentTitle, contentText, ID_NOTIFICATION);
        } else if(source.equals("dismiss_alarm")) {
            Toast.makeText(context,"Alarm dismiss",Toast.LENGTH_SHORT).show();
            NotificationManagerCompat nm = NotificationManagerCompat.from(context);
            nm.cancel(ID_NOTIFICATION);
        } else if(source.equals("snooze_alarm")) {
            Toast.makeText(context,"Alarm snooze",Toast.LENGTH_SHORT).show();
            NotificationManagerCompat nm = NotificationManagerCompat.from(context);
            nm.cancel(ID_NOTIFICATION);
        }
    }

    public void createHeadsUpNotificationWithAction((Context context, Intent intent, String contentTitle, String contentText, int id) {
        PendingIntent p = getPendingIntent(context, intent, id);

        NotificationCompat.Builder b = new NotificationCompat.Builder(context);
        b.setDefaults(NotificationCompat.DEFAULT_ALL);
        b.setSmallIcon(R.drawable.ic_alarm_black_24dp);
        b.setContentTitle(contentTitle);
        b.setContentText(contentText);
        b.setContentIntent(p);
        b.setAutoCancel(true);
        b.setPriority(Notification.PRIORITY_MAX);
        b.setFullScreenIntent(p,false);

        try {
            Intent dismissAlarmIntent = new Intent();
            dismissAlarmIntent.setAction(ACTION);
            dismissAlarmIntent.putExtra("source","dismiss_alarm");
            PendingIntent actionDismissAlarmIntent = null;
            actionDismissAlarmIntent = PendingIntent.getBroadcast(
                    context, IdService.getUniqueId(context), dismissAlarmIntent, 0);

            Intent snoozeAlarmIntent = new Intent();
            snoozeAlarmIntent.setAction(ACTION);
            snoozeAlarmIntent.putExtra("source","snooze_alarm");
            PendingIntent actionSnoozeAlarmIntent = null;
            actionSnoozeAlarmIntent = PendingIntent.getBroadcast(
                    context, IdService.getUniqueId(context), snoozeAlarmIntent, 0);

            b.addAction(R.drawable.ic_delete_black_24dp, "Pause", actionDismissAlarmIntent);
            b.addAction(R.drawable.ic_calendar_black_24dp, "Play", actionSnoozeAlarmIntent);
        } catch (IOException e) {
            e.printStackTrace();
        }

        NotificationManagerCompat nm = NotificationManagerCompat.from(context);
        nm.notify(id, b.build());

    }

    private static PendingIntent getPendingIntent(Context context, Intent intent, int id) {
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
        stackBuilder.addParentStack(intent.getComponent());
        stackBuilder.addNextIntent(intent);
        PendingIntent p = stackBuilder.getPendingIntent(id, PendingIntent.FLAG_UPDATE_CURRENT);
        return p;
    }
}

This is my androidManifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.com.irms.layouttab">
    <uses-permission android:name="android.permission.VIBRATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name="br.com.irms.randomalarm.MainActivity"
            android:launchMode="singleTop"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name="br.com.irms.randomalarm.RunAlarm">
            <intent-filter>
                <action android:name="br.com.irms.randomalarm.RUN_ALARM_ACTION" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

        <activity
            android:name="br.com.irms.randomalarm.MessageActivity"
            android:label="@string/title_activity_message"
            android:parentActivityName="br.com.irms.randomalarm.MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="br.com.irms.randomalarm.MainActivity" />
        </activity>
    </application>

</manifest>
2

There are 2 best solutions below

0
On

After some time looking for the answer I found it on the question bellow

HeadsUp Notification not displayed on KitKat

In short the heads up notification was only added in android 5.0. So, it was just appearing in status bar and I did not realize that.

0
On

you can manage notification like this Ex:- if (currentapiVersion < android.os.Build.VERSION_CODES.HONEYCOMB) {

        notification = new Notification(icon, text, time);
        notification.setLatestEventInfo(this, title, text, contentIntent); // This method is removed from the Android 6.0
        notification.flags |= Notification.FLAG_AUTO_CANCEL;
        mNM.notify(NOTIFICATION, notification);
    } else {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(
                this);
        notification = builder.setContentIntent(contentIntent)
                .setSmallIcon(icon).setTicker(text).setWhen(time)
                .setAutoCancel(true).setContentTitle(title)
                .setContentText(text).build();

        mNM.notify(NOTIFICATION, notification);
    }