2011-08-13 8 views
7

He recorrido una docena de tutoriales y respuestas en el foro sobre este problema, pero todavía no he podido obtener algunos códigos de trabajo juntos. Trataré de mantener la pregunta clara:¿Cómo se inicia una actividad con AlarmManager en Android?

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

Mi último intento para lograr esto está por debajo.

(importaciones omitidos. Me esperan para iniciar MyActivity 3 segundos después de que se abra el programa, que no es así. No hay mensajes de error 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

+2

¿Ha registrado el receptor en su AndroidManifest? –

+0

Lo siento, debería haber mencionado eso. Con la línea , sí, lo hice. Avísame si esa es la línea incorrecta. – BenLambell

Respuesta

0

De acuerdo a nombre de la clase Java convención comenzar con capital letter.So cambiar su

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

A continuación, añadir su receptor en el archivo de manifiesto como el siguiente.

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

Adopté la convención Java adecuada, por si acaso importa. Sin embargo, ya tenía la línea correcta en manifiesto (he intentado usar .MyReceiver y MyReceiver como el android: nombre - las fuentes que he visto parecen hacer bien). En cualquier caso, esto no soluciona el problema, pero gracias por su sugerencia. – BenLambell

4

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

de Suministro de un PendingIntent a la llamada set() que identifica la actividad de poner en marcha. O haz lo que estás haciendo, que debería funcionar bien.

This sample project es un poco complicado, porque es 19 tutoriales de profundidad en uno de mis libros, pero si nos fijamos en las clases como EditPreferences, OnBootReceiver, y OnAlarmReceiver, verá la misma receta básica que está utilizando anteriormente. En este caso, podría haber usado getActivity()PendingIntent, pero el tutorial después de este le da al usuario la opción de iniciar una actividad o mostrar un 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 se encuentre en su manifiesto.

Tenga en cuenta que hacer estallar una actividad en medio de la nada generalmente no es una buena idea. Citando a mí mismo desde el libro en cuestión:

Visualización de 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, se llamar su atención. Sin embargo, también es bastante molesto si usan el teléfono de manera instantánea . Por ejemplo, si están escribiendo un mensaje de texto mientras conduce, su actividad de alarma apareciendo de la nada podría distraerlos lo suficiente como para causar un accidente. Entonces, en interés de la seguridad pública, debemos darle al usuario la opción de tener una forma más sutil de recordarles que almuercen.

+0

Gracias por la respuesta rápida. Ya he visto tu tutorial. Intenté sustituir Intent intennt = new Intent (context, MyActivity.class); // CORRECTO PendingIntent pending = PendingIntent.getActivity (context, 0, intent, 0); // CORRECTO – BenLambell

+1

Lo siento, lo intentaré de nuevo: – BenLambell

+0

Gracias por la respuesta rápida. Ya he visto tu tutorial (y coloqué el receptor en el manifiesto). Intenté sustituir en \t Intención intento = nuevo Intención (contexto, MyActivity.class); PendingIntent pending = PendingIntent.getActivity (context, 0, intent, 0); \t pero todavía no se obtiene ninguna evidencia de ejecución de MyActivity.Sin embargo, obtengo el siguiente mensaje de registro: \t (ActivityManager) Starting: Intención {flg = 0x4 cmp = com.ben/.MyActivity (tiene extras)} de pid -1 – BenLambell

5

En caso de que alguien más tropiece con esto, aquí hay un código de trabajo (Probado en 2.3.3 emulador):

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:

  • SEA:
    • Mover el receptor a su propio archivo .java o
    • hacer el cl interior culo estática - por lo que se puede acceder desde fuera del receptor
  • no está correctamente declarada en el manifiesto:
    • si se trata de una clase interna en uso MainActivity: <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 cuadro de diálogo en el Receiver onReceive (como yo): eso no está permitido: solo las actividades pueden iniciar diálogos. Esto se puede lograr con un dialog activity.

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

añadir esto en su archivo mainifest androide y es de esperar que trabajar

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

usted no está enviando ninguna emisión para que el receptor receptor y mucho más, como si desea una pantalla de bienvenida o algo así para ese fin, puede iniciar una nueva espera de subproceso durante un segundo y luego iniciar su actividad en ese momento y durante ese período de tiempo puede hacer lo que desee en la interfaz de usuario hilo ...

Cuestiones relacionadas