SyncAdapter no se llama dependiendo del orden de las llamadas de configuración de cuenta

Me he encontrado con un comportamiento ligeramente extraño con mi SyncAdapter.

La primera vez que instalo mi aplicación (después de desinstalar con adb), se inicia y crea una cuenta. Dependiendo del orden de algunas declaraciones (vea más abajo), nunca se llamará mi onPerformSync () de SyncAdapter; Mi cuenta en "Cuentas y sincronización" muestra el icono de "sincronización en curso" girando indefinidamente. Si luego desmarco la casilla de verificación de sincronización junto a la cuenta de mi aplicación y la vuelvo a comprobar, mi onPerformSync () se llama inmediatamente.

Esto hace que mi SyncAdapter nunca se llame. "Sincronización en progreso" icono gira para siempre, a menos que desmarque, luego vuelva a comprobar la casilla de verificación de sincronización:

final Account account = new Account(mUsername, getString(R.string.ACCOUNT_TYPE)); mAccountManager.addAccountExplicitly(account, mPassword, null); ContentResolver.setSyncAutomatically(account, getString(R.string.CONTENT_AUTHORITY), true); ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1); 

Con este ordenamiento de las mismas afirmaciones, todo funciona perfectamente:

 final Account account = new Account(mUsername, getString(R.string.ACCOUNT_TYPE)); ContentResolver.setSyncAutomatically(account, getString(R.string.CONTENT_AUTHORITY), true); ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1); mAccountManager.addAccountExplicitly(account, mPassword, null); 

Mi conjetura es que estoy poniendo el SyncManager en un estado inconsistente debido a que disparar una solicitud de sincronización al instante en la creación de cuentas, y estoy cambiando su configuración bajo sus pies. Pero la documentación (apenas coherente) no menciona ningún problema con llamar a estas funciones cuando quieras.

Como un aparte para otros que luchan con SyncAdapters, encontré que contentResolver.requestSync() nunca disparará su SyncAdapter.onPerformSync() menos que usted llame a ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1); .

¿Podría alguien explicar este comportamiento? La documentación que rodea a las cuentas y la sincronización es algo poco clara por decir lo menos.

Estoy recibiendo este comportamiento en el emulador 2.1, compilar contra el SDK 2.1.

He encontrado que contentResolver.requestSync() nunca disparará su SyncAdapter.onPerformSync () a menos que llame a ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1); .

Para una cuenta detallada de la solución que fui con SyncAdapter, vea mi respuesta aquí:

https://stackoverflow.com/a/12015967/988870

Acabo de golpear mi cabeza contra una pared durante horas tratando de averiguar por qué la sincronización periódica no estaba funcionando. Resulta que la frecuencia de la encuesta debe ser en segundos (literal) no milisegundos, y no segundos en milisegundos. Por ejemplo, si desea sincronizar cada minuto y medio, deberá llamar a:

  ContentResolver.addPeriodicSync( account, authority, Bundle.EMPTY, 90 ); 

Además, el paquete pasado en no puede ser nulo como está en la documentación, se lanzará una excepción NullPointerException.

  • sincronización del tiempo del emulador androide
  • Una solución en la nube para sincronizar la base de datos de aplicaciones en Android
  • Sincronizar dispositivos Android a través de la hora GPS?
  • ¿Cómo acceder a un contexto de aplicación ya en ejecución desde un servicio de adaptador de sincronización en Android?
  • Sincronizar la hora del sistema en 2 teléfonos
  • Evitar que el servicio de fondo se destruya debido a "detectar una CPU excesiva en un proceso bifurcado"
  • Cómo compartir un objeto entre dos subprocesos (sincronización de subprocesos)?
  • Android Gradle Error: "Error al obtener el ID de la aplicación para depurar"
  • ¿Cómo sincronizar la base de datos SQLite en el teléfono Android con la base de datos MySQL en el servidor?
  • Sincronizar varias ventanas con varias vistas en Android
  • Recuperación de llamada de Android SyncAdapter
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.