2012-10-23 25 views
11

Tôi muốn đặt lại biến dịch vụ của mình khi người dùng xóa thông báo của tôi: đó là tất cả!cách sử dụng mục đích xóa để thực hiện một số hành động trên thông báo rõ ràng?

Nhìn quanh tôi thấy rằng tất cả mọi người đề nghị thêm một ý định xóa trên thông báo của tôi, nhưng ý định được sử dụng để bắt đầu một hoạt động, một o dịch vụ bất cứ điều gì trong khi tôi chỉ cần một điều như thế này:

void onClearPressed(){ 
    aVariable = 0; 
} 

cách để có được kết quả này?

Trả lời

39

Thông báo không được ứng dụng của bạn quản lý và tất cả những thứ như hiển thị thông báo và xóa chúng đều thực sự xảy ra trong một quy trình khác. Bạn không thể làm cho ứng dụng khác trực tiếp thực thi một đoạn mã chỉ vì lý do bảo mật.

Khả năng duy nhất trong trường hợp của bạn là cung cấp PendingIntent, chỉ cần bao quanh một Mục đích thông thường và sẽ được bắt đầu thay mặt cho ứng dụng của bạn khi thông báo bị xóa. Bạn cần sử dụng PendingIntent để gửi phát hoặc bắt đầu một dịch vụ và sau đó thực hiện những gì bạn muốn trong bộ thu sóng hoặc trong dịch vụ. Những gì chính xác để sử dụng phụ thuộc vào từ thành phần ứng dụng bạn đang hiển thị thông báo.

Trong trường hợp bộ thu phát, bạn chỉ có thể tạo lớp bên trong ẩn danh cho bộ thu phát sóng và đăng ký nó động trước khi hiển thị thông báo. Nó sẽ trông giống như thế:

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

Tôi đang thử điều này với intentService. Nhận được một người nhận ý định ngoại lệ bị rò rỉ. "Bạn có bỏ lỡ cuộc gọi đến unregisterReceiver không?" Bất cứ ai có thể ném bất kỳ ánh sáng vào nó? – Yasir

+3

Đăng ký và hủy đăng ký Người nhận phải gọi từ ngữ cảnh không được chú ý, do đó, sử dụng getApplicationContext() trong intentService của bạn sẽ giải quyết vấn đề của bạn. – smora

+1

Tôi khuyên bạn nên đăng ký bộ thu tĩnh (ví dụ: được đăng ký trong AndroidManifest), vì ứng dụng có thể bị hủy vào thời điểm người dùng loại bỏ thông báo. Bộ thu tĩnh đảm bảo rằng mã sẽ được thực thi ngay cả khi ứng dụng đã chết. – pepyakin

Các vấn đề liên quan