Interacción con AsyncTask de la barra de notificación

Así que tengo un AsyncTask que maneja una carga a un servidor mientras que al mismo tiempo llama a una clase de NotificationHelper para actualizar la barra de la notificación para exhibir el porcentaje actual de la carga por teletratamiento. Esa parte funciona bien, los únicos problemas que tengo son conseguir que las acciones funcionen correctamente y poder usar las intenciones enviadas por las acciones (el intento más reciente fue usar un administrador de broadcast dentro de la actividad de los padres, pero nunca obtengo los mensajes). Si alguien pudiera señalarme en la dirección correcta, eso sería muy apreciado.

Aquí está un poco del código:

mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); Intent intent = new Intent("com.example.sibmedemo.sibme"); intent.putExtra("message","pause"); PendingIntent pIntent = PendingIntent.getActivity(mContext, 0, intent, 0); mBuilder = new Notification.Builder(mContext) .setContentTitle("Upload File") .setContentText("Upload in progress") .setSmallIcon(R.drawable.ic_launcher) .addAction(R.drawable.ic_launcher,"Pause",pIntent) .addAction(R.drawable.ic_launcher,"Cancel",pIntent); mBuilder.setProgress(100,0,false); mNotificationManager.notify(0,mBuilder.build()); 

Asumiría que mi problema principal es que no entiendo correctamente cómo los pendientes trabajan o cómo se intercambian dentro de una actividad del androide, cualquier claridad en esta edición sería provechosa.

——- CÓDIGO DE TRABAJO DESPUÉS DE UTILIZAR SOLUCIÓN ———– Actividad principal ———–

 public class FileUploadActivityV2 extends Activity { public static int flags = 0; public BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.i("message", "got a message"); if(intent.getStringExtra("message").equalsIgnoreCase("pause")) flags = 1; goAsync(); } }; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_file_upload_activity_v2); registerReceiver(receiver, new IntentFilter("sibme")); flags = 0; (new UploadTask(this)).execute(); } 

Sí sé im supone para tener cuidado del ciclo de vida del brodcastReceiver pero como de ahora esto es aceptable para la prueba. Para cualquiera que se pregunte, la función goAsync () es parte de la API de Android y simplemente indica que una vez que el receptor ha llamado a la función onReceive, recicle el receptor para el futuro para que pueda ser utilizado de nuevo.

En la clase AsyncTask ———

  @Override protected Long doInBackground(Integer... integers) { while(FileUploadActivityV2.flags == 0) { try{ Thread.sleep(1000); Log.i("Running", "Running in background"); }catch(Exception e){ } } return null; } 

Dentro de la clase auxiliar de notificación ——

  public void createNotification() { mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); Intent intent = new Intent("sibme"); intent.putExtra("message","pause"); PendingIntent pIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0); mBuilder = new Notification.Builder(mContext) .setContentTitle("Upload File") .setContentText("Upload in progress") .setSmallIcon(R.drawable.ic_launcher) .addAction(R.drawable.ic_launcher,"Pause",pIntent) .addAction(R.drawable.ic_launcher,"Cancel",pIntent); mBuilder.setProgress(100,0,false); mNotificationManager.notify(0,mBuilder.build()); } 

Para interactuar con el asynctask que está trabajando en segundo plano, entonces PUEDE ser capaz de hacerlo dentro de publishProgress () (nunca lo he probado). De lo contrario sólo tiene en pre y post ejecutar. Lo único que puedo imaginar si este no es el caso es una clase int variable cuyo valor se cambia dependiendo de lo que el botón del usuario hace clic. Esto puede comprobarse dentro de doInBackground y se puede tomar la acción apropiada.

Entender PendingIntent es importante. Este es uno de los componentes de gran alcance de Android tiene, y puede ser utilizado para muchos de los propósitos al lado de notificaciones de manejo de acciones.

Puede pensar como intención pendiente como objeto que representa una acción que desea realizar (envío de emisión / inicio de actividad / inicio serive) + la intención de realizar esta acción con. Lo que lo hace poderoso es que usted puede proporcionar intentos pendientes a otro proceso / aplicaciones (en su caso el otro proceso es el OS NotificationManager ) y por eso le das al otro proceso la capacidad de despertar tu aplicación e iniciarte automáticamente para ti la intención Siempre con la intención pendiente.

Así, la intención pendiente se utiliza de alguna manera en la notificación como un "oyente remoto" que no tiene que ejecutarse con el fin de detectar el evento (en su caso, el evento es el botón de notificación haga clic)

Debido a la naturaleza de PendingIntent como objeto compartido entre diferentes aplicaciones, se obtiene una referencia / crea una nueva por métodos estáticos ( PendingIntent.getService() / PendingIntent.getActivity() y así sucesivamente) que le devuelve una nueva instancia o una existente administrada por el sistema.

Vamos a llegar a su código:

Llamando a PendingIntent.getActivity() creas la intención pendiente de que AlarmManager pueda iniciar la actividad específica que proporcionaste en la intención ("com.example.sibmedemo.sibme" en tu caso). Supongo que quieres reaccionar de forma diferente para pausar y cancelar acciones. Es por eso que necesitará diferentes intenciones pendientes para cada uno de ellos . Puede diferenciar entre las dos acciones en más de una forma:

  • Iniciar diferentes actividades / servicios o enviar broadcast (PendingIntent.getBroadcast ()) para cada uno de ellos
  • Iniciar la misma actividad, pero utilizar código de solicitud diferente

De todos modos – usted tendrá que crear a diferentes intentos y thuss – dos intenciones pendientes diferentes para representar las diferentes acciones que desea realizar para diferentes acciones.

Espero que te ayude, y tal vez otros.

  • ¿Cómo iniciar la actividad después de desbloquear btn presione y antes de desbloquear pantalla aparecen?
  • Actividad PopUp comienza de nuevo cuando se inicia desde "aplicaciones recientes"
  • Utilización de un receptor de difusión como actividad de clase interna con registro de manifiesto
  • SMS recibidos en mi aplicación de SMS y en Hangouts, aunque llamo a abortBroadcast ()
  • Abra la actividad haciendo clic en la notificación push de Parse
  • Permiso personalizado con intención implícita
  • Enviar ArrayList <Object> de BroadCastReceiver a Actividad
  • Android no puede pasar extras de intención aunque AlarmManager
  • Android: respuesta de la actividad del mercado
  • Inicio de la aplicación en el arranque completado
  • Problema al adquirir el bloqueo de activación del receptor de difusión
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.