2017-09-05 63 views
0

如何注册用户打开和关闭我的应用程序?我想注册每个开幕式和每个闭幕式。注册开放和关闭android应用程序

例如onResume()的生命周期方法无效,因为该应用程序使用多个活动。

我找不到任何关于此的信息。

回答

1

来检查应用程序退出或运行最好的办法是这样的:

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

令人惊叹的代码!感谢您分享这个优雅的解决方案! – Waldi

+0

很高兴帮助你。 – Orvenito

0

应用程序类的onCreate方法只在应用程序启动时运行一次。也许扩展应用程序类并创建一些逻辑?

或者,如果您只是在第一个活动的onCreate方法中记录应用程序开放?

+0

谢谢!应用程序类的逻辑非常困难。这不是一个简单的解决方案。我很惊讶,Android没有给出一个简单的解决方案。例如在iOS中有两个委托方法。第二种解决方案的问题在于用户在另一个活动中离开我的应用程序并再次打开应用程序时,我的第一个活动onCreate()将不会调用。 Android中有没有解决方案来重新启动应用程序? – Waldi