Событие OnClick для кнопки в пользовательском уведомлении - PullRequest
27 голосов
/ 30 марта 2011

У меня есть пользовательское уведомление с кнопкой. Чтобы установить уведомление и использовать событие OnClick на моей кнопке, я использовал этот код:

//Notification and intent of the notification 
Notification notification = new Notification(R.drawable.stat_notify_missed_call,
            "Custom Notification", System.currentTimeMillis());

Intent mainIntent = new Intent(getBaseContext(), NotificationActivity.class);
PendingIntent pendingMainIntent = PendingIntent.getActivity(getBaseContext(),
    0, mainIntent , 0);
notification.contentIntent = pendingMainIntent;

//Remoteview and intent for my button
RemoteViews notificationView = new RemoteViews(getBaseContext().getPackageName(),
    R.layout.remote_view_layout);

Intent activityIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:190"));
PendingIntent pendingLaunchIntent = PendingIntent.getActivity(getBaseContext(), 0,
            activityIntent, PendingIntent.FLAG_UPDATE_CURRENT);

notificationView.setOnClickPendingIntent(R.id.button1,
    pendingLaunchIntent);

notification.contentView = notificationView;

notificationManager.notify(CUSTOM_NOTIFICATION_ID, notification);

С этим кодом у меня есть пользовательское уведомление с моим пользовательским макетом ... но я не могу нажать кнопку! каждый раз, когда я пытаюсь нажать на кнопку, я щелкаю все уведомление, поэтому скрипт запускает «mainIntent» вместо «activityIntent».

Я прочитал в интернете, что этот код работает не на всех терминалах. Я пробовал это на эмуляторе и на HTC Magic, но у меня всегда одна и та же проблема: я не могу нажать кнопку!

Мой код правильный? кто-нибудь может мне помочь?

Спасибо

Simone

Ответы [ 5 ]

18 голосов
/ 21 октября 2014

Я пишу код в моем MyActivity.java классе, который расширяется android.app.Activity

Создает пользовательское уведомление, когда пользователь нажимает на кнопку, он отправляет broadcast. Есть широковещательный приемник, который получает broadcast.

private void createDownloadNotification() {
        Intent closeButton = new Intent("Download_Cancelled");
        closeButton.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

        PendingIntent pendingSwitchIntent = PendingIntent.getBroadcast(this, 0, closeButton, 0);

        RemoteViews notificationView = new RemoteViews(getPackageName(), R.layout.widget_update_notification);

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

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this).setSmallIcon(R.drawable.ic_launcher).setTicker("Ticker Text").setContent(notificationView);
        notificationView.setProgressBar(R.id.pb_progress, 100, 12, false);
        notificationView.setOnClickPendingIntent(R.id.btn_close, pendingSwitchIntent);

        notificationManager.notify(1, builder.build());

    }


public static class DownloadCancelReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {

            System.out.println("Received Cancelled Event");
        }
    }

Зарегистрировать получателя в AndroidManifest.xml

<receiver android:name=".MainActivity$DownloadCancelReceiver" android:exported="false">
            <intent-filter>
                <action android:name="Download_Cancelled" />
            </intent-filter>
        </receiver>

Поскольку это внутренний класс, поэтому необходимо использовать $ знак

Виджет xml здесь

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:orientation="horizontal" >

    <Button
        android:id="@+id/btn_close"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Close Me" />

    <ProgressBar
        android:id="@+id/pb_progress"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>
7 голосов
/ 24 июля 2013

проверьте это

  1. Создайте файл макета XML для вашего уведомления.

  2. Создайте уведомление с помощью Notification.Builder.После добавления всего, что вы хотите (иконки, звуки и т. Д.), Сделайте следующее:

    //R.layout.notification_layout is from step 1
    
    RemoteViews contentView=new RemoteViews(ctx.getPackageName(), R.layout.notification_layout);
    
    setListeners(contentView);//look at step 3
    
    notification.contentView = contentView;
    
  3. Создайте метод setListeners.Внутри этого метода вы должны написать это:

    //HelperActivity will be shown at step 4
    
    Intent radio=new Intent(ctx, packagename.youractivity.class);  
    radio.putExtra("AN_ACTION", "do");//if necessary
    
    PendingIntent pRadio = PendingIntent.getActivity(ctx, 0, radio, 0);
    //R.id.radio is a button from the layout which is created at step 2                  view.setOnClickPendingIntent(R.id.radio, pRadio); 
    
    //Follows exactly my code!
    Intent volume=new Intent(ctx, tsapalos11598712.bill3050.shortcuts.helper.HelperActivity.class);
    volume.putExtra("DO", "volume");
    
    //HERE is the whole trick. Look at pVolume. I used 1 instead of 0.
    PendingIntent pVolume = PendingIntent.getActivity(ctx, 1, volume, 0);
    view.setOnClickPendingIntent(R.id.volume, pVolume);
    
  4. Для своих требований я использовал HelperActivity, которое отвечает намерениям.Но для вас я не думаю, что это необходимо.

Если вам нужен полный исходный код, вы можете просмотреть его или загрузить из моего репозитория git.Код предназначен для личного использования, поэтому не ждите, чтобы прочитать великолепный код с большим количеством комментариев.https://github.com/BILLyTheLiTTle/AndroidProject_Shortcuts

ВСЕ, ВЫШЕ ВЫШЕ, ОТВЕТИТ НА ВОПРОС ПО УБОРУ СОБЫТИЙ ИЗ РАЗНЫХ КНОПКИ.

Об отмене уведомления Я перенаправляю вас сюда ( Как очистить уведомление в Android ).Просто не забудьте использовать идентификатор, который вы проанализировали в методе уведомления, когда вызывали уведомление в первый раз

3 голосов
/ 15 июля 2013

похоже, что setOnClickPendingIntent не работает при использовании внутри коллекций.

Итак, попробуйте setPendingIntentTemplate вместо setOnClickPendingIntent . Для получения дополнительной информации ниже ссылка разработчика Android ...

Нажмите здесь для получения более подробной информации - Перейти на сайт разработчика Android.

0 голосов
/ 18 января 2018

Вам необходимо создать службу для обнаружения события Click: например, создать NotificationIntentService.class и указать код:

public class NotificationIntentService extends IntentService {

    /**
     * Creates an IntentService.  Invoked by your subclass's constructor.
     */
    public NotificationIntentService() {
        super("notificationIntentService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        switch (intent.getAction()) {
            case "left":
                android.os.Handler leftHandler = new android.os.Handler(Looper.getMainLooper());
                leftHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getBaseContext(),
                                "You clicked the left button", Toast.LENGTH_LONG).show();
                    }
                });
                break;
            case "right":
                android.os.Handler rightHandler = new android.os.Handler(Looper.getMainLooper());
                rightHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getBaseContext(), "You clicked the right button", Toast.LENGTH_LONG).show();
                    }
                });
                break;
        }
    }
}

Добавьте этот метод к вашей деятельности:

private void sendNotification() {

    RemoteViews expandedView = new RemoteViews(getPackageName(), R.layout.view_expanded_notification);
    expandedView.setTextViewText(R.id.timestamp, DateUtils.formatDateTime(this, System.currentTimeMillis(), DateUtils.FORMAT_SHOW_TIME));
    expandedView.setTextViewText(R.id.notification_message, mEditText.getText());
    // adding action to left button
    Intent leftIntent = new Intent(this, NotificationIntentService.class);
    leftIntent.setAction("left");
    expandedView.setOnClickPendingIntent(R.id.left_button, PendingIntent.getService(this, 0, leftIntent, PendingIntent.FLAG_UPDATE_CURRENT));
    // adding action to right button
    Intent rightIntent = new Intent(this, NotificationIntentService.class);
    rightIntent.setAction("right");
    expandedView.setOnClickPendingIntent(R.id.right_button, PendingIntent.getService(this, 1, rightIntent, PendingIntent.FLAG_UPDATE_CURRENT));

    RemoteViews collapsedView = new RemoteViews(getPackageName(), R.layout.view_collapsed_notification);
    collapsedView.setTextViewText(R.id.timestamp, DateUtils.formatDateTime(this, System.currentTimeMillis(), DateUtils.FORMAT_SHOW_TIME));

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
            // these are the three things a NotificationCompat.Builder object requires at a minimum
            .setSmallIcon(R.drawable.ic_pawprint)
            .setContentTitle(NOTIFICATION_TITLE)
            .setContentText(CONTENT_TEXT)
            // notification will be dismissed when tapped
            .setAutoCancel(true)
            // tapping notification will open MainActivity
            .setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0))
            // setting the custom collapsed and expanded views
            .setCustomContentView(collapsedView)
            .setCustomBigContentView(expandedView)
            // setting style to DecoratedCustomViewStyle() is necessary for custom views to display
            .setStyle(new android.support.v7.app.NotificationCompat.DecoratedCustomViewStyle());

    // retrieves android.app.NotificationManager
    NotificationManager notificationManager = (android.app.NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    notificationManager.notify(0, builder.build());
}
0 голосов
/ 31 марта 2011

похоже, что setOnClickPendingIntent не работает при использовании внутри коллекций:

http://developer.android.com/reference/android/widget/RemoteViews.html#setOnClickPendingIntent(int,%20android.app.PendingIntent)

Попробуйте вместо этого использовать setPendingIntentTemplate.

...