PendingIntents в уведомлениях - PullRequest
2 голосов
/ 13 мая 2010

Я хотел бы показать уведомление, которое отображает прогресс текущая операция. Это хорошо работает для меня. Но в то же время удаленный просмотр должен содержать кнопку отмены, чтобы остановить текущую операцию. Обычный контент намерения все еще должен делать что-то еще, то есть не отменять текущую операцию. Кажется, что у меня может быть только одно намерение.

Я должен указать contentIntent, который запускается при нажатии на уведомление: если я не укажу, что я получаю что-то линии:

E/ActivityManager(   62): Activity Manager Crash
E/ActivityManager(   62): java.lang.IllegalArgumentException: contentIntent required ...

Для кнопки «Отмена» я установил другое намерение:

Intent cancelSyncIntent = new Intent("com.xyz.CANCEL_SYNC");
contentView.setOnClickPendingIntent(R.id.cancel_sync,
                                    PendingIntent.getBroadcast(context, 0,
                                    cancelSyncIntent, 0));

Но это никогда не работает. Я всегда получаю контент, когда кнопка нажата. Похоже, я не могу использовать кнопки в удаленных видах уведомления?!

Возможно, я мог бы отобразить текст: «<< Нажмите, чтобы отменить операцию >>», но это выглядит довольно тяжело.

Обновление: рекомендации Afer J.:

    final Notification n = new Notification(R.drawable.gen_auto_notification_icon, context.getResources()
            .getString(
                    fastSyncOnly ? R.string.fast_synchronization_running_notification_title
                            : R.string.synchronization_running_notification_title), new Date().getTime());

    n.flags = Notification.FLAG_ONGOING_EVENT;

    final RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.in_progress_notification);
    n.contentView = contentView;

    // Intent cancelSyncIntent = new Intent("com.newsrob.CANCEL_SYNC");
    Intent cancelSyncIntent = new Intent();
    cancelSyncIntent.setClass(context, FireReceiver.class);
    PendingIntent pendingCancelSyncIntent = PendingIntent.getActivity(context, 0, cancelSyncIntent, 0);
    contentView.setOnClickPendingIntent(R.id.cancel_sync, pendingCancelSyncIntent);

    Intent showDashboardIntent = new Intent(context, DashboardListActivity.class);
    PendingIntent showDashboardPendingIntent = PendingIntent.getActivity(context, 0, showDashboardIntent, 0);
    n.contentIntent = showDashboardPendingIntent;

Ответы [ 2 ]

3 голосов
/ 22 октября 2010

Краткий ответ: Вы не можете иметь интерактивные дочерние представления в представлении уведомлений.

Более длинный ответ ...

Я потратил день, пытаясь заставить это работать, и в конце концов сдался и посмотрел на источник Android. Похоже, что все происходит в makeNotificationView () в StatusBarService.java. Там код раздувает макет с именем «status_bar_latest_event» для каждой строки в ниспадающем оттенке уведомления. Он извлекает ViewGroup из этого представления, которое он только что накачал, с именем «content», вызывает для него setDescendantFocusability (ViewGroup.FOCUS_BLOCK_DESCENDANTS), а затем добавляет представление уведомлений как дочерний элемент этого. Итак, если я понимаю, как работает FOCUS_BLOCK_DESCENDANTS, то, похоже, нет никакой надежды на то, что ваше мнение или кто-либо из его детей получит фокус или клик.

Я также следовал логике того, как работает основное PendingEvent, которое вы связываете с вашим Уведомлением. Та же ViewGroup, в которой размещено ваше представление Notification, получает вызов setOnClickListener () для регистрации класса слушателя с именем «Launcher». Когда этот класс получает событие onClick (), он просто вызывает метод send () объекта PendingIntent, связанного с уведомлением. Я надеялся, что, возможно, координата щелчка будет передана, чтобы я мог, по крайней мере, попытаться вычислить, какая кнопка была нажата, но такой удачи не произошло.

Во всяком случае, если кто-нибудь знает способ обойти это, я бы хотел услышать это. Сейчас я просто вытаскиваю свои кнопки и продолжаю.

0 голосов
/ 14 мая 2010

Intent cancelSyncIntent = new Intent (); cancelSyncIntent .setClassName ("com.xyz", "com.xyz.CANCEL_SYNC");

PendingIntent pendingIntent = PendingIntent.getActivity(context,
    0 /* no requestCode */, cancelSyncIntent , 0 /* no flags */);
contentView.setOnClickPendingIntent(R.id.cancel_sync, pendingIntent);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...