Meine Version des 'klassischen Ablaufs' mit AccountManager:
Ich benutze meine AuthenticatorActivity sowohl für den normalen Fall, in dem es verwendet wird. Konten & amp; Synchronisierungseinstellungen, aber ich öffne es auch zur Verwendung durch Anwendungen, die auf dieselben Konten angewiesen sind. Ich habe eine separate apk mit dem Authenticator implementiert und andere apps (separate apks), die auf diesen Konten beruhen.
Behandelte Fälle:
der Normalfall: Der Benutzer fügt hinzu / authentifiziert über. Konten & amp; Synchronisieren (gemäß dem Android-Beispielprojekt)
verarbeitet Authentifizierungsanforderungen von externen Apps: Wie? Ich stelle einen Intent-Filter im Manifest der Authenticator-App bereit, damit andere Apps die AuthenticatorActivity über die Instanz instanziieren können. startActivityForResult (sie müssen eine zusätzliche Absicht enthalten, die angibt, wer sie sind (das Paket ihrer App)). In der AuthenticatorActivity erkenne ich diesen Fall und lasse setCcountAuthenticatorResult nicht aufrufen, wenn der Authentifizierungsprozess zu Ende ist, weil ich ihn für den obigen Normalfall reserviert habe. Der Benutzer gibt seine Anmeldeinformationen ein und drückt "Anmelden": "AccountManger" wird auf ein übereinstimmendes Konto geprüft Behalte den Nutzernamen des Accounts als aktiven Nutzer für das Paket der anrufenden App. Ich übergebe dann eine Absicht an die anrufende App. setResult gibt den Erfolg, den Benutzernamen und den Kontotyp an. In dem Fall, in dem das Konto nicht existierte, gehe ich durch den Prozess, den der normale Fall durchläuft, d. H. Rufe addAccountExplicitely auf und setze dann den aktiven Benutzer und dann wie zuvor setResult aufrufen und beenden.
Hoffe das hilft jemandem.
Der AccountManager soll nicht von einer interaktiven Anwendung, sondern von einem Sync-Adapter aufgerufen werden. (Ein tolles Tutorial ist "Hast du schon gewonnen?" Einen Android Sync Provider schreiben " Teil 1 und Teil 2 , die großartige Codebeispiele liefert, aber den Datenfluss nicht so gut erklärt.) Es ist so:
Sie entwickeln einen ContentProvider, der eine Datenbank umschließt. Sie erstellen ein SyncAdapter (dies ist ein Hintergrunddienst), um eine Verbindung zu einem Server herzustellen und Daten abzurufen und den ContentProvider so zu synchronisieren, dass er mit dem Server übereinstimmt. Anschließend fragt Ihre Benutzeroberfläche den ContentProvider ab, um die abgerufenen Daten anzuzeigen. Es gibt einige Methoden, um direkt nach bestimmten Informationen zu suchen, wenn Sie beispielsweise Ergebnisse suchen und zwischenspeichern möchten. Sehen Sie RESTful Android Apps entwickeln für eine schöne, einstündige Sitzung wie das Datenmodell aussehen soll. Sie geben drei Architekturbeispiele, beginnend mit einer "naiven" Implementierung, bis hin zum richtigen SyncAdapter-Modell.
Wie bei der Authentifizierung selbst verwendet SyncAdapter den AccountManager, um ein Authentifizierungstoken zu erhalten. Dies ist ein (oft) großer Hexadezimalwert, der als Teil der HTML-Header anstelle eines Username / Passwort-Paares übergeben wird. Betrachten Sie es als einmaligen Schlüssel für eine Sitzung. Die Passion des Schlüssels ist der Nachweis der Authentifizierung und sie verfallen periodisch. Wenn sie ablaufen, authentifizieren Sie sich erneut und holen Sie eine neue. SyncAdapater fragt AccountManager nach einem Authentifizierungs-Token für eine bestimmte Account-Typ / Benutzername-Kombination. AccountManager authentifiziert sich mit dem Server (fragt den Benutzer bei Bedarf nach einem neuen Passwort aufgrund von Änderungen) und gibt das Token an den SyncAdapter zurück, der es von da an verwendet.
Wenn dieses Modell nicht für Ihre Anwendung geeignet ist, müssen Sie die Anmeldung / Abmeldung stattdessen manuell in Ihrem App-Code vornehmen. Eine Art Schmerz, ich weiß.
@jcwenger Das ist nicht ganz richtig. Sie können das Accounts & Sync
auch von einer interaktiven Anwendung verwenden. Sie können beispielsweise Konten hinzufügen, ohne die Benutzeroberfläche des Account Managers aufzurufen, indem Sie die AccountAuthenticatorActivity
-Methode von AccountManager
verwenden.
Auf der "Hast du schon gewonnen?" Artikel Sie können deutlich sehen, dass der Account-Manager von der eigenen finish()
der Anwendung aufgerufen wird. Dies ist nützlich, wenn die Anwendung über eine eigene Kontoverwaltungsschnittstelle verfügt.
Der AccountManager soll nicht von einer interaktiven Anwendung, sondern von einem Sync-Adapter aufgerufen werden. (Ein tolles Tutorial ist "Hast du schon gewonnen?" Einen Android Sync Provider schreiben " Teil 1 und Teil 2 , die großartige Codebeispiele liefert, aber den Datenfluss nicht so gut erklärt.) Es ist so:
Sie entwickeln einen ContentProvider, der eine Datenbank umschließt. Sie erstellen ein SyncAdapter (dies ist ein Hintergrunddienst), um eine Verbindung zu einem Server herzustellen und Daten abzurufen und den ContentProvider so zu synchronisieren, dass er mit dem Server übereinstimmt. Anschließend fragt Ihre Benutzeroberfläche den ContentProvider ab, um die abgerufenen Daten anzuzeigen. Es gibt einige Methoden, um direkt nach bestimmten Informationen zu suchen, wenn Sie beispielsweise Ergebnisse suchen und zwischenspeichern möchten. Sehen Sie RESTful Android Apps entwickeln für eine schöne, einstündige Sitzung wie das Datenmodell aussehen soll. Sie geben drei Architekturbeispiele, beginnend mit einer "naiven" Implementierung, bis hin zum richtigen SyncAdapter-Modell.
Wie bei der Authentifizierung selbst verwendet SyncAdapter den AccountManager, um ein Authentifizierungstoken zu erhalten. Dies ist ein (oft) großer Hexadezimalwert, der als Teil der HTML-Header anstelle eines Username / Passwort-Paares übergeben wird. Betrachten Sie es als einmaligen Schlüssel für eine Sitzung. Die Passion des Schlüssels ist der Nachweis der Authentifizierung und sie verfallen periodisch. Wenn sie ablaufen, authentifizieren Sie sich erneut und holen Sie eine neue. SyncAdapater fragt AccountManager nach einem Authentifizierungs-Token für eine bestimmte Account-Typ / Benutzername-Kombination. AccountManager authentifiziert sich mit dem Server (fragt den Benutzer bei Bedarf nach einem neuen Passwort aufgrund von Änderungen) und gibt das Token an den SyncAdapter zurück, der es von da an verwendet.
Wenn dieses Modell nicht für Ihre Anwendung geeignet ist, müssen Sie die Anmeldung / Abmeldung stattdessen manuell in Ihrem App-Code vornehmen. Eine Art Schmerz, ich weiß.
@jcwenger Das ist nicht ganz richtig. Sie können das AccountManager
auch von einer interaktiven Anwendung verwenden. Sie können beispielsweise Konten hinzufügen, ohne die Benutzeroberfläche des Account Managers aufzurufen, indem Sie die AccountManager
-Methode von addAccountExplicitly()
verwenden.
Auf der "Hast du schon gewonnen?" Artikel Sie können deutlich sehen, dass der Account-Manager von der eigenen Activity
der Anwendung aufgerufen wird. Dies ist nützlich, wenn die Anwendung über eine eigene Kontoverwaltungsschnittstelle verfügt.
Meine Version des 'klassischen Ablaufs' mit AccountManager:
Ich benutze meine AuthenticatorActivity sowohl für den normalen Fall, in dem es verwendet wird. Konten & amp; Synchronisierungseinstellungen, aber ich öffne es auch zur Verwendung durch Anwendungen, die auf dieselben Konten angewiesen sind. Ich habe eine separate apk mit dem Authenticator implementiert und andere apps (separate apks), die auf diesen Konten beruhen.
Behandelte Fälle:
der Normalfall: Der Benutzer fügt hinzu / authentifiziert über. Konten & amp; Synchronisieren (gemäß dem Android-Beispielprojekt)
verarbeitet Authentifizierungsanforderungen von externen Apps: Wie? Ich stelle einen Intent-Filter im Manifest der Authenticator-App bereit, damit andere Apps die AuthenticatorActivity über die Instanz instanziieren können. startActivityForResult (sie müssen eine zusätzliche Absicht enthalten, die angibt, wer sie sind (das Paket ihrer App)). In der AuthenticatorActivity erkenne ich diesen Fall und lasse setCcountAuthenticatorResult nicht aufrufen, wenn der Authentifizierungsprozess zu Ende ist, weil ich ihn für den obigen Normalfall reserviert habe. Der Benutzer gibt seine Anmeldeinformationen ein und drückt "Anmelden": "AccountManger" wird auf ein übereinstimmendes Konto geprüft Behalte den Nutzernamen des Accounts als aktiven Nutzer für das Paket der anrufenden App. Ich übergebe dann eine Absicht an die anrufende App. setResult gibt den Erfolg, den Benutzernamen und den Kontotyp an. In dem Fall, in dem das Konto nicht existierte, gehe ich durch den Prozess, den der normale Fall durchläuft, d. H. Rufe addAccountExplicitely auf und setze dann den aktiven Benutzer und dann wie zuvor setResult aufrufen und beenden.
Hoffe das hilft jemandem.
Tags und Links android accountmanager