Mostrando una Snackbar desde dentro de un Servicio

Cuando muestro una SnackBar desde dentro de una Actividad, tengo el rootView disponible. Pero tengo que mostrar una SnackBar desde dentro de un servicio, donde no tengo una vista disponible. ¿Cómo podría lograr esto?

Como backstory: una actividad inicia un servicio para hacer una tarea. El Servicio necesita mostrar una SnackBar dependiendo de las situaciones. No quiero unirme al servicio sólo por eso. Entonces, ¿cómo puedo lograr esto? Normalmente podría mostrar un brindis, pero necesito que el usuario pueda leer el mensaje y confirmarlo.

La Snackbar necesita una View para que se muestre, así que si quieres mostrar barras de aperitivos en tu aplicación dependiendo del estado de tu Service tendrás que LocalBroadcastManager a tu Activity o transmitir un mensaje a través de LocalBroadcastManager y mostrar un mensaje en tu cuenta View .

No creo que haya otra forma de evitarlo, tendrás que comunicarte con tu Activity o Fragment alguna manera.

Snackbars no son como tostadas que sólo necesitan un contexto , así que si quieres mostrarlo fuera de su aplicación, creo que no puede con la clase proporcionada por Android.

A partir de las directrices de diseño :

Colocación

Snackbars aparecen por encima de la mayoría de los elementos en la pantalla, y son iguales en elevación al botón de acción flotante. Sin embargo, son más bajos en la elevación que los cuadros de diálogo, las hojas inferiores y los cajones de navegación.

No es explícito, pero puedes llegar a la conclusión de que solo se mostrará en las vistas de tu aplicación. Por lo tanto, de nuevo, tendrá que comunicarse con su vista visible de alguna manera.


Snippets en la difusión de un mensaje:

Remitente (en su Servicio)

 private void doSendBroadcast(String message) { Intent it = new Intent("EVENT_SNACKBAR"); if (!TextUtils.isEmpty(message)) it.putExtra(EXTRA_RETURN_MESSAGE,message); LocalBroadcastManager.getInstance(mContext).sendBroadcast(it); } 

Receptor (en su actividad)

 private BroadcastReceiver mMessageReceiver = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Other stuff. mMessageReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // Do something } }; } @Override public void onResume() { super.onResume(); LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("EVENT_SNACKBAR")); } 

Más información sobre servicios enlazados aquí .

Y sobre LocalBroadcastManager aquí en esta pregunta .

Siempre se puede enviar una emisión a través de LocalBroadcastManager en su Service

 LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("SERVICE_DID_SOMETHING")); 

Y luego en la Activity use un BroadcastReceiver para mostrar la Snackbar

 private final ServiceReceiver _serviceReceiver = new ServiceReceiver(); @Override protected void onResume() { super.onResume(); final IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("SERVICE_DID_SOMETHING"); LocalBroadcastManager.getInstance(this).registerReceiver(_serviceReceiver, intentFilter); } @Override protected void onPause() { super.onPause(); try { LocalBroadcastManager.getInstance(this).unregisterReceiver(_serviceReceiver); } catch (Exception ex) { Log.e(TAG, "Error unregistering ServiceReceiver", ex); } } // region ServiceReceiver private class ServiceReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO: Show your Snackbar here... } } // endregion 

Puede utilizar la Intent que envía para pasar datos adicionales si es necesario y, a continuación, extraerlo en BroadcastReceiver.onReceive(Context context, Intent intent)

No es posible hacerlo con el SnackBar predeterminado proporcionado por el SDK, ya que siempre requerirá una vista.

Para servir a su propósito, puede utilizar alguna biblioteca externa que imita a una SnackBar como ésta

Cómo crear una Snackbar con el contexto de la aplicación que es visible en varias actividades: https://stackoverflow.com/a/37707741/1185087

  • Servicio Android android.os.BinderProxy error
  • Manejo de la funcionalidad "Deslizar para salir" de la lista de aplicaciones recientes de ICS
  • No se puede obtener el objeto de servicio (onServiceConnected nunca se llama)
  • OnTaskRemoved () no se llama en dispositivos HUAWEI y XIOMI
  • ¿Cómo puedo activar automáticamente el inicio automático de mis aplicaciones en el menú de seguridad Xiaomi Mi4i?
  • Uso de GoogleApiClient en un servicio
  • Servicios de Android: consideraciones sobre el ciclo de vida
  • ¿Por qué la aplicación Android basada en Android no está instalando en el dispositivo Android basado en Asistencia-GPS (A-GPS)?
  • Evitar que algunos usuarios cierren el servicio de Android
  • Problema al ejecutar un script desde init.rc en el arranque del dispositivo
  • Cómo utilizar AsyncTask en Servicios en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.