Trondro Mulligan
Trondro Mulligan

Reputation: 505

How to show status bar notification at a later time?

I've successfully created a status bar notification but I want it to pop up 6 hours after the user exits the app.

I have the following code:

public class myClass extends superClass implements myinterface {

    final int NOTIF_ID = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {.........}

    /* more methods etc */ ......

    @Override
    protected void onDestroy() {
        View iop = (View) findViewById(R.id.app);
        sendNotification(iop);

        super.onDestroy();
    }

    public void sendNotification(View view) {

        // Use NotificationCompat.Builder to set up our notification.
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);

        //icon appears in device notification bar and right hand corner of notification
        builder.setSmallIcon(R.drawable.ic_launcher);

        // This intent is fired when notification is clicked
        Intent intent = new Intent(view.getContext(), AndroidLauncher.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

        // Set the intent that will fire when the user taps the notification.
        builder.setContentIntent(pendingIntent);

        // Large icon appears on the left of the notification
        builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));

        // Content title, which appears in large type at the top of the notification
        builder.setContentTitle("Notifications Title");

        // Content text, which appears in smaller text below the title
        builder.setContentText("Your notification content here.");

        // The subtext, which appears under the text on newer devices.
        // This will show-up in the devices with Android 4.2 and above only
        builder.setSubText("Tap to view documentation about notifications.");

        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        // Will display the notification in the notification bar
        notificationManager.notify(NOTIF_ID, builder.build());
}

A status bar notification pops up when the app is exited but I want it to popup after 6 hours since the time user exits the app. How do I go about it?

Thanks in advance!

Upvotes: 0

Views: 1253

Answers (4)

rafsanahmad007
rafsanahmad007

Reputation: 23881

create a new class which will execute the alarm using pending intent and alarm manager.

long time= 6*60*60*1000; //6 hours
new Alarm_task(this, time).run();

public class Alarm_task implements Runnable{

    // The android system alarm manager
    private final AlarmManager am;
    // Your context to retrieve the alarm manager from
    private final Context context;
    long alarm_time;

    public Alarm_task(Context context, long time) {
        this.context = context;
        this.am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        this.alarm_time = time;
    }

    @Override
    public void run() {
        // Request to start are service when the alarm date is upon us
        //pop up a notification into the system bar not a full activity
        Intent i = new Intent("intent name");
        // can create a dialog in that intent or just call the sendNotification() function
        /** Creating a Pending Intent */
        PendingIntent operation = PendingIntent.getActivity(getBaseContext(), 0, i, Intent.FLAG_ACTIVITY_NEW_TASK);

        /** Setting an alarm, which invokes the operation at alart_time */
       alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime() + alarm_time, operation);
    }
}

define intent in your manifest file:

<activity
        android:name=".Activity name"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="Intent name" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

now in that activity you can call Sendnotification() function during onCreate().. or show some UI according to your application

Upvotes: 2

Vishwesh Jainkuniya
Vishwesh Jainkuniya

Reputation: 2839

call this method from onDestroy

public void Remind (String title, String message)
    {



AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);

                        Intent notificationIntent = new Intent("android.media.action.DISPLAY_NOTIFICATION");
                        notificationIntent .PutExtra ("message", message);
        notificationIntent .PutExtra ("title", title);
                    notificationIntent.addCategory("android.intent.category.DEFAULT");

                    PendingIntent broadcast = PendingIntent.getBroadcast(context, 0 , notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

                    Calendar cal = Calendar.getInstance();

                    if (android.os.Build.VERSION.SDK_INT>16)
                    {
                        alarmManager.setExact(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis()+ 6*60*60*1000, broadcast);
                    }else
                    {
                        alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis() + 6*60*60*1000, broadcast);
                    }

}

Create a new JAVA file

    public class Broadcast extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent1) {
        String message = intent1.getStringExtra ("message");
        String title = intent1.getStringExtra ("title");

// This intent is fired when notification is clicked
Intent notificationIntent = new Intent(context, AndroidLauncher.class);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    stackBuilder.addParentStack(AndroidLauncher.class);
    stackBuilder.addNextIntent(notificationIntent);

    PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);


// Use NotificationCompat.Builder to set up our notification.
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);

        //icon appears in device notification bar and right hand corner of notification
        builder.setSmallIcon(R.mipmap.ic_launcher);




        // Set the intent that will fire when the user taps the notification.
        builder.setContentIntent(pendingIntent);



        // Content title, which appears in large type at the top of the notification
        builder.setContentTitle("Notifications Title");

        // Content text, which appears in smaller text below the title
        builder.setContentText("Your notification content here.");

        // The subtext, which appears under the text on newer devices.
        // This will show-up in the devices with Android 4.2 and above only
        builder.setSubText("Tap to view documentation about notifications.");

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

        // Will display the notification in the notification bar
        notificationManager.notify(0, builder.build());



    }

Register this Receiver in Manifest

<receiver android:name=".Broadcast">
            <intent-filter>
                <action android:name="android.media.action.DISPLAY_NOTIFICATION" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

Upvotes: 1

se_bastiaan
se_bastiaan

Reputation: 1702

You can use an AlarmManager to schedule a broadcast that contains your notification.

private void scheduleNotification() {
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder.setContentTitle("Scheduled Notification");
    builder.setContentText(content);
    builder.setSmallIcon(R.drawable.ic_launcher);]
    Notification notification = builder.build();

    Intent notificationIntent = new Intent(this, NotificationPublisher.class);
    notificationIntent.putExtra(NotificationPublisher.NOTIFICATION_ID, 1);
    notificationIntent.putExtra(NotificationPublisher.NOTIFICATION, notification);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    long futureInMillis = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(6);
    AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);
}

Then use a BroadcastReceiver to receive the intent and show the notification.

public class NotificationPublisher extends BroadcastReceiver {

    public static String NOTIFICATION_ID = "notification-id";
    public static String NOTIFICATION = "notification";

    public void onReceive(Context context, Intent intent) {

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

        Notification notification = intent.getParcelableExtra(NOTIFICATION);
        int id = intent.getIntExtra(NOTIFICATION_ID, 0);
        notificationManager.notify(id, notification);

    }
}

Don't forget to register the receiver in your AndroidManifest.xml file.

(Source: https://gist.github.com/BrandonSmith/6679223)

Upvotes: 2

Sush
Sush

Reputation: 3874

You can do it by using alarm manager service and notification manager.

Upvotes: 0

Related Questions