2017-09-05 4 views
0

Wie kann ich mich registrieren, wenn der Benutzer meine App öffnet und schließt? Ich möchte jede Öffnung und jedes Schließen registrieren.Eröffnen und Schließen Android App

Lebenszyklusmethoden wie onResume() sind nicht effektiv, da die App mehrere Aktivitäten verwendet.

Ich kann nichts darüber finden.

Antwort

1

der beste Weg, um zu überprüfen, ob der App verlassen wird oder laufen ist wie folgt:

public class MyApplication extends Application { 

public static final String LOG_TAG = "MyApp"; 

public boolean wasInBackground = true; 

private AppSession appSession; 
private Timer mActivityTransitionTimer; 
private TimerTask mActivityTransitionTimerTask; 
private final long MAX_ACTIVITY_TRANSITION_TIME_MS = 2000; // Time allowed for transitions 

Application.ActivityLifecycleCallbacks activityCallbacks = new Application.ActivityLifecycleCallbacks() { 

    @Override 
    public void onActivityResumed(Activity activity) { 

     if (wasInBackground) { 
      //Do app-wide came-here-from-background code 
      appEntered(); 
     } 
     stopActivityTransitionTimer(); 
    } 

    @Override 
    public void onActivityPaused(Activity activity) { 
     startActivityTransitionTimer(); 
    } 

    ... 

}; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    registerActivityLifecycleCallbacks(activityCallbacks); 
} 

public void startActivityTransitionTimer() { 
    this.mActivityTransitionTimer = new Timer(); 
    this.mActivityTransitionTimerTask = new TimerTask() { 
     public void run() { 
      // Task is run when app is exited 
      wasInBackground = true; 
      appExited(); 
     } 
    }; 

    this.mActivityTransitionTimer.schedule(mActivityTransitionTimerTask, 
      MAX_ACTIVITY_TRANSITION_TIME_MS); 
} 

public void stopActivityTransitionTimer() { 
    if (this.mActivityTransitionTimerTask != null) { 
     this.mActivityTransitionTimerTask.cancel(); 
    } 

    if (this.mActivityTransitionTimer != null) { 
     this.mActivityTransitionTimer.cancel(); 
    } 

    this.wasInBackground = false; 
} 

private void appEntered() { 
    Log.i(LOG_TAG, "APP ENTERED"); 

    appSession = new AppSession(); 
} 

private void appExited() { 
    Log.i(LOG_TAG, "APP EXITED"); 

    appSession.finishAppSession(); 

    // Submit AppSession to server 
    submitAppSession(appSession); 
    long sessionLength = (appSession.getT_close() - appSession.getT_open())/1000L; 
    Log.i(LOG_TAG, "Session Length: " + sessionLength); 
} 
+0

Toller Code! Danke, dass Sie diese elegante Lösung teilen! – Waldi

+0

froh, Ihnen zu helfen. – Orvenito

0

Die onCreate-Methode für die Anwendungsklasse wird nur einmal ausgeführt, wenn die Anwendung gestartet wird. Vielleicht erweitern Sie die Anwendungsklasse und erstellen Sie eine Logik?

Oder wenn Sie nur die Anwendungseröffnung in der onCreate-Methode Ihrer ersten Aktivität aufzeichnen?

+0

Thank you! Eine Logik für die Anwendungsklasse ist wirklich schwierig. Es wäre keine einfache Lösung. Ich bin erstaunt, dass Android keine einfache Lösung dafür bietet. Zum Beispiel gibt es in iOS zwei Delegate-Methoden dafür. Das Problem bei Ihrer zweiten Lösung ist, wenn der Benutzer meine App in einer anderen Aktivität verlässt und die App erneut öffnet, wird meine erste Aktivität onCreate() nicht aufrufen. Gibt es eine Lösung in Android, um die Anwendung bei jedem Öffnen neu zu starten? – Waldi

Verwandte Themen