2010-05-13 23 views
2

我想顯示一個通知,顯示正在進行的操作的進度。這對我來說很好。 但是同時遠程視圖應該包含取消按鈕來停止正在進行的操作。通常的內容意圖仍應該做其他事情,即不取消正在進行的操作。但似乎我只能有一個意圖。通知中的PendingIntents

我必須指定在 單擊通知時啓動一個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; 

回答

3

簡答:在通知視圖中不能單擊子視圖。

較長的答案...

我花了一天時間試圖讓這還有工作,並最終放棄了,看着Android的源。它看起來像在StatusBarService.java中的makeNotificationView()中發生的一切。在那裏,代碼爲通知下拉陰影中的每一行膨脹一個名爲「status_bar_latest_event」的佈局。它從該視圖抓取名爲「content」的視圖中的ViewGroup,在其上調用setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS),然後將通知視圖添加爲該視圖的子視圖。因此,假設我瞭解FOCUS_BLOCK_DESCENDANTS的工作原理,看起來您的視圖或其任何子項都沒有希望獲得焦點或點擊事件。

我也遵循了與您的通知關聯的主要PendingEvent如何工作的邏輯。承載您的Notification視圖的相同ViewGroup通過setOnClickListener()調用來註冊名爲「Launcher」的偵聽器類。當該類獲得onClick()事件時,它只需在與Notification關聯的PendingIntent上調用send()方法。我希望也許點擊的座標可能會傳遞,所以我至少可以嘗試計算哪個按鈕被點擊,但沒有這樣的運氣。

無論如何,如果有人知道解決這個問題的方法,我很樂意聽到它。現在,我只是把我的按鈕拉出來繼續前進。

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

謝謝J. 你確定它的方式嗎?我嘗試,見上面,但仍然在點擊「取消」時,我只能得到showDashboardIntent。 – 2010-05-14 16:00:18