Amrmsmb
Amrmsmb

Reputation: 1

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());
    }
}

Upvotes: 9

Views: 950

Answers (3)

Anukalp Katyal
Anukalp Katyal

Reputation: 101

You have to use RemoteViews#setOnClickPendingIntent() API:

I get your mistake you are trying to launch an activity with PendingIntent.getBroadcast() which only send a broadcast message, so ideally a broadcast receiver should be registered with the same intent filter action. In your case it should ideally be PendingIntent.getActivity

Now you can launch with the following pending intent the flag value was incorrect I can assume for everyone else, hence pending intent wasn't fired.

    Intent firstIntent = new Intent(context, FirstActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(appContext, 101, firstIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT); // For opening activity ideally this should work

If this doesn't work you can try sending a broadcast and listen for it to verify that broadcast is also sent or not:-

PendingIntent pendingIntent = PendingIntent.getBroadcast(appContext, 0, firstIntent, PendingIntent.FLAG_ONE_SHOT); // for sending broadcast and listens in broadcast reciever

Upvotes: 1

dilix
dilix

Reputation: 3893

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());

Upvotes: 3

azizbekian
azizbekian

Reputation: 62189

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);

Upvotes: 2

Related Questions