2016-05-22 3 views
0

J'essaie de forcer mon application à effectuer une synchronisation toutes les secondes, ou toutes les 4 ou 5 secondes. Cependant, la période minimale que je peux faire pour synchroniser le syncadapter est de 30 à 60 secondes. Comment peut-on archiver un tel comportement?SyncAdapter - Comment effectuer une synchronisation périodique toutes les secondes

Peu importe ce que je définis dans le second paramètre de addPeriodicSync(), il ne sera pas inférieur à 30 secondes. ContentResolver.setMasterSyncAutomatically (true); ContentResolver.setIsSyncable (mAccount, AUTHORITY, 1);

ContentResolver.setSyncAutomatically(mAccount, AUTHORITY, true); 
    ContentResolver.addPeriodicSync(
      mAccount, 
      AUTHORITY, 
      Bundle.EMPTY, 
      4); 

Je sais que cela est un mauvais comportement pour une application car il videra la batterie, et que GCM aurait dû être utilisé pour créer des poussées à partir du serveur. L'application est pour une présentation de projet universitaire, donc je dois répondre et présentable.

Edit:

Je suis conscient de la possibilité de synchronisation manuelle :):

Merci à l'avance.

+0

Si vous avez besoin d'une telle réactivité, pourquoi ne pas utiliser Firebase? – EpicPandaForce

+0

Firebase est GCM https://developers.google.com/cloud-messaging/android/android-migrate-fcm Je l'ai déjà mentionné dans ma question. – user1868569

+0

Le système de base de données. – EpicPandaForce

Répondre

0

Je suppose simplement qu'un SyncAdapter ne peut pas être utilisé de cette manière, car il est spécifiquement conçu pour ne pas fonctionner de cette façon. Si vous avez besoin d'une application pour effectuer une synchronisation toutes les secondes, vous devez probablement implémenter un IntentService qui se redémarre avec une intention retardée (où vous pouvez définir le délai à 1 seconde), et faire la synchronisation ici, plutôt que dans un SyncAdapter.

EDIT: Voici un exemple d'implémentation, ne l'utilisez pas pour autre chose qu'une démonstration, je me sens un peu sale pour l'écrire.

public class ContinuousSyncService extends IntentService { 

    private static final int DELAY = 1000; // ms 

    public ContinuousSyncService() { 
     super(ContinuousSyncService.class.getName()); 
    } 

    public static PendingIntent getPendingIntent(@NonNull Context context) { 
     Intent intent = new Intent(context, ContinuousSyncService.class); 
     return PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    } 

    private void scheduleNextStart(long delay) { 
     ((AlarmManager) getSystemService(Context.ALARM_SERVICE)).set(
       AlarmManager.ELAPSED_REALTIME, 
       SystemClock.elapsedRealtime() + delay, 
       getPendingIntent(this)); 
    } 

    @Override 
    protected void onHandleIntent(final Intent intent) { 
     sync(); 
     scheduleNextStart(DELAY); 
    } 

    private void sync() { 
     // Either use ContentResolver.requestSync() 
     // Or just put the code from your SyncAdapter.onPerformSync() here 
    } 

} 
+0

Pourriez-vous donner un exemple de cela archivé? :) – user1868569

+0

@ user1868569 Ajout de l'exemple d'implémentation. – Thorbear

0

Vous ne pouvez pas planifier une synchronisation à des intervalles inférieurs à 60 secondes.

Vous pouvez confirmer en lisant le code, ou en examinant ce SO answer

0

Je l'ai fait de cette façon:

Ajouter la permission <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" /> dans le fichier Manifest.

AJOUTZ méthode pour la synchronisation:

public void syncAllAccountsPeriodically(Context contextAct, long seconds) throws Exception { 
    AccountManager manager = AccountManager.get(contextAct); 
    Account[] accounts = manager.getAccountsByType("com.google"); 
    String accountName = ""; 
    String accountType = ""; 
    for (Account account : accounts) { 
     accountName = account.name; 
     accountType = account.type; 
     break; 
    } 

    Account a = new Account(accountName, accountType); 
    ContentResolver.addPeriodicSync(a, AUTHORITY, 
     Bundle.EMPTY, seconds*1000); 
} 

Hope this devrait vous aider.