2015-04-08 14 views
14

Tài liệu cho PendingIntent.FLAG_NO_CREATE đọc:Làm thế nào để so sánh android cấp phát intents

Cờ chỉ ra rằng nếu PendingIntent mô tả không tồn tại, sau đó chỉ cần trả về null thay vì tạo ra nó.

Câu hỏi của tôi: Tiêu chí nào được sử dụng để so sánh PendingIntents?

Tôi đoán dưới mui xe lá cờ này sử dụng PendingIntent.equals, nhưng tôi không thực sự chắc chắn tiêu chí mà chức năng đang sử dụng. Là nó sử dụng hành động, requestCode, loại, extras (tôi đoán không), vv?

Bối cảnh:

Tôi muốn bắt đầu báo thức với mục đích đang chờ xử lý nếu báo thức của tôi chưa được thiết lập. Cụ thể, tôi đang theo dõi điều này answer.

Intent i = new Intent(applicationContext, MyService.class); 
i.setAction("myAction"); 
PendingIntent pi = PendingIntent.getService(applicationContext, /*requestCode*/0, i, PendingIntent.FLAG_NO_CREATE); 
if (pi != null) { 
    AlarmManager alarmMgr = (AlarmManager)applicationContext.getSystemService(Context.AlarmService); 
    alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, AlarmManager.INTERVAL_HOUR, AlarmManager.INTERVAL_HOUR, pi); 
} 
+4

Câu hỏi hay. Tôi biết điều này là không đúng. Nhưng, tôi đã sử dụng để hủy báo thức trước đó và khởi động lại nó khi tôi nghĩ rằng nó là cần thiết .. Tôi mong chờ câu trả lời của câu hỏi này. –

+0

Tôi đoán chỉ mã requestCode của nó. Bạn không thể truy cập nguồn để kiểm tra? Android Studio thường hiển thị nó. – Stan

Trả lời

18

Để xác định xem 2 PendingIntent s trận đấu, sau đây phải bằng:

  • Các requestCode tham số sử dụng khi PendingIntent đã được tạo ra
  • Các Intent HÀNH ĐỘNG
  • Intent DANH MỤC
  • Các Intent DỮ LIỆU
  • Các Intent MIMETYPE
  • Các Intent GÓI
  • Các Intent COMPONENT

Extras không được xem xét.

Bạn có thể đọc thêm trong số PendingIntent summary documentationIntent.filterEquals().

+2

Tôi đang tìm kiếm ** Phần bổ sung **, vì vậy cảm ơn! –

2

Tôi đoán dưới mui xe cờ này sử dụng PendingIntent.equals, nhưng Tôi không thực sự chắc chắn những gì tiêu chí mà chức năng đang sử dụng. Có phải nó đang sử dụng hành động, mã yêu cầu, danh mục, tính năng bổ sung (tôi đoán không), v.v.?

Thực ra gợi ý là trong mô tả lớp:

Một mô tả của một hành động Ý định và mục tiêu để thực hiện với nó. Thể hiện của lớp này được tạo ra với

getActivity (android.content.Context, int, android.content.Intent, int), getActivities (android.content.Context, int, android.content.Intent [], int), getBroadcast (android.content.Context, int, android.content.Intent, int), getService (android.content.Context, int, android.content.Intent, int);

đối tượng trả lại có thể được giao cho các ứng dụng khác để chúng có thể thực hiện hành động mà bạn đã mô tả thay cho bạn sau này.

Bằng cách cấp PendingIntent cho ứng dụng khác, bạn đang cấp cho nó quyền thực hiện thao tác bạn đã chỉ định như thể ứng dụng khác của bạn (với cùng quyền và nhận dạng). Vì vậy, bạn nên cẩn thận về cách bạn tạo PendingIntent: hầu như luôn luôn, như Intent mà bạn cung cấp phải có tên thành phần được đặt rõ ràng thành một trong các thành phần của riêng bạn, để đảm bảo và không nơi nào khác.

Bản thân PendingIntent chỉ đơn giản là tham chiếu đến mã thông báo được duy trì bởi hệ thống mô tả dữ liệu gốc được sử dụng để truy xuất nó. Điều này có nghĩa là, ngay cả khi quá trình sở hữu của ứng dụng bị giết, bản thân PendingIntent sẽ vẫn có thể sử dụng được từ các quy trình khác đã được cung cấp.Nếu ứng dụng tạo sau này sẽ khôi phục cùng loại PendingIntent (cùng một thao tác, cùng một hành động, dữ liệu, danh mục và thành phần, và cùng cờ), nó sẽ nhận được một PendingIntent đại diện cho cùng một mã thông báo nếu đó vẫn là hợp lệ, và do đó có thể gọi cancel() để xóa nó.

Do hành vi này, điều quan trọng là phải biết khi nào hai Mục đích là được coi là giống nhau cho các mục đích truy xuất PendingIntent. Một sai lầm phổ biến mà mọi người tạo ra là tạo ra nhiều đối tượng PendingIntent PendingIntent có Intent chỉ thay đổi trong nội dung "phụ" của họ, mong đợi nhận được một PendingIntent khác nhau mỗi lần. Điều này không xảy ra với sự kiện . Các phần của Intent được sử dụng để đối sánh là cùng một phần được xác định bởi Intent.filterEquals. Nếu bạn sử dụng hai Intent các đối tượng tương đương với mỗi Intent.filterEquals, thì bạn sẽ nhận được cùng một PendingIntent cho cả hai đối tượng đó.

Có hai cách điển hình để giải quyết vấn đề này.

Nếu bạn thực sự cần nhiều khác biệt PendingIntent các đối tượng hoạt động cùng 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ó một cái gì đó khác nhau về chúng để kết hợp chúng với các PendingIntents khác nhau. Đây có thể là bất kỳ thuộc tính Intent.filterEquals nào được xem xét bởi Intent.filterEquals hoặc khác nhau số nguyên mã yêu cầu được cung cấp cho getActivity (android.content.Context, int, android.content.Intent, int), getActivities (android.content. Ngữ cảnh, int, android.content.Intent [], int), getBroadcast (android.content.Context, int, android.content.Intent, int), hoặc getService (android.content.Context, int, android.content .Intent, int).

Nếu bạn chỉ cần một PendingIntent hoạt động tại một thời gian cho bất kỳ Intents bạn sẽ sử dụng, sau đó bạn có thể lựa chọn sử dụng cờ FLAG_CANCEL_CURRENT hoặc FLAG_UPDATE_CURRENT hoặc là hủy bỏ hoặc sửa đổi bất cứ điều gì PendingIntent hiện có liên quan đến tiếp cận mục đích bạn đang cung cấp .

từ: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/android/app/PendingIntent.java#PendingIntent

+0

Tôi đang hỏi chức năng này làm gì: "Tôi đoán dưới mui xe cờ này sử dụng [PendingIntent.equals] (https://github.com/android/platform_frameworks_base/blob/59701b9ba5c453e327bc0e6873a9f6ff87a10391/core/java/android/app /PendingIntent.java#L915), nhưng tôi không thực sự chắc chắn rằng tiêu chí mà chức năng đang sử dụng " –

+0

Thông thường mọi người xem nguồn để hiểu những điều sucj và đó là lý do tại sao tôi đang hiển thị nó cho bạn. – Stan

+0

Tôi thường đánh giá cao mã nguồn trong một câu trả lời! Nó thường là tuyệt vời để giúp giải thích/hỗ trợ một câu trả lời. Nhưng tôi đã dán một liên kết đến chính xác mã bạn đã dán. Tôi không hiểu mã đó, vì vậy tôi đang tìm một lời giải thích, không chỉ là một bản sao/quá khứ của mã mà tôi liên kết đến. –

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