2011-08-09 15 views
6

estaba siguiendo this tutorial para mostrar una notificaciónen un dispositivo Android . Cuando ejecuté la aplicación en el dispositivo, apareció un ícono en la barra de estado (como suele aparecer en el dispositivo Android) que es absolutamente perfecto. Pero, por curiosidad, quería saber si puedo mostrar una alerta o una vista con pocos detalles cuando el dispositivo recibe una notificación. Quiero implementar este concepto en mi próxima aplicación.
Alguna muestra me sería de gran ayuda.
Mostrar una alerta o una vista sobre la recepción de una notificación

+1

He hecho una solución. Compruebe esta imagen: http://img854.imageshack.us/img854/1522/previewglobaldialog.png –

Respuesta

0

Un tipo típico de patrón sería que usted registre una determinada parte de su aplicación para "recibir", o escuchar, intenciones específicas. De esta forma, su aplicación puede activarse en cualquier momento arbitrario, observar el intento de llamada y decidir cómo manejarla (ya sea iniciando la aplicación completa, mostrando un diálogo u otra cosa). Una buena cosa que va de la mano con esto es usar el AlarmManager para configurar una alarma que activará y reactivará su aplicación en el futuro (actualizaciones periódicas).

¿Responde a esta pregunta? He hecho algo como esto en mi aplicación y puedo ayudarte con el código si quieres.

EDITAR para implementar este que haría una clase Java que se extiende ya sea BroadcastReceiver o IntentService (dependiendo de si desea que la clase se ejecute en el hilo de interfaz de usuario o como un servicio, respectivamente). En mi siguiente ejemplo, he definido mi propia tecla de acción intención, pero por lo general se comprobaría la acción con intent.getAction():

public class QueryService extends IntentService { 
public final static String SERVICE_NAME = "QueryService"; 

// incoming flags 
public final static String FLAG_ACTION = "R_ACTION"; 
public final static String FLAG_EVENTS_RETURNED = "R_EVENTS"; 
public final static String FLAG_EVENTS_ARCHIVED_RETURNED = "R_EVENTS_ARCH"; 
public final static String FLAG_SHARED_PREFERNCES_RETURNED = "R_PREFS"; 

// outgoing flags 
public final static String RETURN_EVENTS = "RETURN_E"; 
public final static String RETURN_EVENTS_ARCHIVED = "RETURN_E_A"; 
public final static String RETURN_SHARED_PREFS = "RETURN_S_P"; 

public QueryService() { 
    super(SERVICE_NAME); 
} 

protected void onHandleIntent(Intent intent) { 
    String rAction = intent.getStringExtra(FLAG_ACTION); 
    boolean rEvents = intent.getBooleanExtra(FLAG_EVENTS_RETURNED, true); 
    boolean rEventsArchived = intent.getBooleanExtra(FLAG_EVENTS_ARCHIVED_RETURNED, true); 
    boolean rSharedPrefs = intent.getBooleanExtra(FLAG_SHARED_PREFERNCES_RETURNED, true); 

    if(rAction == null){ 
     Log.e(SERVICE_NAME, "no return action specified, exiting..."); 
     return; 
    } 

    Log.i(SERVICE_NAME, "Caller: " + rAction); 

    DroidTaskApplication app = (DroidTaskApplication)getApplicationContext(); 

    Intent resultsIntent = new Intent(rAction); 
    // TODO assembling events/archived events from a database needs 
    // a function that gets the complete event instead of just its headers 

    // assemble event objects and insert them 
    if(rEvents){ 
     List<Event> liteEvents = app.edo.getAllEvents(); 
     if(liteEvents != null){ 
      for(Event e : liteEvents){ 
       int id = e.getId(); 
       e.setAlarms(app.edo.getAlarmsById(id)); 
       e.setSubtasks(app.edo.getSubtasksById(id)); 
       e.setNotes(app.edo.getNotesById(id)); 
      } 
     } 
     resultsIntent.putExtra(RETURN_EVENTS, (Serializable)liteEvents); 
    } 
    // assemble archived event objects and insert 
    if(rEventsArchived){ 
     List<Event> liteEventsA = app.edo.getAllArchivedEvents(); 
     resultsIntent.putExtra(RETURN_EVENTS_ARCHIVED, (Serializable)liteEventsA); 
    } 
    // collect the shared data and send it 
    if(rSharedPrefs){ 
     SharedPreferences prefs = getSharedPreferences(getString(R.string.PREFS_FILE_NAME), MODE_WORLD_READABLE); 
     resultsIntent.putExtra(RETURN_SHARED_PREFS, (Serializable)(prefs == null? null : prefs.getAll())); 
    }   

    Log.i(SERVICE_NAME, "returning results"); 

    // send everything to the caller 
    sendBroadcast(resultsIntent); 
} 

} 

Independientemente de si la clase es un receptor del servicio o de transmisión, debe registrarlo con la aplicación como un "receptor" (lo que significa que puede aceptar emisiones de intención de algún tipo); esto se puede hacer en código Java o en el manifiesto de Android. Un ejemplo que utilizo para ese servicio en el manifiesto está por debajo (aunque mi clase de Java no se preocupa, sobre la acción intención todavía):

<!-- Notification Launcher --> 
    <receiver android:name="edu.clarkson.dtask.BK.NotificationReceiver" android:enabled="true"> 
     <intent-filter> 
      <action android:name="edu.clarkson.dtask.BK.NotificationReceiver.DISPATCH_ALARM" /> 
      <action android:name="edu.clarkson.dtask.BK.NotificationReceiver.CANCEL_ALARM" /> 
     </intent-filter> 
    </receiver> 

diferentes acciones y notificaciones del sistema serán transmitidos por el sistema operativo cuando un cierto estado cambia; si desea recibir información sobre estos cambios, registra un receptor de transmisión o un servicio intencionado de la misma manera que en el manifiesto para una acción de intención diferente (como ACTION_BATTERY_STATE_CHANGED). Toda la documentación se puede encontrar en el android dev site. Espero que eso te ayude a comenzar en el camino correcto.

+0

Sí, por favor. Sería muy útil. –

+0

He editado mi respuesta para incluir algunos ejemplos de código y uso para que pueda comenzar. – Blaskovicz

Cuestiones relacionadas