2017年4月23日 星期日

Android鬧鐘測試 - 2/3 PendingIntent requestCode及flags

如果要設一個Alarm,只當中有一個要傳入的參數是PendingIntent,這個參數是取得當所設的時間到達時要做什麼,可以是開啟活動,送出廣播或啟動服務,當中還有一個flag要設定。
以一個鬧鐘的應用來說,一般都是用送出廣播的方式。可是flag要設定那一個官方文件就找不到相關資料,只列出以下解釋。
  • FLAG_CANCEL_CURRENT
    • 如果找到相同的PendingIntent會把舊的刪除然後再建立一個新的
  • FLAG_UPDATE_CURRENT
    • 如果找到相同的PendingIntent會更新intent
  • FLAG_NO_CREATE
    • 如果找不到相同的PendingIntent會返回null,但是不會建立一個新的
  • FLAG_ONE_SHOT
    • PendingIntent只會執行一次
在這次測試中會使用下面三個function,一個是建立Alarm,一個是更新,Alarm,另一個是取消Alarm,測試一下用不同的flag來看對設定鬧鐘有什麼實際的影響。


  • set_alarm使用FLAG_CANCEL_CURRENT
    • cancel_alarm及update_alarm使用FLAG_CANCEL_CURRENT
      • 成功建立,更新及取消Alarm,但當取消時通知列的鬧鐘圖示不會消失,時間到達時才會消失但鬧鐘並不會響
    • cancel_alarm及update_alarm使用FLAG_UPDATE_CURRENT
      • 成功建立,更新及取消Alarm
    • cancel_alarm及update_alarm使用FLAG_NO_CREATE
      • 成功建立Alarm及找到並返回相同的PendingIntent
    • cancel_alarm及update_alarm使用FLAG_ONE_SHOT
      • 成功建立Alarm但不能取消,更新Alarm也不能正常運作,最終建立了兩個鬧鐘
  • set_alarm使用FLAG_UPDATE_CURRENT
    • cancel_alarm及update_alarm使用FLAG_CANCEL_CURRENT
      • 成功建立,更新及取消Alarm,但當取消時通知列的鬧鐘圖示不會消失,時間到達時才會消失但鬧鐘並不會響
    • cancel_alarm及update_alarm使用FLAG_UPDATE_CURRENT
      • 成功建立,更新及取消Alarm
    • cancel_alarm及update_alarm使用FLAG_NO_CREATE
      • 成功建立Alarm及找到並返回相同的PendingIntent
    • cancel_alarm及update_alarm使用FLAG_ONE_SHOT
      • 成功建立Alarm但不能取消,更新Alarm也不能正常運作,最終建立了兩個鬧鐘
  • set_alarm使用FLAG_ONE_SHOT
    • cancel_alarm及update_alarm使用FLAG_CANCEL_CURRENT
      • 成功建立Alarm但不能取消,更新Alarm也不能正常運作,最終建立了兩個鬧鐘
    • cancel_alarm及update_alarm使用FLAG_UPDATE_CURRENT
      • 成功建立Alarm但不能取消,更新Alarm也不能正常運作,最終建立了兩個鬧鐘
    • cancel_alarm及update_alarm使用FLAG_NO_CREATE
      • 成功建立Alarm但找不到相同的PendingIntent,返回null
    • cancel_alarm及update_alarm使用FLAG_ONE_SHOT
      • 成功建立,更新及取消Alarm

    從以上測試結果可看到
    使用FLAG_CANCEL_CURRENT或FLAG_UPDATE_CURRENT建立的Alarm要用FLAG_UPDATE_CURRENT更新或取消。
    使用FLAG_ONE_SHOT建立的Alarm要用FLAG_ONE_SHOT更新或取消。
    以FLAG_NO_CREATE來找有沒有相同Alarm時,只會找到以FLAG_CANCEL_CURRENT或FLAG_UPDATE_CURRENT建立的Alarm。
    另外如果雖要建立多個不同的Alarm時,要使用不同的requestCode,系統就會建立一個新的Alarm而不會動到舊的Alarm。
    在搜索鬧鐘程式範例時,所找到的資料都沒有提到使用不同的flag會有什麼不同的用途,而且官方的文件中都是用0(no flag)去建立Alarm,看來對於Alarm Manager來說這個flag沒有特別用途吧。

沒有留言:

張貼留言