天天看點

鬧鐘AlarmManager PendingIntent擷取方法中的注意事項

  • 在最近寫的鬧鐘APP中,使用到了PendingIntent,PendingIntent的擷取方法有三種:
    1. getActivity(Context context,int requestCode,Intent intent,int flags)
    2. getBroadcast(Context context,int requestCode,Intent intent,int flags)
    3. getService(Context context,int requestCode,Intent intent,int flags)
  • 一開始我不了解這些方法的時候上網查詢,結果其他人寫的這三個方法中第二個參數和第四個參數均為0,導緻了我設定多個鬧鐘後隻有最後一個響應,後來經過排查,才發現是這兩個參數設定的原因
  • 首先介紹第四個參數int flags,官方文檔這樣說明:
flags:Maybe FLAG_ONE_SHOT, FLAG_NO_CREATE, FLAG_CANCEL_CURRENT, FLAG_UPDATE_CURRENT, or any of the flags as supported by Intent.fillIn() to control which unspecified parts of the intent that can be supplied when the actual send happens.
  • flags的值有以下幾種:
    1. FLAG_CANCEL_CURRENT:當你隻想改變intent中的資料,你可以用這個來重新得到新的PendingIntent;通過取消之前的PendingIntent,這確定了隻有被給予新資料的實體(entity)将能夠啟動它,如果這種確定無所謂的,考慮使用FLAG_UPDATE_CURRENT.
    2. FLAG_UPDATE_CURRENT : 當第二個參數int requestCode是一個常量的話,更新目前的Intent,否則,系統就會建立一個新的Intent;和FLAG_CANCEL_CURRENT的差別是這個參數可以建立一個新的Intent。(強烈推薦使用這個!)
    3. FLAG_ONE_SHOT : 使用一次後就自動取消,即使你後面再利用擷取PendingIntent的三個方法也無法擷取PendingIntent。
    4. FLAG_NO_CREATE : 若intent不存在,則傳回一個值為null的pendingIntent
  • 下面介紹第二個參數int requestCode:上面第二點提到了就不再啰嗦了。
  • 總結:PendingIntent擷取方法最好寫成這樣:

    PendingIntent pendingIntent = PendingIntent.getXXX(this,變量,intent,FLAG_UPDATE_CURRENT);

繼續閱讀