2016-05-22 58 views
0

Ich versuche, meine Anwendung zu zwingen, eine Synchronisierung jede Sekunde oder nur alle 4 oder 5 Sekunden durchzuführen. Die Mindestdauer, um den Syncadapter synchronisieren zu können, beträgt jedoch 30-60 Sekunden. Wie kann ein solches Verhalten archiviert werden?SyncAdapter - Wie man jede Sekunde periodisch synchronisiert

Egal was ich den zweiten Parameter in addPeriodicSync() setze, es wird nicht unter 30 Sekunden sein. ContentResolver.setMasterSyncAutomatisch (true); ContentResolver.setIsSyncable (mAccount, AUTHORITY, 1);

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

Ich bin mir bewusst, dass dies ein schlechtes Verhalten für eine Anwendung ist, wie es sich die Batterie entladen wird, und dass GCM verwendet wurden, sollten Schübe von dem Server zu erstellen. Die Anwendung ist für eine Universität Projektpräsentation, so muss ich reagieren und vorzeigbar.

Edit:

Ich bin über die Möglichkeit der manuellen Synchronisierung :):

Vielen Dank im Voraus.

+0

Wenn Sie eine solche Reaktionsfähigkeit benötigen, warum nicht Firebase verwenden? – EpicPandaForce

+0

Firebase ist GCM https://developers.google.com/cloud-messaging/android/android-migrate-fcm Ich bereits in meiner Frage erwähnt. – user1868569

+0

Das Datenbanksystem. – EpicPandaForce

Antwort

0

Ich würde einfach davon ausgehen, dass ein SyncAdapter nicht auf diese Weise verwendet werden kann, da es speziell dafür entwickelt wurde, nicht so zu funktionieren.

Wenn Sie eine App benötigen, um jede Sekunde eine Synchronisierung durchzuführen, sollten Sie wahrscheinlich nur einen IntentService implementieren, der sich mit einer verzögerten Absicht neu startet (wobei Sie die Verzögerung auf 1 Sekunde einstellen können) und die Synchronisierung dort durchführen in einem SyncAdapter.

EDIT: Hier ist eine Beispielimplementierung, bitte verwenden Sie dies eigentlich für nichts als eine Demonstration, aber ich fühle mich ein wenig schmutzig für das Schreiben.

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

Könnten Sie ein Beispiel geben, das archiviert wird? :) – user1868569

+0

@ user1868569 Probe Implementierung hinzugefügt. – Thorbear

0

Sie können keine Synchronisierung in Intervallen unter 60 Sekunden planen.

Sie können dies bestätigen, indem Sie den Code zu lesen, oder mit diesem SO answer

0

bewerten den ich auf diese Weise getan haben:

hinzufügen Erlaubnis <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" /> in Manifest-Datei.

unten Methode für Sync hinzufügen:

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 Sie helfen sollte.