Wie benutzt man Google Plus Anmelden mit mehreren Aktivitäten?

Was wäre eine gute / empfohlene Art, den Google+ API-Client-Lebenszyklus mit dem Ablauf einer Multi-Activity-App zu verknüpfen? Machen Sie die Aktivitäten abhängig von der onConnected api Client-Methode, um ihre Funktionalität auszulösen, verwenden Sie es als einmalige nur "Aktivierung" Sache, oder vielleicht etwas ganz anderes?

Ich bin derzeit zu kämpfen, um zu verstehen, wie man richtig nutzen die Google+ anmelden in meiner Android-App, die mehr als eine Aktivität hat.

  • Falsche Android-Dokumentation über Layout-Aliase?
  • Warum kann ich nicht einen AVD von Eclipse mit 1024 MB RAM starten?
  • Erstellen Sie "Battery Usage" Intent Android
  • Wie kann ich einen Schatten zur unteren Blattansicht hinzufügen?
  • Intellij IDEA formatiert XML mit Ausrichtungsattributen
  • CheckBoxPreference und Abhängigkeit
  • Die Idee ist, in einer ersten Phase das G + -Zeichen zu verwenden, um den Benutzer zu authentifizieren und in der Lage zu sein, ihre E-Mail zu bekommen, um Benachrichtigungen und Sachen zu senden. Irgendwann plane ich, andere Google-Funktionalität wie vielleicht Maps oder andere Google Play-Dienste zu rollen, also denke ich, dass es nützlich ist, es bereits zu implementieren.

    Allerdings verhält sich meine App nicht wie erwartet, und ich habe das Problem auf die Tatsache eingeengt, dass ich das G + -Zeichen im App-Zyklus noch nicht verstanden habe, wenn mehr als eine Aktivität vorhanden ist.

    Was ist der richtige oder empfohlene Weg, um diese Auth-Methode zu implementieren? Gibt es vielleicht ein Muster von Sorten, die mich in die richtige Richtung führen könnten?

    Zum Beispiel habe ich ein sehr einfaches Diagramm des Lebenszyklus des api-Clients gefunden , aber wie bezieht sich das auf den App-Flow?

    Anfänglich habe ich eine Login-Aktivität, wo ich das Zeichen in die Schaltfläche stecke. Nach dem Google-Guide kann ich mich anmelden, und wenn die onConnected-Methode aufgerufen wird, beginne ich die Home Activity (irgendwie wie das Dashboard oder Hauptbildschirm der App).

    Das funktioniert etwas. Zum Beispiel, was wäre ein guter Weg, um die onStart und onStop für jede Aktivität zu behandeln? Soll ich den api-Client jedesmal wieder für jede Aktivität neu verbinden und neu authentifizieren? Vielleicht ist es eine gute Idee, eine BaseActivity zu haben, um das alles zu implementieren.

    Ein anderes Problem ist, sollte ich das gleiche api-Client-Objekt verwenden und es irgendwie passieren, oder vielleicht speichern Sie es in der Base Activity-Klasse? Oder soll ich jedes Mal ein neues api-Client-Objekt erstellen und initialisieren?

    Wie wäre es mit der Verwendung der Login-Aktivität, um mit G + zu authentifizieren und dann einfach die E-Mail zu bekommen und sie in einer lokalen Datenbank zu speichern und den Benutzer als "authentifiziert" oder "aktiv" oder so zu markieren. Das würde mich daran hindern, sich jedes Mal neu zu authentifizieren, wenn die App geschlossen ist oder die Verbindung unterbrochen wird.

    Die App ist nicht wirklich mit G + Posting oder jede andere Funktionalität wie das. Idealerweise sollte es gut offline funktionieren und braucht nur eine Verbindung für Sachen wie die Erstauthentifizierung oder andere einmalige Dinge.

    Irgendwelche Vorschläge oder Zeiger in die richtige Richtung sind sehr geschätzt.

    Bearbeiten: Ich habe alle Führer und Tutorials gelesen, die ich finden konnte, das benutzt Google+, und jeder von ihnen adressiert dies aus einer einzigen Aktivitätsperspektive. Ich denke, das ist ein häufiges Problem, dass es von einem Muster oder zumindest eine allgemeine Richtlinie profitieren würde.

  • Wie komme ich von einem MySql Server zu einer Android App?
  • Eine richtige Möglichkeit, einen Dienst in Android Studio zu debuggen?
  • Wie kann ich Facebook-Tools lösen: replace = "android: theme"?
  • Android Studio 3.0 Kanarische 1: Kotlin-Tests oder Java-Tests, die sich auf Kotlin-Klassen beziehen, scheitern
  • Wie kann man die ViewPager-Seite auf eine pro Geste beschränken
  • Projekt hat keine project.properties Datei
  • 3 Solutions collect form web for “Wie benutzt man Google Plus Anmelden mit mehreren Aktivitäten?”

    Wiedervereinigung für jede Aktivität ist absolut in Ordnung. Im Großen und Ganzen gibt es 3 Wege, die ich von Menschen gesehen habe, die dies umsetzen:

    1. Implementieren Sie meistens in einer Basisaktivität, und haben die anderen das verlängern. Dies ist eine Verbindung / Trennung in jeder Aktivität, aber mit Code an nur einem Ort.
    2. Implementieren Sie die Verbindung / Trennung in einem Fragment und fügen Sie das in Aktivitäten ein, in denen auth benötigt wird. Dies ist hilfreich, wenn Sie bereits eine Basisaktivität haben, die Sie nicht erweitern können (zB einige Spiele-Fälle).
    3. Implementieren Sie einen Dienst zum Verbinden / Trennen. Dies kann eine Sendung oder ähnliches auslösen, wenn ein Anschreiben erforderlich ist.

    Alle diese Arbeiten, und ich habe sie alle in echten Welt Apps gesehen. Die wichtigste Sache zu erinnern ist, die 99% Logik zu trennen (Benutzer ist entweder signiert oder abgemeldet, und Sie werden darüber informiert) aus der relativ seltenen "Unterzeichnung in diesem Moment" Use-Case. So zum Beispiel könnten Sie onConnected / onConnection fehlgeschlagen feuern viel, aber meistens ignorieren Sie oder einfach nur ein bisschen auf den Zustand der Anwendung. Nur auf einem Bildschirm mit einem Login-Button benötigen Sie die Verbindung Ergebnis Auflösung und onActivityResult Zeug. Denken Sie an die Google Play Services-Verbindung als meist über die Frage nach dem Zustand des Benutzers, anstatt sie zu unterzeichnen, und Sie sollten gut sein.

    Ich stimme mit der Antwort von Ian Barber zu, aber um ein wenig weiter zu erklären, sollten Ihre Activity in zwei Typen berücksichtigt werden – Activity , die sich anmelden, und Activity , die sich anmelden müssen.

    Die meisten Activity s beschäftigen sich nicht mit der Authentifizierung des Benutzers und haben die gleiche Logik in Ihrer App. Sie erstellen einen GoogleApiClient , der mit dem auf dem Gerät ausgeführten Google Play- Dienstprozess verknüpft ist und den zwischengespeicherten onConnected() des Benutzers liest – returning onConnected() wenn der Benutzer angemeldet ist, und onConnectionFailed() falls nicht. Die meisten Ihrer Activity s möchten Ihren Anwendungsstatus zurücksetzen und Ihre LoginActivity starten, wenn der Benutzer nicht angemeldet wurde. Jede Activity sollte eine eigene Instanz von GoogleApiClient da es ein leichtes Objekt ist, das für den Zugriff auf den freigegebenen Status des Google Play verwendet wird Dienstleistungsprozess. Dieses Verhalten könnte beispielsweise in einer freigegebenen BaseActivity Klasse oder einer gemeinsamen SignInFragment Klasse SignInFragment , aber jede Instanz sollte eine eigene GoogleApiClient Instanz haben.

    Ihre LoginActivity muss jedoch anders umgesetzt werden. Es sollte auch einen GoogleApiClient erstellen, aber wenn es onConnected() empfängt, dass der Benutzer angemeldet ist, sollte er eine entsprechende Activity für den Benutzer starten und finish() . Wenn Ihre LoginActivity onConnectionFailed() empfängt, dass der Benutzer nicht angemeldet ist, sollten Sie versuchen, Probleme mit startResolutionForResult() zu startResolutionForResult() .

    0. TL, DR

    Für den ungeduldigen Codierer findet sich auf der GitHub eine Arbeitsversion der folgenden Implementierung.

    Nach dem Umschreiben des Login-Aktivitätscodes mehrmals in vielen verschiedenen Apps wurde die einfache (und nicht so elegante) Lösung als Google-API-Client als Application-Class-Objekt erstellt. Aber da der Verbindungsstatus den UX-Fluß beeinflusst, war ich bei diesem Ansatz niemals glücklich.

    Wenn wir unser Problem nur auf das Verbindungskonzept reduzieren, können wir bedenken:

    1. Es versteckt den Google API-Client.
    2. Es hat endliche Staaten.
    3. Es ist ein (eher) einzigartiges.
    4. Der aktuelle Zustand beeinflusst das Verhalten der App.

    1. Proxy-Muster

    Da die Connection den GoogleApiClient , werden die ConnectionCallbacks und OnConnectionFailedListener :

     @Override public void onConnected(Bundle hint) { changeState(State.OPENED); } @Override public void onConnectionSuspended(int cause) { changeState(State.CLOSED); connect(); } @Override public void onConnectionFailed(ConnectionResult result) { if (currentState.equals(State.CLOSED) && result.hasResolution()) { changeState(State.CREATED); connectionResult = result; } else { connect(); } } 

    Aktivitäten können mit der Connection-Klasse über die Methoden connect , disconnect und revoke , aber ihr Verhalten wird durch den aktuellen Zustand entschieden. Die folgenden Methoden werden von der Zustandsmaschine benötigt:

     protected void onSignIn() { if (!googleApiClient.isConnected() && !googleApiClient.isConnecting()) { googleApiClient.connect(); } } protected void onSignOut() { if (googleApiClient.isConnected()) { Plus.AccountApi.clearDefaultAccount(googleApiClient); googleApiClient.disconnect(); googleApiClient.connect(); changeState(State.CLOSED); } } protected void onSignUp() { Activity activity = activityWeakReference.get(); try { changeState(State.OPENING); connectionResult.startResolutionForResult(activity, REQUEST_CODE); } catch (IntentSender.SendIntentException e) { changeState(State.CREATED); googleApiClient.connect(); } } protected void onRevoke() { Plus.AccountApi.clearDefaultAccount(googleApiClient); Plus.AccountApi.revokeAccessAndDisconnect(googleApiClient); googleApiClient = googleApiClientBuilder.build(); googleApiClient.connect(); changeState(State.CLOSED); } 

    2. Staatliches Muster

    Dies ist ein Verhaltensmuster, das es einem Objekt erlaubt, sein Verhalten zu ändern, wenn sein interner Zustand sich ändert. Das Buch GoF Design Patterns beschreibt, wie eine TCP-Verbindung durch dieses Muster repräsentiert werden kann (was auch unser Fall ist).

    Ein Staat von einer Staatsmaschine sollte ein singleton , und das einfachste weg, es in Java zu tun, war, um Enum namens State wie folgt zu erstellen:

     public enum State { CREATED { @Override void connect(Connection connection) { connection.onSignUp(); } @Override void disconnect(Connection connection) { connection.onSignOut(); } }, OPENING {}, OPENED { @Override void disconnect(Connection connection) { connection.onSignOut(); } @Override void revoke(Connection connection) { connection.onRevoke(); } }, CLOSED { @Override void connect(Connection connection) { connection.onSignIn(); } }; void connect(Connection connection) {} void disconnect(Connection connection) {} void revoke(Connection connection) {} 

    Die Connection enthält den Kontext, dh den aktuellen Zustand, der definiert, wie sich die Connection connect , disconnect und revoke wird sich verhalten:

     public void connect() { currentState.connect(this); } public void disconnect() { currentState.disconnect(this); } public void revoke() { currentState.revoke(this); } private void changeState(State state) { currentState = state; setChanged(); notifyObservers(state); } 

    3. Singleton Muster

    Da es nicht notwendig ist, diese Klasse wiederholt neu zu erstellen, stellen wir sie als Singleton zur Verfügung:

     public static Connection getInstance(Activity activity) { if (null == sConnection) { sConnection = new Connection(activity); } return sConnection; } public void onActivityResult(int result) { if (result == Activity.RESULT_OK) { changeState(State.CREATED); } else { changeState(State.CLOSED); } onSignIn(); } private Connection(Activity activity) { activityWeakReference = new WeakReference<>(activity); googleApiClientBuilder = new GoogleApiClient .Builder(activity) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(Plus.API, Plus.PlusOptions.builder().build()) .addScope(new Scope("email")); googleApiClient = googleApiClientBuilder.build(); currentState = State.CLOSED; } 

    4. Beobachtbares Muster

    Die Connection erweitert Java Observable , so dass 1 oder mehr Aktivitäten die Zustandsänderungen beobachten können:

     @Override protected void onCreate(Bundle bundle) { connection = Connection.getInstance(this); connection.addObserver(this); } @Override protected void onStart() { connection.connect(); } @Override protected void onDestroy() { connection.deleteObserver(this); connection.disconnect(); } @Override protected void onActivityResult(int request, int result, Intent data) { if (Connection.REQUEST_CODE == request) { connection.onActivityResult(result); } } @Override public void update(Observable observable, Object data) { if (observable != connection) { return; } // Your presentation logic goes here... } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.