2010-09-09 67 views
10

Tôi có một ứng dụng nhắc nhở mọi người thực hiện các tác vụ của họ. Vì vậy, có một PendingIntent, bây giờ người dùng có thể xóa báo động khi anh ta muốn. Trong mã này, chỉ có một PendingIntent cho nhiều báo động của người dùng vì vậy tôi bối rối khi hủy bỏ báo động cụ thể mà mục đích bổ sung là "pill". Các báo thức còn lại sẽ không bị hủy bỏ. Tôi không có đầu mối về vấn đề này. Hy vọng tôi rõ ràng. Cảm ơnSự cố khi hủy Trình quản lý cảnh báo - Đang chờ xử lý

Intent intent = new Intent(this, AlarmNotifyReceiver.class); 
intent.putExtra("Name_pill", "pill"); 
sender = PendingIntent.getBroadcast(this, 
DatabaseConstants.NOTIFICATION_ID + 1, intent, 
PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), sender); 
updateTheFlag(pillName[(pillName.length-1)]); 
+2

Tôi cũng đang tìm câu trả lời tương tự cho câu hỏi này. Tôi đang làm một cái gì đó rất giống với bạn, nhưng tôi không thể làm cho nó hoạt động được. Sự hiểu biết của tôi ngay bây giờ là bạn cần phải sử dụng am.cancel (pendingIntent) có nghĩa là bạn sẽ cần phải khởi tạo một pendingIntent giống hệt với cái bạn đã tạo ở đây. Tuy nhiên, điều đó dường như không làm việc cho tôi. Bất cứ ai có thể trả lời câu hỏi này chắc chắn sẽ nhận được một lời khen ngợi từ tôi :) –

Trả lời

5

Như tôi đã nêu trong nhận xét của mình, có vẻ như bạn chỉ cần tạo lại chính xác đối tượng PendingIntent và đặt cùng một mục vào đó. Sau đó, bạn gọi

am.cancel(sender); 

Và báo thức cụ thể của bạn sẽ bị hủy. Tôi không thể tìm ra cách tốt hơn để làm điều đó, cá nhân. Tôi tìm thấy thông tin này để xác nhận kỳ vọng của tôi elsewhere.

Nó đọc:

báo động lặp lại có được hủy bỏ để ngăn chặn chúng. AlarmManager cung cấp phương thức cancel() yêu cầu cùng một lớp intent với mục đích được tạo ra. Đây là cách bạn có thể hủy báo thức.

báo thứcManager.cancel (pendingIntent);

Lưu ý đối tượng pendingIntent không cần phải là cùng một đối tượng. Các trường có mục đích như hành động, lớp, danh mục, v.v. phải giống nhau trong khi tạo báo thức. Mục đích được sử dụng để xác định báo thức để hủy bỏ nó.

Đó là trong bối cảnh lặp lại báo thức, nhưng báo thức một lần sẽ bị hủy theo cách tương tự, nếu tôi không nhầm. Tôi không thể tự kiểm tra kỹ hơn vì tôi đang làm việc, nhưng điều này sẽ hiệu quả.

+2

theo tài liệu của Android, để dừng báo thức, bạn nên tạo một 'Intent' với cùng dữ liệu, nhưng KHÔNG nhất thiết phải là cùng một tính năng bổ sung: public void hủy bỏ (hoạt động PendingIntent) Xóa mọi báo thức bằng Mục đích phù hợp. Bất kỳ cảnh báo nào, thuộc bất kỳ loại nào, có Intent khớp với báo thức này (theo định nghĩa của filterEquals (Intent)), sẽ bị hủy. – noloman

10

Theo tài liệu Android, để ngăn chặn một báo thức, bạn nên tạo một Intent với cùng một dữ liệu, nhưng không nhất thiết phải là tính năng bổ sung như nhau:

public void hủy (PendingIntent hoạt động)

Xóa mọi báo thức bằng Mục đích phù hợp. Bất kỳ cảnh báo nào, thuộc bất kỳ loại nào có Mục đích khớp với> loại này (được xác định bởi filterEquals (Intent)), sẽ bị hủy.

filterEquals(Intent)

filterEquals public boolean (Ý định khác)

Xác định nếu hai ý đồ đều giống nhau cho các mục đích giải quyết ý định (lọc). > Đó là, nếu hành động, dữ liệu, loại, lớp và danh mục của họ giống nhau. Điều này không so sánh bất kỳ dữ liệu bổ sung nào có trong mục đích.

+0

Vì vậy, nếu bạn có 2 'PendingIntent', được tạo ra tại các thời điểm khác nhau mà làm điều tương tự, những gì nên được sử dụng để phân biệt chúng? – Michael

1

Tôi nghĩ rằng requestCode tham số trong getBroadcast() cần phải được đề cập. Tôi đồng ý rằng tất cả các báo thức sẽ bị hủy khớp với Mục đích đã cho.Nhưng có thể tạo báo thức thành duy nhất bằng cách sử dụng mã yêu cầu duy nhất khi xác định PendingIntent để hủy. Vì vậy, chỉ có những báo động sẽ bị hủy bỏ trong đó có cùng ý địnhrequestCode:

int TIMER_1 = 1; 
int TIMER_2 = 2; 
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); 
Intent i = new Intent(this, AppReciever.class); 
i.putExtra("timer", "one"); 
PendingIntent pending = PendingIntent.getBroadcast(this, TIMER_1, i, 
      PendingIntent.FLAG_CANCEL_CURRENT); 
Calendar cal = Calendar.getInstance(); 
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pending); 

sau đó kiểm tra xem PendingIntent tồn tại theo this:

PendingIntent pending1 = PendingIntent.getBroadcast(this, TIMER_2, i, 
       PendingIntent.FLAG_NO_CREATE); 
boolean alarmUp = (pending1 != null); 

alarmUp sẽ sai (lưu ý FLAG_NO_CREATE được sử dụng để không tạo mới nếu không tồn tại) vì vậy hãy thử với cùng một số requestCode:

PendingIntent pending2 = PendingIntent.getBroadcast(this, TIMER_1, i, 
       PendingIntent.FLAG_NO_CREATE); 
alarmUp = (pending2 != null); 

alarmUp sẽ đúng, bây giờ cố gắng với một ý định mới chứa thêm khác nhau:

Intent i2 = new Intent(this, AppReciever.class); 
i2.putExtra("timer", "two"); 
pending2 = PendingIntent.getBroadcast(this, TIMER_1, i2, 
       PendingIntent.FLAG_NO_CREATE); 
alarmUp = (pending2 != null); 

alarmUp sẽ đúng cũng kể từ khi ii2 đều giống nhau mặc dù thêm hiện tại, bạn không thể xóa báo thức này:

am.cancel(pending2); 
0

Vì vậy, có một mục đích đang chờ xử lý, giờ đây người dùng có thể xóa alram khi anh ta muốn. Ib mã này chỉ có một cấp phát ý định cho nhiều cảnh báo người sử dụng vì vậy tôi đang nhầm lẫn về hủy mà đặc biệt báo động nơi extras là thuốc

intent.putExtra("Name_pill", "pill"); 

Các phụ wont work sẽ không hủy bỏ ý định cấp phát của bạn.

pendingIntent.cancel() sẽ chỉ xóa mục đích đang chờ xử lý được kích hoạt với cùng một phương thức filterEquals(Intent) và phương pháp đó không so sánh bất kỳ dữ liệu bổ sung nào được cung cấp cho mục đích.

đây là chứa từ trang web của nhà phát triển của Android filterEquals(Intent)

Xác định nếu hai ý đồ đều giống nhau cho các mục đích về ý định độ phân giải (lọc). Nghĩa là, nếu hành động, dữ liệu, loại, lớp học, và các danh mục giống nhau. Điều này không so sánh bất kỳ dữ liệu bổ sung nào được bao gồm trong mục đích.

nếu chúng ta xem xét kịch bản của bạn, khi bạn sẽ vượt qua mà Extra để ý lúc đó bạn chỉ cần lưu ID duy nhất trong một số sharedpreference mà đưa ra trong tham số và có một điều bạn nên lưu ý rằng ID phải là duy nhất.

và và khi bạn giả sử hủy báo thức đó, chỉ cần chuyển cùng một ý định với ID đã lưu đó và hủy pendingintent đó.

Tạo

preference_saved_value = DatabaseConstants.NOTIFICATION_ID + 1 
sender = PendingIntent.getBroadcast(this, 
preference_saved_value, intent, 
PendingIntent.FLAG_UPDATE_CURRENT) 

CANCEL

sender = PendingIntent.getBroadcast(this, 
preference_saved_value, intent,PendingIntent.FLAG_UPDATE_CURRENT); 
sender.cancel() 
0

Như nó được nêu trong tài liệu hướng dẫn android cấp phát intents với mục đích đó là tương đương theo Intent.filterEquals nhưng có yêu cầu khác nhau mã được xem là khác nhau:

Nếu bạn thực sự cần các đối tượng nhiều PendingIntent biệt hoạt động tại cùng một lúc (ví dụ như để sử dụng như hai thông báo rằng cả hai đều thể hiện cùng một lúc), sau đó bạn sẽ cần phải đảm bảo có cái gì đó rằng khác nhau về chúng để liên kết chúng với PendingIntents khác nhau. Đây có thể là bất kỳ thuộc tính Intent nào được xem xét bởi Intent.filterEquals hoặc các số nguyên mã yêu cầu khác nhau được cung cấp cho getActivity (Ngữ cảnh, int, Intent, int), getActivities (Ngữ cảnh, int, Intent [], int), getBroadcast (Ngữ cảnh, int, Intent, int) hoặc getService (Ngữ cảnh, int, Intent, int).

Vì vậy, bạn có thể chỉ định mã yêu cầu khác nhau và hủy bỏ cơ sở ý định đang chờ xử lý trên chúng và quên đi phần bổ sung.

Có một kịch bản thú vị mà tôi đã tìm ra hành vi này:

tôi dự kiến ​​một cảnh báo trong mã của tôi và chạy nó trên thiết bị nhưng không bao giờ bị hủy bỏ nó. Sau đó, tôi đã thay đổi mã yêu cầu và chạy lại nó. Vì vậy, một báo động mới đã được tạo ra. Tôi đã hủy báo thức mới nhưng báo thức vẫn đang thực thi từ mã trước đó. Tôi bối rối vì sao báo động không bị hủy bỏ. Sau khi tôi phát hiện ra nó từ mã trước đó với mã yêu cầu khác nhau, tôi đã gỡ cài đặt ứng dụng và cài đặt lại và sự cố đã được giải quyết.

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