¿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á.
- AlarmManager borrar todos los horarios en el apagado?
- Android Intención de inicio Actividad principal de la aplicación
- La alarma de Android no funciona
- Cancelar un AlarmManager pendienteIntent en otro pendienteintent
- ¿Hay alguna forma de comprobar si ya está configurada una alarma?
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
- Alarmmanager.setRepeating dispara Inmediatamente
- Comunicación de IntentService y AlarmManager
- AlarmManager cuando se cierra la aplicación
- Android AlarmManager no se dispara después de la actualización de Google Play
- Android AlarmManager - RTC_WAKEUP vs ELAPSED_REALTIME_WAKEUP
- AlarmManager setExact con WakefulBroadcastReceiver a veces no es exacto
- AlarmManager no funciona en varios dispositivos
- Confiabilidad del Administrador de alarmas
¿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 es una clase interna en MainActivity use:
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 …
- Propagación de la actualización del mercado de aplicaciones para Android
- Optimizaciones de Java: bytecode-only vs JIT