Google Analytics in Android App – Umgang mit mehreren Aktivitäten

Ich war ziemlich aufgeregt zu sehen, wie einfach es ist, Google Analytics mit meiner App einzurichten, aber der Mangel an Dokumentation hat mich mit ein paar Fragen sitzen. Die einzige Information, die ich finden kann, ist direkt aus der Dokumentation hier , die nur auf Reporting PageViews und Events aus einer Aktivität aussieht. Ich möchte PageViews und Events über mehrere Aktivitäten in meiner App berichten.

Gerade jetzt im onCreate () aller meiner Tätigkeiten rufe ich an:

  • Wie fügt man Action Bar aus der Supportbibliothek in PreferenceActivity hinzu?
  • GCM-Registrierung mit zwei verschiedenen Arbeitsregistrierungen
  • Android Youtube API verfügbar?
  • Probleme beim Testen der APK-Erweiterungsbibliothek
  • Wie bekomme ich Root-Berechtigungen über das Android-SDK?
  • Implementieren von Simple SeekBar in Android
  • tracker = GoogleAnalyticsTracker.getInstance(); tracker.start("UA-xxxxxxxxx", this); 

    Und in der OnDestroy () aller meiner Aktivitäten:

      tracker.stop(); 

    Ich spiele dann PageViews und Events nach Bedarf und versende sie zusammen mit einer anderen HTTP-Anfrage, die ich durchführe. Aber ich bin nicht so sicher, dass dies der beste Weg ist. Soll ich in jeder Aktivität start () und stop () anrufen, oder soll ich nur start () und stop () in meiner Haupt-Launcher-Aktivität aufrufen?

  • Ist OpenGL auf Android ein Akku-Killer?
  • Android Center Text auf Leinwand
  • Handhabung von Klickereignissen auf einer Zeichenkette innerhalb eines EditText
  • Wie kann ich das Symbol im Alert-Dialog vor jedem Element hinzufügen?
  • Kompilieren der neuesten OpenSSL für Android
  • Android - Push-Benachrichtigung sind eingeschaltet?
  • 7 Solutions collect form web for “Google Analytics in Android App – Umgang mit mehreren Aktivitäten”

    Das Problem beim Aufruf von start () / stop () in jeder Aktivität (wie von Christian vorgeschlagen) ist, dass es zu einem neuen "Besuch" für jede Aktivität, die dein Benutzer navigiert, ergibt. Wenn dies für Ihre Nutzung in Ordnung ist, dann ist das gut, aber es ist nicht so, wie die meisten Leute Besuche erwarten, um zu arbeiten. Zum Beispiel würde dies den Vergleich von Android-Namen zu Web-oder iPhone-Nummern sehr schwierig, da ein "Besuch" im Web und iphone Karten zu einer Sitzung, nicht eine Seite / Aktivität.

    Das Problem beim Aufruf von start () / stop () in deiner Anwendung ist, dass es zu unerwartet langen Besuchen kommt, da Android keine Garantien für die Beendigung der Anwendung nach Abschluss der letzten Aktivität macht. Darüber hinaus, wenn Ihre App alles mit Benachrichtigungen oder Dienstleistungen, diese Hintergrund-Aufgaben können Sie Ihre App und Ergebnis in "Phantom" Besuche. UPDATE: Stefano weist richtig darauf hin, dass onTerminate () niemals ein echtes Gerät angerufen wird, also gibt es keinen offensichtlichen Platz, um den Anruf zu stoppen ().

    Das Problem beim Aufruf von start () / stop () in einer einzigen "main" -Aktivität (wie von Aurora vorgeschlagen) ist, dass es keine Garantie dafür gibt, dass die Aktivität für die Dauer, die dein Benutzer mit deiner App verwendet, Wenn die "Haupt" -Aktivität zerstört wird (sagen, um Speicher zu befreien), werden Ihre nachfolgenden Versuche, Ereignisse an GA in anderen Aktivitäten zu schreiben, fehlschlagen, weil die Sitzung gestoppt wurde.

    Darüber hinaus gibt es einen Bug in Google Analytics bis mindestens Version 1.2, die es bewirkt, dass es einen starken Verweis auf den Kontext, den Sie passieren, um zu starten (), zu verhindern, dass es immer jemals Müll gesammelt, nachdem seine zerstört. Abhängig von der Größe Ihres Kontextes kann dies ein beträchtlicher Speicherverlust sein.

    Der Speicherleck ist einfach genug, um zu reparieren, es kann durch Aufruf von start () mit der Anwendung anstelle der Aktivitätsinstanz selbst gelöst werden. Die Dokumente sollten wahrscheinlich aktualisiert werden, um dies zu reflektieren.

    z.B. Von innen Ihre Tätigkeit:

     // Start the tracker in manual dispatch mode... tracker.start("UA-YOUR-ACCOUNT-HERE", getApplication() ); 

    Anstatt von

     // Start the tracker in manual dispatch mode... tracker.start("UA-YOUR-ACCOUNT-HERE", this ); // BAD 

    Wenn du start () / stop () anrufst, kannst du eine Art manuelle Referenzzählung implementieren, die einen Zählwert für jeden Aufruf zu Activity.onCreate () erhöht und für jedes onDestroy () dekrementiert und dann GoogleAnalyticsTracker.stop () aufruft Der Zähler erreicht Null.

    Die neue EasyTracker- Bibliothek von Google wird sich darum kümmern.

    Alternativ können Sie, wenn Sie die EasyTracker-Aktivitäten nicht subklassen können, diese manuell selbst in Ihrer eigenen Basisklasse implementieren:

     public abstract class GoogleAnalyticsActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Need to do this for every activity that uses google analytics GoogleAnalyticsSessionManager.getInstance(getApplication()).incrementActivityCount(); } @Override protected void onResume() { super.onResume(); // Example of how to track a pageview event GoogleAnalyticsTracker.getInstance().trackPageView(getClass().getSimpleName()); } @Override protected void onDestroy() { super.onDestroy(); // Purge analytics so they don't hold references to this activity GoogleAnalyticsTracker.getInstance().dispatch(); // Need to do this for every activity that uses google analytics GoogleAnalyticsSessionManager.getInstance().decrementActivityCount(); } } public class GoogleAnalyticsSessionManager { protected static GoogleAnalyticsSessionManager INSTANCE; protected int activityCount = 0; protected Integer dispatchIntervalSecs; protected String apiKey; protected Context context; /** * NOTE: you should use your Application context, not your Activity context, in order to avoid memory leaks. */ protected GoogleAnalyticsSessionManager( String apiKey, Application context ) { this.apiKey = apiKey; this.context = context; } /** * NOTE: you should use your Application context, not your Activity context, in order to avoid memory leaks. */ protected GoogleAnalyticsSessionManager( String apiKey, int dispatchIntervalSecs, Application context ) { this.apiKey = apiKey; this.dispatchIntervalSecs = dispatchIntervalSecs; this.context = context; } /** * This should be called once in onCreate() for each of your activities that use GoogleAnalytics. * These methods are not synchronized and don't generally need to be, so if you want to do anything * unusual you should synchronize them yourself. */ public void incrementActivityCount() { if( activityCount==0 ) if( dispatchIntervalSecs==null ) GoogleAnalyticsTracker.getInstance().start(apiKey,context); else GoogleAnalyticsTracker.getInstance().start(apiKey,dispatchIntervalSecs,context); ++activityCount; } /** * This should be called once in onDestrkg() for each of your activities that use GoogleAnalytics. * These methods are not synchronized and don't generally need to be, so if you want to do anything * unusual you should synchronize them yourself. */ public void decrementActivityCount() { activityCount = Math.max(activityCount-1, 0); if( activityCount==0 ) GoogleAnalyticsTracker.getInstance().stop(); } /** * Get or create an instance of GoogleAnalyticsSessionManager */ public static GoogleAnalyticsSessionManager getInstance( Application application ) { if( INSTANCE == null ) INSTANCE = new GoogleAnalyticsSessionManager( ... ,application); return INSTANCE; } /** * Only call this if you're sure an instance has been previously created using #getInstance(Application) */ public static GoogleAnalyticsSessionManager getInstance() { return INSTANCE; } } 

    Das SDK hat jetzt eine externe Bibliothek, die sich um all das kümmert. Es heißt EasyTracker. Sie können es einfach importieren und die bereitgestellte Aktivität oder ListActivity erweitern, eine String-Ressource mit Ihrem Code erstellen und fertig sind.

    Der Tracker wird nur die Aktivität verfolgen, wo es ausgeführt wird. Also, warum kommst du nicht eine Aktivität, die es jedes Mal auf onCreate :

     public class GAnalyticsActivity extends Activity{ public void onCreate(Bundle icicle){ super.onCreate(icile); tracker = GoogleAnalyticsTracker.getInstance(); tracker.start("UA-xxxxxxxxx", this); } // same for on destroy } 

    Dann verlängern Sie diese Klasse für jede Aktivität, die Sie verwenden:

     public class YourActivity extends GAnalyticsActivity{ public void onCreate(Bundle icicle){ super.onCreate(icile); // whatever you do here you can be sure // that the tracker has already been started } } 

    Der Ansatz, den ich benutze, ist, einen gebundenen Dienst zu benutzen (ich zufällig, der schon eins war, wurde also die Schaffung von zusätzlichen Kesselplatten-Code verschont.)

    Ein gebundener Dienst wird nur so lange dauern, wie es Aktivitäten gibt, die daran gebunden sind. Alle Aktivitäten in meiner App binden an diesen Service, also dauert es nur so lange, wie der Benutzer aktiv meine Anwendung benutzt – also sehr viel eine echte 'Session'.

    Ich beginne den Tracker mit einer Singleton-Instanz der Applikation, die ich erweitert habe und eine statische Methode getInstance () hinzugefügt habe, um die Instanz abzurufen:

     // Non-relevant code removed public IBinder onBind(Intent intent) { tracker = GoogleAnalyticsTracker.getInstance(); tracker.startNewSession(PROPERTY_ID, MyApp.getInstance()); } public boolean onUnbind(Intent intent) { tracker.stopSession(); } 

    Siehe: http://developer.android.com/guide/topics/fundamentals/bound-services.html

    Ich habe eine Zeitbasis zwischen den Besuchen in meiner App gespielt und arbeite so:

    Ich habe ein Wrapper Singleton Tracker Objekt für die GoogleAnalyticsTracker, wo ich das letzte Mal, was etwas verfolgt wurde. Wenn diese Zeit mehr als x Sekunden ist, behandle ich es als einen neuen Besuch.

    Natürlich ist das nur sinnvoll, wenn du alles in deiner App verfolgst und vielleicht nicht die beste Lösung in jeder Situation bist, funktioniert gut für meine App.

    Es unterstützt nur trackPageView, aber setCustomVar und trackEvent sollte einfach implementiert werden ..

    Überall, wo du etwas verfolgen musst, füge einfach noch die Zeile hinzu:

      Tracker.getInstance(getApplicationContext()).trackPageView("/HelloPage"); 

    Ich tue es normalerweise im onResume einer Aktivität

    Verfolger

    Du brauchst so etwas wie: http://mufumbo.wordpress.com/2011/06/13/google-analytics-lags-on-android-how-to-make-it-responsive/

    Das ist auf der vorherigen Version und verwendet, um sehr gut zu arbeiten. Jetzt bin ich im selben Kampf wie du, wie V2 scheint nicht sehr konsequent zu sein.

    Ich frage mich, ob das etwas mit AOP gemacht werden könnte.

    Android kann nur Compile-Time AOP Methoden so vielleicht etwas wie AspectJ?

    Es gibt ein wenig mehr Infos über die Verwendung von AspectJ in Android in diesem Thread . Das Hauptproblem ist, dass Sie noch auf Klassen, die Sie besitzen, erklären müssen.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.