2010-05-13 3 views
2

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

Я должен указать 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)); 

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

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

Update: Afer рекомендации Й.:

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; 

ответ

3

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

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

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

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

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

0

Намерение cancelSyncIntent = новый Намерение(); 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); 
+0

Thanks J. Вы уверены, что это работает? Я пытаюсь, см. Выше, но все же, когда нажимаю на «Отмена», я получаю только showDashboardIntent. –

Смежные вопросы