2017-09-05 17 views
0

ユーザーが自分のアプリを開いて閉じるときに登録するにはどうしたらいいですか?私はすべてのオープニングとすべての閉会を登録したい。アンドロイドアプリの開封

たとえば、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

ありがとうございます!アプリケーションクラスのロジックは本当に難しいです。これは簡単な解決策ではありません。私はアンドロイドがそのための簡単な解決策を提供していないことに驚いています。たとえば、iOSの場合、2つのデリゲートメソッドがあります。あなたの2番目のソリューションの問題は、ユーザーが別のアクティビティで自分のアプリケーションを残して、再び最初のアクティビティonCreate()が呼び出されない場合です。すべてのオープニングでアプリケーションを再起動するためのアンドロイドのソリューションはありますか? – Waldi

関連する問題