5

Tôi có một lỗi mà tôi đang nhận được bản sao ý định sau khi cập nhật. Thay đổi tôi thực hiện là bắt đầu nghe MY_PACKAGE_REPLACED và đăng ký lại báo thức bên dưới, vì tôi cho rằng báo thức đã bị hủy khi ứng dụng được cập nhật. Tuy nhiên, tôi thực sự nhận được bản sao của chương trình phát sóng "TriggerPulse" được xác định trong mã bên dưới.Ý định trùng lặp sau khi cập nhật ứng dụng. Cảnh báo có tồn tại không?

Mã bên dưới là mã duy nhất được đặt báo thức. Đó là, tuy nhiên, được gọi từ nhiều nơi, nhưng theo như tôi có thể thu thập từ tài liệu, mã này nên là idempotent (IntentRequestCodes.PULSE_SERVICE là một số nguyên tĩnh thiết lập để 1). Có đúng là tôi cho rằng mã này là không đáng tin cậy?

final Context applicationContext = context.getApplicationContext(); 

    Intent intent = new Intent("TriggerPulse"); 

    final int flags = 0; 
    PendingIntent pendingIntent = 
      PendingIntent.getBroadcast(applicationContext, IntentRequestCodes.PULSE_SERVICE, intent, flags); 

    AlarmManager alarmMgr = (AlarmManager)applicationContext.getSystemService(Context.ALARM_SERVICE); 
    final int triggerAtMilliseconds = 0; // run first time immediately 
    alarmMgr.setInexactRepeating(
      AlarmManager.ELAPSED_REALTIME_WAKEUP, 
      triggerAtMilliseconds, 
      AlarmManager.INTERVAL_HALF_HOUR, 
      pendingIntent 

Nếu nó được idempotent điều kiện bình thường, điều đó có nghĩa là pendingIntent rằng ứng dụng cập nhật được tạo ra chỉ đơn giản là không được coi là một trận đấu của pendingIntent rằng ứng dụng di sản cũ đang tạo ra, gây ra báo động để được lên lịch lại không? Nếu vậy, tôi có thể dễ dàng giải quyết sự cố đơn giản là không tạo lại báo thức trên MY_PACKAGE_REPLACED. Tuy nhiên, nhiều tài nguyên trên mạng cho thấy rằng người ta cần phải đăng ký lại những sự kiện đó, dẫn đến tin rằng đây có thể là trường hợp trong Android tại một số điểm. Nếu vậy, có một phiên bản Android bị cắt mà hành vi này đã được thay đổi không?

Trả lời

3

Hãy thử hủy báo thức trước đó trước khi thêm lại, vì vậy ngay cả khi nó được thêm trước đó, sẽ không có bất kỳ sự cố nào.

PendingIntent alarmIntent = PendingIntent.getBroadcast(CONTEXT, MY_ID, MY_INTENT, PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager alarmMgr = (AlarmManager) CONTEXT.getSystemService(Context.ALARM_SERVICE); 
    alarmMgr.cancel(alarmIntent); 
Các vấn đề liên quan