Search code examples
javaandroidnotificationsbroadcastreceiver

How to create a custom notification in android


I would like to create a custom notification service in my app. I wouldn't use the google service (google cloud messaging). Is there a way to create a daemon that check every X seconds a particular condition on my app db and show a notification? Thank you,

edit

I call this method in MainActivity's oncreate(). I get the times from my db

    private void restartNotify() {
    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
            intent, PendingIntent.FLAG_CANCEL_CURRENT);
    am.cancel(pendingIntent);
    ArrayList<String> item = new ArrayList<String>();
    item = GetLists.GetTimesListForNotification(this);
    for (int i = 0; i < item.size(); ++i) {
        String time = item.get(i);
        int Position = time.indexOf(":");
        int hour = Integer.parseInt(time.substring(0, Position));
        int min = Integer.parseInt(time.substring(Position + 1));
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, hour);
        cal.set(Calendar.MINUTE, min);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        am.set(AlarmManager.RTC, cal.getTimeInMillis(),
                pendingIntent);
    }

And this is my broadcast receiver

public class AlarmReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    NotificationManager mManager;
    mManager = (NotificationManager) context.getApplicationContext()
            .getSystemService(
                    context.getApplicationContext().NOTIFICATION_SERVICE);
    Intent intent1 = new Intent(context.getApplicationContext(),
            MainActivity.class);

    Notification notification = new Notification(R.drawable.ic_launcher,
            "New message to read", System.currentTimeMillis());
    intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
            | Intent.FLAG_ACTIVITY_CLEAR_TOP);

    PendingIntent pendingNotificationIntent = PendingIntent.getActivity(
            context.getApplicationContext(), 0, intent1,
            PendingIntent.FLAG_UPDATE_CURRENT);
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notification.setLatestEventInfo(context.getApplicationContext(),
            "notification are work", "it's work",
            pendingNotificationIntent);

    mManager.notify(0, notification);
}

}


Solution

  • You can use AlarmManager + BroadcastReceiver like so:

    private void setRecurringAlarm(Context context) {
        Intent downloader = new Intent(this, MyStartServiceReceiver.class);
        downloader.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, downloader, PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(pendingIntent);
        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 6000, 10000, pendingIntent);
    }
    

    BroadcastReceiver class:

    public class MyStartServiceReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
        //do the stuff...
    
        }
    }
    

    And don't forget to register receiver in your manifest:

    <receiver android:name=".MyStartServiceReceiver"
            android:enabled="true"/>