2012-01-16 27 views
8

Tôi đã sử dụng cùng một pendingIntent để đặt nhiều báo thức bằng cách sử dụng intentId khác nhau cho mỗi báo thức. báo thức đang hoạt động. Bây giờ tôi muốn hủy bỏ một báo động cụ thể. Nếu tôi sử dụng phương thức cancel(), tôi sẽ hủy tất cả các báo động. Tôi chỉ muốn một người cụ thể bị xóa. Ngoài ra, người dùng sẽ có thể hủy báo thức này ngay cả trong lần khởi chạy thứ hai hoặc thứ ba. Như trong khi tôi khởi động nó lần thứ hai, tôi sẽ không có cùng một đối tượng pendingIntent. Tôi có phải tiếp tục tồn tại đối tượng pendingIntent không? Nếu vậy, làm thế nào? và làm cách nào để hủy một báo thức từ nhiều báo thức?Hủy báo thức đơn khi bạn có nhiều báo thức

+0

Tôi không biết phương thức nào để hủy báo thức đơn lẻ của một nhóm báo thức có cùng mục đích đang chờ xử lý. Nhưng bạn có thể đánh dấu thời gian báo thức cụ thể là bị hủy bằng cách sử dụng một số phương pháp kiên trì (tùy chọn chia sẻ, tệp, sqlite, ...) và trong mã được gọi thông qua ý định báo động đánh giá thông tin đã lưu để xác định xem báo thức đã đã hủy. Hoặc bạn có thể hủy tất cả các báo thức và đặt tất cả các báo thức nhưng sau đó (nếu bạn vẫn biết tất cả các lần). BTW, bạn không cần mục đích ban đầu đang chờ xử lý, bạn có thể tạo mục đích mới. – Stefan

Trả lời

8

Bạn có thể làm điều đó như thế này,

Trong Ý định chờ của bạn, bạn có thể vượt qua một unique ID ở vị trí của requestCode

PendingIntent pi = PendingIntent.getBroadcast(context, unique_id, i, 0); 

và hủy bạn có thể sử dụng cùng một ID duy nhất để hủy nó, sử dụng cùng một mục đích đang chờ xử lý.

am.cancel(pi); 

Để nhận được thêm thông tin bạn chỉ có thể sử dụng StackOverflow hoặc Google, cho bây giờ tôi nghĩ this answer sẽ làm cho bạn. :)

+0

Nếu bạn đặt unique_id thành thời gian báo thức bằng mili giây, bạn có thể đảm bảo rằng nó sẽ là duy nhất. Do đó bạn có thể dễ dàng hủy bỏ nó. Tôi đã xác minh tác phẩm này. Phương thức lịch là calendar.getTimeInMillis() – bschwagg

3

Đây là một loại hack để làm điều này với lời giải thích.

Trước hết, bạn nên tạo mục đích duy nhất cho mục đích đang chờ xử lý. Với mục đích này, bạn có thể tạo trường dữ liệu tùy chỉnh của mục đích cho ứng dụng của bạn. Tôi làm điều này theo cách sau:

Intent intent = new Intent(); 
intent.setAction(ExampleAppWidgetProvider.MY_INTENT_ACTION); 
Uri data = Uri.withAppendedPath(
       Uri.parse("myapp://myapp/Id/#"), 
       String.valueOf(intentId)); 
intent.setData(data); 

Trong trường hợp của bạn intentId sẽ là của bạn xác định duy nhất mục đích.

Sau đó, bạn tạo thông báo alarmManager như bình thường. Để hủy báo thức, bạn nên thực hiện các bước sau. Lúc đầu, bạn nên tạo một mục đích như trong mẫu mã trước đó. Sau đó, bạn tạo mục đích đang chờ xử lý dựa trên ý định này (bạn cũng tạo cùng một mục đích đang chờ xử lý cho báo thức). Và sau đó bạn hủy báo động này:

Intent intent = new Intent(); 
intent.setAction(ExampleAppWidgetProvider.MY_INTENT_ACTION); 
Uri data = Uri.withAppendedPath(
       Uri.parse("myapp://myapp/Id/#"), 
      String.valueOf(intentId)); 
intent.setData(data); 


PendingIntent pendingIntent = PendingIntent.getBroadcast(
       context, 0, intent, 
       PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
alarmManager.cancel(pendingIntent); 
Các vấn đề liên quan