2011-01-11 42 views
9

He estado luchando con esto durante horas. También revisé la documentación y varios temas. Encontré este código en dos temas, ambos dijeron que el código funcionaba perfectamente, pero no en mi computadora. Aparece el primer Toast, pero el segundo nunca. ¿Qué está mal?Android alarma no funciona

public class HelloAndroid2 extends Activity { 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Intent intent = new Intent(this, AlarmReceiver.class); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, 
    intent, PendingIntent.FLAG_ONE_SHOT); 

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10 * 1000), pendingIntent); 
    Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show(); 

} 

public final class AlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show(); 

    } 
} 

}

+0

Por favor, muestre su AndroidManifest.xml. Debe declarar su receptor de difusión en el manifiesto y la acción a la que reaccionaría – ccheneson

Respuesta

33

En realidad usted no necesita especificar la acción ya que se utiliza la clase AlarmReceiver.class en el intento.

En su AndroidManifest.xml, asegúrese de que tiene una definición receptor dentro de los <application> etiquetas, algo así como:

<receiver android:name="AlarmReceiver">

Editar: OK Hay 2 maneras de utilizar su receptor de radiodifusión.

1) A partir del código que nos ha proporcionado, AlarmReceiver.java que se contiene:

public final class AlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show(); 

    } 
} 

y HelloAndroid2.java:

public class HelloAndroid2 extends Activity { 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Intent intent = new Intent(this, AlarmReceiver.class); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, 
    intent, PendingIntent.FLAG_ONE_SHOT); 

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10 * 1000), pendingIntent); 
    Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show(); 

} 

} 

De esta manera, usted puede configurar su receptor de radiodifusión para trabajar con el AndroidManifest.xml y la etiqueta <receiver ...>

2) 2da manera. De esta manera, puede usar solo 1 archivo HelloWorld2.java:

En su actividad, cree su receptor de difusión y lo registra.

public class HelloWorld2 extends Activity { 
    private SharedPreferences prefs; 
    private String mName; 


    BroadcastReceiver alarmReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      Toast.makeText(context, "Alarm worked", Toast.LENGTH_LONG).show();   
     } 
    }; 


    public static final String ACTION_NAME = "com.helloworld.MYACTION"; 
    private IntentFilter myFilter = new IntentFilter(ACTION_NAME); 


    @Override 
    protected void onPause() { 
     unregisterReceiver(alarmReceiver); 
     super.onPause(); 
    } 

    @Override 
    protected void onResume() { 
     registerReceiver(alarmReceiver, myFilter); 
     super.onResume(); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     registerReceiver(alarmReceiver, myFilter); 

     Intent intent = new Intent(ACTION_NAME);   

     PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, 
     intent, PendingIntent.FLAG_ONE_SHOT); 

     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10 * 1000), pendingIntent); 
     Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show(); 


    } 
+0

Gracias, por la respuesta, pero todavía nada. Este es el archivo .xml: \t [/ code] – erdomester

+0

Lo siento, no sé cómo hacer que esto parezca un código aquí. – erdomester

+1

Debe agregar esto a su publicación y publicar algo así como "Editar", para que la gente sepa que es una información adicional – ccheneson

10

Tuve el mismo problema hasta que descubrí que había puesto mi Broadcast Receiver en un paquete diferente, no el general.

Simplemente cambió:

<receiver android:name=".AndroidAlarmService" android:enabled="true" > 

para:

<receiver android:name="com.MyCompany.MyPackage.AndroidAlarmService" android:enabled="true" > 
+0

Funciona perfecto para mí ¡Thx ¡ – Terranology

+0

gracias. Debería ser una advertencia de Android. Perdí una hora. – ahmadalibaloch

0

Si la respuesta anterior no funciona para usted, entonces hay otra manera de no reciben ningún devoluciones de llamada cuando AlarmManager incendios una alarma vencida Simplemente necesita verificar esto: enviando el Intent incorrecto en la instanciación de PendingIntent. Por ejemplo, quería recibir una llamada onReceive en uno de sus receptores, pero creó una instancia de PendingIntent a través de getActivity o getService, pero lo que realmente quiso decir es getReceiver.

Al crear instancia de PendingIntent, hay muchas maneras de crear la misma (getService, getActivity, getReceiver, getForegroundService:

si quieres Activity el receptor de la intención, entonces:

PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*); 

si usted quiere BroadcastReceiver el receptor de la intención:

PendingIntent.getReceiver(this, 0, intent, PendingIntent.FLAG_*); 

si quieres un primer plano Service el receptor de la intención:

PendingIntent.getForegroundService(this, 0, intent, PendingIntent.FLAG_*); 

si quieres un Service el receptor de la intención:

PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_*); 

También, asegúrese de que las intenciones apuntan a la clase correcta . (por ejemplo, crear intenciones para Actividad, Servicio, etc.). Usted no recibir cualquier llamada si pasa erróneamente como esto:

Intent intent = new Intent(this, MyReceiver.class); // You wanted receiver 

// PendingIntent was created in such a way 
// you wanted this to be received by an activity. 
// you will not receive any call if you set it up like this. 
PendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*); 

También he publicado respuesta here similares.

HTH