2014-09-12 75 views
1

我有些疑慮,我想清楚有關Android中的AlarmManager類。
我有一個需要的應用程序:有關AlarmManager的疑問 - Android

  1. 允許用戶設定的時間。
  2. 開始報警。
  3. 然後,即使應用程序已關閉,它應該在預設時間啓動並在主要活動中執行某個功能(如button.performClick())。

所以,我已經成功地創建了一個名爲alarm.java的活動,在res\layout創建佈局並將其添加到AndroidManifest.xml。另外,我已經成功地設定鬧鐘在我alarm.java類如下:現在

onCreate(){ 
    alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    intent = new Intent(context, MyActivity.class); 
    pi = PendingIntent.getBroadcast(this.getApplicationContext(), ALARM_ID, intent, 0); 
} 

onClick(){ 
    cal.setTimeInMillis(System.currentTimeMillis()); 
    cal.set(Calendar.HOUR_OF_DAY, hour); 
    cal.set(Calendar.MINUTE, minute); 
    alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi); 
    Toast.makeText(getApplicationContext(), "Alarm Set For " + hour + ":" + minute + " " + ampm, Toast.LENGTH_LONG).show(); 
} 

,在我MyActivity.java類,這是主要的活動,我已經添加了BroadcastReceiver

public BroadcastReceiver AlarmReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     /*This is the part I got from SO for starting an activity from `BroadcastReceiver` 
     Intent i = new Intent(); 
     i.setClassName("com.kanishka.nightstalker.homeautomation", "com.kanishka.nightstalker.homeautomation.MainActivity"); 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i);*/ 
     Toast.makeText(getApplicationContext(), "APP STARTED", Toast.LENGTH_LONG).show(); 
     button.performClick(); 
    } 
}; 

顯然,這種方法不起作用,因爲我看不到Toast在經過的時間後彈出。我有點理解這個問題是什麼,我應該使用Service這個。但據我所知,AlarmManager本身在後臺運行,並應在經過的時間觸發BroadcastReceiverMyActivity.java。我哪裏錯了?

回答

2

我哪裏錯了?

  1. 您正在使用setInexactRepeating()。在這裏,「不精確」的意思是「不準確」,因此警報將在您要求的時間的INTERVAL_DAY之內的某個時間發生。

  2. 您正在使用當前時間,然後設置小時和分鐘,這可能會導致過去的時間。

  3. 您正在創建MyActivity一個Intent,這可能不是一個BroadcastReceiver(或者,如果是,MyActivity是一個很奇怪的名字來選擇)。

  4. 如果您希望即使應用程序關閉,鬧鐘也會關閉,那麼您需要使用在清單中註冊的BroadcastReceiver

  5. 「在主要活動中執行某個功能(如button.performClick())是不可能的」,因爲如果應用程序關閉,將不會有活動。

+0

關於(5),註釋掉的部分會以任何方式提供幫助嗎?我正在開始活動,然後開始行動。 至於(2),我在設定報警之前檢查時間是未來的。 請詳細說明第(4)和(3)點。 – 2014-09-13 00:02:59

+0

@KanishkaGanguly:「關於(5),註釋部分會以任何方式提供幫助嗎?」 - 這將開始一項活動。它不允許你點擊它中的一個按鈕。 「我正在檢查時間是在未來設置我的鬧鐘之前」 - 而不是根據您的問題中的代碼。 「請詳細說明第(4)和(3)點」 - 你需要解釋你不瞭解的內容。 – CommonsWare 2014-09-13 00:15:10

+0

好的,這是我採取的解決問題的步驟。 1.向'alarm.java'添加'BroadcastReceiver' 2.將'BroadcastReceiver'添加到'AndroidManifest.xml' 3.使用註釋掉的行來調用我的'MyActivity.java'使用該意圖'i '創造。 4.讀取'MyActivity'中的意圖,在所有內容初始化後執行點擊操作。 那很好嗎? – 2014-09-13 00:24:58