¿Cómo se inicia una Actividad con AlarmManager en Android?

He vertido a través de una docena de tutoriales y respuestas del foro sobre este problema, pero todavía no han sido capaces de obtener algún código de trabajo juntos. Voy a tratar de mantener la pregunta directa:

¿Cómo se utiliza AlarmManager (en la API de Android) para iniciar una actividad en un momento dado? Cualquier solución a este problema hará.

Mi último intento para lograr esto es a continuación.

(Importaciones omitidas, espero que MyActivity se inicie 3 segundos después de que se abra el programa, lo que no ocurre. No hay mensajes de error de los que hablar.)

public class AndroidTest2Activity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Context context = this;//.getApplicationContext(); AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); // CORRECT Intent intent = new Intent(context, myReceiver.class); // CORRECT PendingIntent pending = PendingIntent.getBroadcast( context, 0, intent, 0 ); // CORRECT manager.set( AlarmManager.RTC, System.currentTimeMillis() + 3000, pending ); // CORRECT setContentView(R.layout.main); } } public class myReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Intent i=new Intent(context, myActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } } public class myActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("", "Elusive success"); setContentView(R.layout.main); } } 

Cualquier consejo sería apreciado.

Tenga en cuenta: Tengo myReceiver en el manifiesto ya

¿Cómo se utiliza AlarmManager (en la API de Android) para iniciar una actividad en un momento dado?

Suministre un PendingIntent a la llamada set() que identifica la actividad a iniciar. O, hacer lo que estás haciendo, que debería funcionar bien.

Este proyecto de muestra es un poco elaborado, porque es 19 tutoriales profundamente en uno de mis libros, pero si usted mira las clases como EditPreferences , OnBootReceiver , y OnAlarmReceiver , verá la misma receta básica que está utilizando arriba. En este caso, podría haber utilizado un getActivity() PendingIntent , pero el tutorial después de éste le da al usuario una opción de iniciar una actividad o mostrar una Notification , por lo que un BroadcastReceiver tiene más sentido.

Busque advertencias además de errores en LogCat. Lo más probable es que su receptor o actividad no esté en su manifiesto.

Tenga en cuenta que hacer estallar una actividad fuera de la mitad de la nada generalmente no es una buena idea. Citándome del libro en cuestión:

Mostrar la alarma de la hora del almuerzo a través de una actividad de pantalla completa, sin duda funciona, y si el usuario está mirando la pantalla, que recibirá su atención. Sin embargo, también es bastante perturbador si suceden a ser el uso de la derecha del teléfono en ese instante. Por ejemplo, si están escribiendo un mensaje de texto mientras conducen, su actividad de alarma apareciendo de la nada puede distraerlos lo suficiente como para causar un accidente. Por lo tanto, en el interés de la seguridad pública, debemos dar al usuario una opción para tener una manera más sutil de recordarles que almorzar.

En caso de que alguien tropiece con esto – aquí hay un código de trabajo (probado en el emulador 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> 

Problemas con el código de BenLambell:

  • YA SEA:
    • Mover el receptor a su propio archivo .java o
    • Hacer la clase interna estática – por lo que se puede acceder desde el exterior
  • El receptor no se declara correctamente en el manifiesto:
    • Si es una clase interna en MainActivity use: <receiver android:name="package.name.MainActivity$AlarmReceiver" ></receiver>
    • Si está en un archivo separado: <receiver android:name="package.name.AlarmReceiver" ></receiver>

Si su intención es mostrar un diálogo en el receptor onReceive (como yo): eso no está permitido – sólo las actividades pueden iniciar los diálogos. Esto se puede lograr con una actividad de diálogo .

Puede llamar directamente a una actividad con 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); 

Añadir esto en su archivo andifroid mainifest y espero que funcione

 <activity android:name=".MyReceiver" /> <receiver android:name=".MyReceiver"> </receiver> 

De acuerdo con el nombre de clase de convención de Java empiezan con letra mayúscula.

 "myReceiver" to "MyReceiver" and "myActivity" to "MyActivity". 

A continuación, agregue su receptor en el archivo de manifiesto como el siguiente.

 <application ------------ <receiver android:name="MyReceiver"></receiver> --------------------- </application> 

Usted no está enviando ninguna difusión para el receptor al receptor y más lejos lokks como usted quiere una pantalla de la salpicadura o algo similar que para ese u del propósito puede comenzar un nuevo hilo de rosca espera un cierto sec entonces comience la actividad del ur en eso y para ese período de tiempo U puede hacer lo que quieras en el hilo de la interfaz de usuario …

  • ¿Cómo guardar la alarma programada después de que la aplicación fue asesinada por Android o asesino de tareas?
  • AlarmManager no funciona
  • Android AlarmManager no despertar teléfono hasta
  • SetRepeating () de AlarmManager se repite después de 1 minuto sin importar la hora (5 segundos en este caso, API 18+)
  • Llamada de red en tiempos de espera de alarma
  • Notificación de incendio cada 24 horas ya la hora exacta de 8 AM
  • Java.lang.SecurityException:! @Too muchas alarmas (500) registradas de pid 10790 uid 10206
  • Compruebe el tiempo de PendingIntent existente en AlarmManager
  • Crear y cancelar varias alarmas configuradas con AlarmManager
  • IntentService no comenzará a usar AlarmManager
  • Evitar que la alarma de repetición ocurra el fin de semana
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.