2013-07-19 21 views
9

Witam Obecnie pracuję z programem AlarmManager. Napisałem kod podany poniżej. Zgodnie z kodem alarmManager powinien zostać wyzwolony po 10 sek., Ale tutaj w moim kodzie menedżer alarmów natychmiast się uruchamia. Proszę pomóż.Menedżer alarmów natychmiast uruchomiony

public class MainActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
     int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP; 
     long timeOrLengthofWait = 10000; 
     Intent intentToFire = new Intent(this, AlarmReciever.class); 
     PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, intentToFire, 0); 
     alarmManager.set(alarmType, timeOrLengthofWait, alarmIntent); 
    } 
} 

And My AlarmReciever Klasa

public class AlarmReciever extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

     String phoneNumberReciever="5556"; 
     String message="Alarm Triggered"; 
     SmsManager sms = SmsManager.getDefault(); 
     sms.sendTextMessage(phoneNumberReciever, null, message, null, null); 
     Toast.makeText(context," A message has been sent", Toast.LENGTH_LONG).show(); 

     Log.d("Alarm ", "Alarm Has been triggered and sms send"); 
    } 
} 

już dodany wymaganych uprawnień w manifeście.

Odpowiedz

10

Używasz alarmu typu ELAPSED_REALTIME_WAKEUP. Oznacza to, że drugi parametr do set() musi być liczbą milisekund od teraz, gdzie teraz jest wyrażany jako SystemClock.elapsedRealtime().

Jeśli twoim celem jest, aby mieć to nastąpić 10000 milisekund od chwili nawiązania połączenia set(), że set() wezwanie powinno być:

alarmManager.set(alarmType, SystemClock.elapsedRealtime()+timeOrLengthofWait, alarmIntent); 
+0

Dziękuję bardzo, że pomogło i zadziałało :) –

+2

Jako adiunkt, documentarion mówi: "Jeśli określony czas wyzwalania jest w przeszłości, alarm uruchamia się natychmiast." Znacznik czasu 10000 podany w pytaniu na pewno reprezentuje datę w przeszłości. To jest powód, dla którego alarm został natychmiast uruchomiony. Więcej informacji w https://developer.android.com/training/scheduling/alarms.html#set – androidevil

11

Jeśli tworzysz PendingIntent alarmu dla czasu przeszłego to będzie natychmiast zwolniony. Przykład - Zaplanuj alarm na dziś o 8 rano, ale kod wykonawczy około 11:00 zostanie natychmiast uruchomiony.

Rozwiązanie:

cal.add(Calendar.DATE, 1); 

long delay = 24 * 60 * 60 * 1000; 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), delay,pendingIntent);` 

To będzie ognia zdarzenie na następny dzień o określonej godzinie (czyli 8 rano);

+3

"Jeśli tworzony jest alarm PendingIntent dla poprzedniego czasu, zostanie on natychmiast wyrzucony". Bardzo mi pomogło. – androidStud

Powiązane problemy