В случае, если кто-то еще наткнется на это - вот некоторый рабочий код (протестирован на эмуляторе 2.3.3):
public final void setAlarm(int seconds) {
// create the pending intent
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0,
intent, 0);
// get the alarm manager, and scedule an alarm that calls the receiver
((AlarmManager) getSystemService(ALARM_SERVICE)).set(
AlarmManager.RTC, System.currentTimeMillis() + seconds
* 1000, pendingIntent);
Toast.makeText(MainActivity.this, "Timer set to " + seconds + " seconds.",
Toast.LENGTH_SHORT).show();
}
public static class AlarmReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Log.d("-", "Receiver3");
}
}
AndroidManifest.xml:
<receiver android:name="com.example.test.MainActivity$AlarmReceiver" >
</receiver>
Проблемы с кодом BenLambell:
- ЯВНО:
- Переместить получателя в собственный файл .java или
- делает внутренний класс статичным, чтобы к нему можно было получить доступ извне
- Получатель неправильно объявлен в манифесте:
- если это внутренний класс в MainActivity, используйте:
<receiver android:name="package.name.MainActivity$AlarmReceiver" ></receiver>
- если это в отдельном файле:
<receiver android:name="package.name.AlarmReceiver" ></receiver>
Если вы хотите отобразить диалог в onReceive получателя (как я): это не разрешено - только действия могут запускать диалоги. Это может быть достигнуто с помощью диалогового действия .
Вы можете напрямую вызвать действие с AlarmManager:
Intent intent = new Intent(MainActivity.this, TriggeredActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
((AlarmManager) getSystemService(ALARM_SERVICE)).set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + seconds * 1000, pendingIntent);