2012-02-27 112 views
0

幾個關於報警註冊和觸發啓動服務的問題。Android報警和服務觸發器

  1. 如果報警設定在夫婦分鐘的提前當前的時間,然後如果這款手機是由開關關閉,將在下一個電話交換機上的報警觸發對計劃的時間後通過呢?

  2. 如何取消/更新待處理服務中的意圖?如何獲取startCommand()服務方法中的請求代碼?

  3. 如果每10秒鐘觸發警報,是否會創建多個服務實例?

+0

「取消/更新待處理服務意圖」 - 原因是什麼? – Olegas 2012-02-27 14:00:54

回答

1
  1. 如果「關閉」表示完全斷電,而不只是「一次短按電源鍵打開屏幕關閉」的答案是「否」

  2. 我認爲你不能獲取請求代碼。如getService所述的文檔所述,requestCode字段爲「當前未使用」。你應該用Intent(getService的第三個參數)傳遞所有的數據。

  3. 不會。見http://developer.android.com/reference/android/content/Context.html#startService(android.content.Intent

這種方法每次調用會導致對目標服務的onStartCommand(意向,INT,INT)方法的

+0

感謝Olegas的投入 – Ravibhushan 2012-02-27 14:58:48

1
  1. 商店的時間相應呼叫在SharedPreferences中發出警報。然後爲android.intent.action.BOOT_COMPLETED註冊一個接收器(記住爲您的清單添加一個android.permission.RECEIVE_BOOT_COMPLETED權限),然後在接收器中,它將在啓動時執行,您可以看到該警報是否在SharedPreferences中,如果是的話,你可以重置它,如果它還沒有通過,或者決定如果時間已經過去該怎麼辦。

  2. problem with cancel the alarm manager pending intent

  3. 號服務的onCreate纔會被調用一次。它的onStart和onStartCommand每次都會被調用。

0
  1. 從我自己的應用程序,我開發,如果警報設置爲當手機處於關機狀態時,它已經在的/ boot下一個電話上執行。這是沒有BOOT_COMPLETED存在的接收器。我不確定這是否是預期的行爲,或者它是否與手機變體保持一致。

    我相信如果你希望在你的鬧鐘在指定的時間執行意圖,你需要使用帶WakeLock的getBroadcast PendingIntent,因爲PendingIntent的其他變體並不能保證手機在關閉前保持清醒狀態 - 再次下降。這是來自CommonsWare的另一篇文章的信息,我將嘗試查找和鏈接到。

  2. 我相信你可以刪除發送給使用報警管理器的PendingIntent,例如,像函數:

    public void unregisterEvent(PendingIntent sender) { ((AlarmManager) this.getSystemService(Context.ALARM_SERVICE)).cancel(sender); }

    其中的PendingIntent已經創建正是因爲你試圖原意去掉。您可以通過用新的PendingIntent再次調用AlarmManager當沿着提供正確的ID更新:

    AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);

    這是我用它來創建/重建的PendingIntent:

    PendingIntent.getService(this, uniqueIndexToIntent, theIntentItself, PendingIntent.FLAG_UPDATE_CURRENT);

    的標誌將更新意圖,如果它已經存在,或者將創建一個新的意圖,否則。

  3. 我不認爲會。不過,我建議在完成其工作後讓您的服務電話stopSelf(),以便將電池使用量降至最低。沒有必要讓它運行,如果它無事可做!