Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to reference a view in a customized notification

In the below posted code i am create a notification with a customized layout. the layout of the notification contains three action buttons.

the problem i have now is, i can not reference any of the buttons in the code so that I can navigate to another activity based on the action button clicked.what i am trying to do is when Action button 1 is clicked then Activity 1 shows up, when Action button 2 is clicked then Activity 2 shows up and so on.

Please let me know how to reference the views in customized layout of the notification?

code:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Using RemoteViews to bind custom layouts into Notification
        RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.layout_notification);
        String notification_title = "Notification_Title";
        String notification_text = "Notification_Text";

        // Open NotificationView Class on Notification Click
        Intent intent = new Intent(this, NotificationReply.class);
        // Send data to NotificationView Class
        intent.putExtra("title", notification_title);
        intent.putExtra("text", notification_text);
        // Open NotificationView.java Activity
        PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
                // Set Icon
                .setSmallIcon(R.mipmap.ic_launcher)
                // Set Ticker Message
                .setTicker("Ticker")
                // Dismiss Notification
                .setAutoCancel(true)
                // Set PendingIntent into Notification
                .setContentIntent(pIntent)
                // Set RemoteViews into Notification
                .setContent(remoteViews);

        Intent intentAction1 = new Intent(this, ActAction1.class);
        PendingIntent pendingIntentActAction1 = PendingIntent.getBroadcast(this, 1,intentAction1, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.btn_action1, pendingIntentActAction1);

        Intent intentAction2 = new Intent(this, ActAction2.class);
        PendingIntent pendingIntentActAction2 = PendingIntent.getBroadcast(this, 2,intentAction2, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.btn_action2, pendingIntentActAction2);

        Intent intentAction3 = new Intent(this, ActAction3.class);
        PendingIntent pendingIntentActAction3 = PendingIntent.getBroadcast(this, 3,intentAction3, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setPendingIntentTemplate(R.id.btn_action3, pendingIntentActAction3);

        // Create Notification Manager
        NotificationManager notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        // Build Notification with Notification Manager
        notificationmanager.notify(0, builder.build());
    }
}
like image 385
user2121 Avatar asked Jul 22 '17 12:07

user2121


People also ask

How do I add a photo to a notification on android?

To add an image in your notification, pass an instance of NotificationCompat. BigPictureStyle to setStyle() .

How do I manage multiple notifications on Android?

Set the unique id to let Notification Manager knows this is a another notification instead of same notification. If you use the same unique Id for each notification, the Notification Manager will assume that is same notification and would replace the previous notification.


2 Answers

The key success for navigation is to use proper pending intent and use different values for your requestCode.

You could receive the event in broadcastReceiver building the pending intent (e,g, with params) that way:

private PendingIntent buildPendingIntent(String someurl) {
        Intent intent= new Intent(mContext, SomeReceiver.class);
        final Uri uri = Uri.parse(someurl);
        intent.setData(uri);
        intent.setAction(Intent.ACTION_VIEW);
        intent.putExtra(KEY, VALUE)

        return PendingIntent.getBroadcast(mContext.getApplicationContext(),
                CONSTANT_FOR_THIS_INTENT_TYPE, intent,
                PendingIntent.FLAG_CANCEL_CURRENT);
    }

Or you could navigate to activity just by pending intent:

private PendingIntent buildPendingIntent2() {
        Intent intent = new Intent(mContext, SomeActivity.class);
        intent.putExtra(KEY, VALUE);
        settingsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        return PendingIntent.getActivity(mContext.getApplicationContext(),
                                         OTHER_CONSTANT_FOR_OTHER_ACTION,
                                         intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }

Please notice that CONSTANT_FOR_THIS_INTENT_TYPE and OTHER_CONSTANT_FOR_OTHER_ACTION must have different values

And after you have this pending intents you should attach them to your views:

view.setOnClickPendingIntent(com.app.btn1, buildPendingIntent1());
view.setOnClickPendingIntent(com.app.btn2, buildPendingIntent2());
like image 180
dilix Avatar answered Sep 20 '22 12:09

dilix


You have to use RemoteViews#setOnClickPendingIntent() API:

Equivalent to calling setOnClickListener(android.view.View.OnClickListener) to launch the provided PendingIntent.


    Intent firstIntent = new Intent(context, FirstActivity.class);
    PendingIntent firstPendingIntent = PendingIntent.getBroadcast(this, 0, firstIntent, 0);

    RemoteViews notificationView = ...
    notificationView.setOnClickPendingIntent(R.id.first_button, firstPendingIntent);

like image 37
azizbekian Avatar answered Sep 20 '22 12:09

azizbekian