2010-12-03 9 views
13

Tengo el siguiente código para crear una notificación de la barra de estado:Android: Haga clic en caso de notificación de la barra de estado

public void txtNotification(int id, String msg){ 
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    Notification notification = new Notification(android.R.drawable.sym_action_email, msg, System.currentTimeMillis()); 

    // The PendingIntent will launch activity if the user selects this notification 
    Intent intent = new Intent(this, MainActivity.class) 
    intent.putExtra("yourpackage.notifyId", id); 
    PendingIntent contentIntent = PendingIntent.getActivity(this, 1, intent, 0); 

    notification.setLatestEventInfo(this, "title", msg, contentIntent); 

    manager.notify(id, notification); 
} 

Cuando se hace clic en la notificación, quiero llamar a un método, preferiblemente con acceso a la identificación de la notificación.

Gracias de antemano,

Tim

(EDIT: He actualizado mi código después de leer la primera respuesta, pero todavía no sé cómo escuchar para obtener el propósito)

+0

lo siento, olvidé mencionar que actualicé mi respuesta hace unos días. Por favor, avíseme si todavía tiene preguntas. – McStretch

+0

Ah, gracias. He leído algunas cosas allí, pero eso era principalmente solo especificaciones técnicas sobre objetos. Esa página es muy útil. –

Respuesta

16

pienso la mejor manera de manejar un clic en la notificación (¿tal vez la única?) es definir un método dentro de la clase que sus llamadas PendingIntent (MainActivity en este caso). Usted puede modificar su intención antes de pasarlo en getActivity() para incluir el identificador de la notificación:

// The PendingIntent will launch activity if the user selects this notification 
Intent intent = new Intent(this, MainActivity.class) 
intent.putExtra("yourpackage.notifyId", id); 
PendingIntent contentIntent = PendingIntent.getActivity(this, 1, intent, 0); 

A continuación, ver con este fin dentro MainActivity y llame al método que ha definido dentro de la clase para manejar la notificación. Puede extraer la identificación de la intención entrante.

Actualización:

Para que su actividad para manejar la notificación, tendrá que definir en primer lugar la actividad en su archivo AndroidManifest.xml, incluyendo cualquier filtro intención que necesita. Luego, en la Actividad onStart(), puede extraer los extras del intento entrante y actuar según esos datos. Esta es una descripción general de alto nivel, por lo que le sugiero que lea partes de la Guía de desarrollo para familiarizarse con los conceptos. La siguiente página es un buen punto de partida:

http://developer.android.com/guide/topics/fundamentals.html

también "yourpackage" debe sustituirse por el nombre del paquete que incluye su clase, tales como "com.project.foo".

+0

Gracias, soy bastante nuevo en el desarrollo de Android y nunca antes había usado intenciones. ¿Cómo puedo configurar un oyente? –

+0

Formélame, sin 'packagename' funcionó. ¡Gracias! :) –

+1

Si tiene muchos tipos diferentes de notificaciones, puede hacer la vida más fácil al proporcionar una matriz si tiene la intención de que la primera sea una vacía, solo con recoger el clic. Ese es el 3er parámetro debe ser Intención []. – slott

2

para torpes como yo: Conseguir este yourpackage.notifyId en MainActivity:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Bundle intent_extras = getIntent().getExtras(); 
     if (intent_extras != null && intent_extras.containsKey("yourpackage.notifyId")) 
     { 
      //Do the codes 
     } 

} 

En mi caso - lo utilizaron para determinar quién está abriendo mi mainactivity, el usuario o una llamada de notificación, por cteated GcmIntentService. .. PD He usado nombres sin "youpackage", también funciona bien.

+1

Usar nombres sin un prefijo "yourpackage" funciona, pero tenga en cuenta que esto es un riesgo ya que los extras de otros intentos podrían contener una clave igual que probablemente conduciría a un comportamiento incorrecto ... Así que mejor use un espacio de nombres de paquete. – sjkm

Cuestiones relacionadas