2010-08-10 14 views
9

Quiero usar una alarma para ejecutar un código en un momento determinado. He implementado con éxito una alarma con el receptor de difusión registrado en el manifiesto, pero de la manera que lo entiendo, este método utiliza una clase separada para el receptor de difusión.Android Alarm Manager con receptor de difusión registrado en código en lugar de manifiesto

Puedo utilizar este método para iniciar otra actividad pero no puedo usarlo para ejecutar un método en mi actividad principal?

(how can I notify a running activity from a broadcast receiver?)

Así que han estado tratando de registrar mi receptor de radiodifusión en mi actividad principal como se explica en la respuesta anterior.

private BroadcastReceiver receiver = new BroadcastReceiver(){ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "hello", Toast.LENGTH_SHORT).show(); 
     uploadDB();   
    } 
};  

public void onResume() { 
    super.onResume(); 

    IntentFilter filter = new IntentFilter(); 
    filter.addAction(null); 

    this.registerReceiver(this.receiver, filter); 
} 

public void onPause() { 
    super.onPause(); 

    this.unregisterReceiver(this.receiver); 
} 

Sin embargo, he sido incapaz de conseguir esto para trabajar con el gestor de alarma, estoy seguro de cómo yo debería vincular la intención de alarma al receptor de radiodifusión. ¿Podría alguien señalarme un ejemplo de registrar dinámicamente un receptor de difusión de gestor de alarmas en la actividad? ¿O explicar cómo haría esto?

Respuesta

15

¿Qué tal esto?

Intent startIntent = new Intent("WhatEverYouWant"); 
PendingIntent startPIntent = PendingIntent.getBroadcast(context, 0, startIntent, 0); 
AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
alarm.set(AlarmManager.RTC_WAKEUP, triggerTime, startPIntent); 

Y luego en el archivo de Manifest.xml:

<receiver android:name="com.package.YourOnReceiver"> 
    <intent-filter> 
     <action android:name="WhatEverYouWant" /> 
    </intent-filter> 
</receiver> 

Así que por lo que yo sé que todavía tiene que declarar el receptor en el manifiesto. No estoy seguro si puede configurarlo en una instancia privada dentro de su actividad. Podría declarar un onReceive dentro de su actividad y llamar a eso (si el BroadcastReceiver tiene una interfaz. No sé si lo hace)

+2

Impresionante, me las arreglé para ponerlo en funcionamiento, sin embargo, no necesité agregar código al manifiesto. Acabo de registrar el receptor de difusión progamaticamente con un filtro de intenciones del mismo nombre. – serenskye

+0

Gracias y +1 por ti – Barrier

1

Inicia un intento de alarma desde el que desea iniciar la alarma. escriba debajo de código desde donde desea comenzar a escuchar la alarma

Intent myIntent = new Intent(getBaseContext(), **AlarmReceiver**.class); 
       PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, myIntent, 0); 
       AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
       Calendar calendar = Calendar.getInstance(); 
       calendar.setTimeInMillis(System.currentTimeMillis()); 
       calendar.add(Calendar.MINUTE, shpref.getInt("timeoutint", 30)); 
       alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 

Y en receptor de radiodifusión escribir el código que desea recibir. Y en escritura menifest continuación

<receiver android:name=".AlarmReceiver" android:process=":remote"/> 

También se puede poner la alarma repetitiva también. Espero que ayude!

Cuestiones relacionadas