maregor
maregor

Reputation: 797

Displaying push notification while app is not open

I'm trying to create notifications for my app that sends notifications when a certain task is due. Each task has a deadline time so I want to send a notification for each task when their deadline has passed.

My main class is called RecyclerViewDemoActivity and inside the onCreate() I have this:

public void setNotification()
{
    Intent intent=new Intent(this,NotificationClass.class);
    AlarmManager manager=(AlarmManager)getSystemService(Activity.ALARM_SERVICE);
    PendingIntent pendingIntent= PendingIntent.getService(this, 0, intent, 0);
    // hardcoding the time just for this example
    manager.set(AlarmManager.RTC_WAKEUP,1449208683000,pendingIntent); 
}

and I have a NotificationClass that looks like this:

public class NotificationClass extends Service {

    @Override
    public void onCreate()
    {
        Intent resultIntent=new Intent(this, RecyclerViewDemoActivity.class);
        PendingIntent pIntent=PendingIntent.getActivity(this,0,resultIntent,0);
        Notification nBuilder= new Notification.Builder(this)
            .setContentTitle("This task is due!")
            .setContentIntent(pIntent)
            .setSmallIcon(R.mipmap.ic_launcher)
            .build();
        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        nBuilder.flags |=Notification.FLAG_AUTO_CANCEL;

        notificationManager.notify(1,nBuilder);

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

Manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.grokkingandroid.samplesapp.samples.recyclerviewdemo" >
<uses-permission android:name="android.permission.READ_CALENDAR"></uses-permission>
<uses-permission android:name="android.permission.WRITE_CALENDAR"></uses-permission>
<application

    android:name="com.teamvallartas.autodue.RecyclerViewDemoApp"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <activity
        android:name="com.teamv.RecyclerViewDemoActivity"
        android:label="@string/app_name"
        android:configChanges="orientation"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

</application>

I looked at this resource for the code above and also Vogella's resource on notifications but I don't know why this is not working.

Upvotes: 0

Views: 988

Answers (2)

Pankaj Kumar
Pankaj Kumar

Reputation: 82958

Check if onCreate of Service class is getting called. If it is, then the problem is "You placed your code at wrong method.".

You need to move code into onStartCommand(Intent intent, int flags, int startId).

Like

@Override
  public int onStartCommand(Intent intent, int flags, int startId) {
      Intent resultIntent=new Intent(this, RecyclerViewDemoActivity.class);
        PendingIntent pIntent=PendingIntent.getActivity(this,0,resultIntent,0);
        Notification nBuilder= new Notification.Builder(this)
            .setContentTitle("This task is due!")
            .setContentIntent(pIntent)
            .setSmallIcon(R.mipmap.ic_launcher)
            .build();
        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        nBuilder.flags |=Notification.FLAG_AUTO_CANCEL;

        notificationManager.notify(1,nBuilder);

      // If we get killed, after returning from here, restart
      return START_STICKY;
  }

Update your manifest and add this entry to it

<service android:name=".NotificationClass" />

Upvotes: 1

Radhey
Radhey

Reputation: 2229

you can do it in this way ,

1st > create one local broadcast receiver ,

  • inside onReceive() method , put your code stuff for generate notification ,that is your setNotification() method .

2nd > you just register that broadcast receiver inside onCreate() and unregister it inside onPause() or onDestory() method . like this ...

ReceiverActivity.java

 public void onCreate(Bundle savedInstanceState) {    
  ...    
  // Register your broadcast receiver here ...      
  // with actions named "custom-event-name"...
  LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
      new IntentFilter("custom-event-name"));
}

protected void onDestroy() {
  // Unregister your receiver
  LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
  super.onDestroy();
}
//here comes our receiver ...
// Our handler for received Intents. This will be called whenever an Intent
// with an action named "custom-event-name" is broadcasted.
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {

 //called setNotification() here ...
  }
};

Now let suppose you want to generate notification on click event of your button then fire intent like this,

  Intent intent = new Intent("custom-event-name");
  // You can also include some extra data.
  intent.putExtra("message", "Its me!!!!");
  LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 

your **setNotification()**should be like this ..

public void Notification(Context context, String message) {
        // Set Notification Title
        String strtitle = context.getString(R.string.notificationtitle);
        // Open NotificationView Class on Notification Click
        Intent intent = new Intent(context, NotificationView.class);
        // Send data to NotificationView Class
        intent.putExtra("title", strtitle);
        intent.putExtra("text", message);
        // Open NotificationView.java Activity
        PendingIntent pIntent = PendingIntent.getActivity(context, 0, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);

        // Create Notification using NotificationCompat.Builder
        NotificationCompat.Builder builder = new NotificationCompat.Builder(
                context)
                // Set Icon
                .setSmallIcon(R.drawable.logosmall)
                // Set Ticker Message
                .setTicker(message)
                // Set Title
                .setContentTitle(context.getString(R.string.notificationtitle))
                // Set Text
                .setContentText(message)
                // Add an Action Button below Notification
                .addAction(R.drawable.ic_launcher, "Action Button", pIntent)
                // Set PendingIntent into Notification
                .setContentIntent(pIntent)
                // Dismiss Notification
                .setAutoCancel(true);

        // Create Notification Manager
        NotificationManager notificationmanager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);
        // Build Notification with Notification Manager
        notificationmanager.notify(0, builder.build());

    }

Upvotes: 1

Related Questions