2012-10-23 56 views
11

我想在用戶清除我的通知時重置我的服務的變量:就這些!如何使用刪除意圖對清除通知執行一些操作?

環顧我看到每個人都建議我通知添加刪除意圖,但意圖是用來啓動一個活動,服務Ø什麼,而我只需要像這樣的事情:

void onClearPressed(){ 
    aVariable = 0; 
} 

如何獲得這個結果?

回答

39

通知不是由您的應用管理的,所有顯示通知和清除它們的事情實際上都發生在另一個過程中。出於安全原因,您不能讓其他應用程序直接執行一段代碼。

您的情況的唯一可能性是提供一個PendingIntent,它僅包含一個常規的Intent,並在通知被清除時代表您的應用程序啓動。 您需要使用PendingIntent發送廣播或啓動服務,然後在廣播接收器或服務中按照自己的需要進行操作。究竟使用什麼取決於您顯示通知的應用程序組件。

在廣播接收器的情況下,您可以爲廣播接收器創建一個匿名內部類並在顯示通知之前動態註冊它。它會看起來像這樣:

public class NotificationHelper { 
    private static final String NOTIFICATION_DELETED_ACTION = "NOTIFICATION_DELETED"; 

    private final BroadcastReceiver receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      aVariable = 0; // Do what you want here 
      unregisterReceiver(this); 
     } 
    }; 

    public void showNotification(Context ctx, String text) { 
     Intent intent = new Intent(NOTIFICATION_DELETED_ACTION); 
     PendingIntent pendintIntent = PendingIntent.getBroadcast(ctx, 0, intent, 0); 
     registerReceiver(receiver, new IntentFilter(NOTIFICATION_DELETED_ACTION)); 
     Notification n = new Notification.Builder(mContext). 
      setContentText(text). 
      setDeleteIntent(pendintIntent). 
      build(); 
     NotificationManager.notify(0, n); 
    } 
} 
+1

我想這與intentService。獲取異常意圖接收者被泄露。 「你是否錯過了一個調用unregisterReceiver?」任何人都可以對此有所瞭解嗎? – Yasir

+3

註冊和取消註冊Receiver應該是來自一個未引用上下文的調用,因此在intentService中使用getApplicationContext()應該可以解決您的問題。 – smora

+1

我建議註冊靜態接收器(例如,在AndroidManifest中註冊),因爲應用程序可能在用戶解除通知時被殺死。靜態接收器確保代碼將被執行,即使應用程序已經死亡。 – pepyakin