2013-10-02 78 views
10

我有一個應用程序,它跟蹤包括時間等應用程序的用戶活動,現在如果用戶已經打開應用程序,它將啓動一個會話,直到用戶在這個應用程序中,他的會話將繼續,可以切換到多個活動。現在,期間,他切換到另一個應用程序,他會記錄應停藥並寫下來到文件Android應用程序開始和結束事件

我試過

我創建了一個基本活動和 在恢復事件,如果計數器是零,我開始會話和增量計數器和 停止事件,我遞減計數器,如果計數器爲零,我停止會話

但是這不會計算實際的跟蹤問題,因爲android不會停止活動,因爲用戶切換到另一個應用程序。

那麼有什麼辦法可以實現這樣的事情。

附加:

如果我們能得到的應用程序活動是否是在屏幕上活躍使事件可以被用來啓動或結束會話。

回答

0

您需要查看Android上的Activity生命週期。

你需要的是 - 請參閱文檔here

我還要提到的onPause多個活動之間的切換,即使被激發,所以你需要跟蹤,當它停下來,去到另一個屏幕。

+0

所以使用onPause不會提供關於是否切換到另一個應用程序或其他活動的應用程序信息... – Kasma

+0

不,這只是活動工作方式的一部分,它在活動不再焦點時運行。這種情況發生在用戶切換到另一個應用程序時,另一個應用程序需要前景焦點(我注意到,如果您向鍵盤上的字典中添加單詞,會發生這種情況),甚至當設備被用戶鎖定時,或者屏幕超時會鎖定設備。 – EvilGeniusJamie

+0

但是如何跟蹤是否要進行其他活動...... – Kasma

5

我能想到的做這件事的方法有兩種:

選項1:

您可以創建一個掃描在前臺運行的應用程序的服務,看看它是否是你的活動。下面是一些代碼,你可以用,我把它從另一個答案:

有越來越運行從 ActivityManager服務任務列表的一個簡單的方法。您可以請求在手機上運行的最大數量的任務 ,默認情況下,當前活動的任務是 首先返回。

一旦你有了,你可以通過請求 列表中的topActivity來獲得ComponentName對象。

下面是一個例子。

ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); 

    // get the info from the currently running task 
    List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); 

    Log.d("topActivity", "CURRENT Activity ::" 
      + taskInfo.get(0).topActivity.getClassName()); 

    ComponentName componentInfo = taskInfo.get(0).topActivity; 
    componentInfo.getPackageName(); 

您將需要下列權限上您的清單:

<uses-permission android:name="android.permission.GET_TASKS"/> 

鏈接到了答案:Android: How can I get the current foreground activity (from a service)?

您可以致電此每隔一秒或更少,如果您的應用程序,以檢測仍然活躍。請注意,這是一個過時,不建議使用這樣的事情,根據官方文檔:

getRunningTasks()

注:此方法僅用於調試和展示任務 管理用戶界面。這不應該用於應用程序中的核心邏輯 ,例如根據此處找到的信息根據不同的行爲來決定 。這種用途不被支持,並且將來可能會破壞 。例如,如果多個應用程序可以同時主動運行,則出於控制流程的目的而對這些數據的含義所做的假設是 不正確。


選項2:

第二個選項是,如果應用程序是在創建一個類與一個標誌延伸Application,例如isAppRunning,這將是真或根據假前景或不:

public class MyAppContext extends Application { 

    public boolean isAppRunning = true; 

    public void setIsAppRunning(boolean v){ 
     isAppRunning = v; 
    } 

    public boolean isAppRunning(){ 
     return isAppRunning; 
    } 

} 

然後在你的AndroidManifest.xml你必須添加這個類,所以它的時候會使用你的應用程開始。在你有你應該重寫onResume()onPause()和標誌設置爲相應的值每一次活動

<application 
     android:name=".MyAppContext" 

現在:每次

class BaseActivity extends Activity { 


    @Override 
    protected void onResume() { 
     super.onResume(); 
     ((MyAppContext)getApplication()).setIsAppRunning(true); 
    } 

    @Override 
    protected void onPause() { 
     ((MyAppContext)getApplication()).setIsAppRunning(false); 
     super.onPause(); 
    } 
} 

在這種方式,您只需添加android:name=".MyAppContext"應用程序標記下開始一個活動isAppRunningMyAppContext的值將是true,當你退出Activity它將是false但是如果另一個活動打開(例如,如果你按下後退按鈕,所以你正在返回之前的活動),該值將立即再次變爲true

當你終於完成你所有的活動沒有任何的onResume()方法將被調用,所有onPause()方法將被調用,所以isAppRunningfalse,你知道你的Activity不再是前臺。

因此,恢復,如果isAppRunningtrue您的應用程序在前臺(開始會話跟蹤),否則它不見了(停止會話跟蹤)。您可以創建一個在MyAppContextTimer類定期檢查的isAppRunning值,因此這將是:

public class MyAppContext extends Application { 

    public boolean isAppRunning = true; 
    public final int timerRate = 500; // Execute timer task every 500mS 

    public void setIsAppRunning(boolean v){ 
     isAppRunning = v; 
    } 

    public boolean isAppRunning(){ 
     return isAppRunning; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Timer mTimer = new Timer(); 

     mTimer.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      if(isAppRunning) startSesionTracking(); 
      else stopSesionTracking(); 
     } 
     }, 0, REFRESH_TIME); 
    } 

    private void startSesionTracking() { ... }; 
    private void stopSesionTracking() { ... }; 

} 

你應該根據你想在你的會話跟蹤,以獲得精確修改timerRate

+0

這是一個棄用的API,並不總是返回正確的值。我被迫在我的應用程序中使用它,它不會一直工作。 API文檔清楚地提到了這一點。 –

+0

是的,但我想不出任何其他來跟蹤活動。 – Andres

2

從下面的BaseActivity擴展所有活動。這是您的最佳選擇,因爲onPause和onResume方法保證在您的活動顯示或遠離電話屏幕時被調用。

class BaseActivity extends Activity { 


    @Override 
    protected void onResume() { 
     super.onResume(); 
     // Start Logging 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     // End Logging 
    } 
} 
+0

這是最簡單的(也是最好的)方式,也是大多數需要此API的第三方API的推薦用法(例如Flurry) –

0

1.創建一個名爲AppLifecycleTracker的類並粘貼它。

private class AppLifecycleTracker implements ActivityLifecycleCallbacks { 
      private int numStarted = 0; 
      private String TAG = "AppLifecycleTracker"; 


      private int numOfCreated = 0; 

      @Override`enter code here` 
      public void onActivityCreated(Activity activity, Bundle bundle) { 
       if (numOfCreated == 0) { 
        Log.d(TAG, "onActivityCreated: app started"); 
       } 
       numOfCreated++; 
       Log.d(TAG, "onActivityCreated: " + numOfCreated); 
      } 

      @Override 
      public void onActivityStarted(Activity activity) { 
       if (numStarted == 0) { 
        // app went to foreground 
        Log.d(TAG, "onActivityStarted: foreground"); 

       } 
       numStarted++; 


      } 

      @Override 
      public void onActivityResumed(Activity activity) { 

      } 

      @Override 
      public void onActivityPaused(Activity activity) { 

      } 

      @Override 
      public void onActivityStopped(Activity activity) { 
       numStarted--; 
       if (numStarted == 0) { 
        // app went to background 
        Log.d(TAG, "onActivityStarted: background"); 

       } 
      } 

      @Override 
      public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { 

      } 

      @Override 
      public void onActivityDestroyed(Activity activity) { 
       numOfCreated--; 
       Log.d(TAG, "onActivityDestroyed: " + numOfCreated); 
      } 
     } 

*在onActivityCreate如果numOfCreated = 0,那麼你可以說應用程序已經開始。 *在onActivityDestroyed如果numOfCreated = 0,那麼你可以說應用程序已關閉。

  • 創建類延伸的應用,在的onCreate,添加此行

    registerActivityLifecycleCallbacks(新AppLifecycleTracker());

  • 組應用名稱作爲應用類的manifest.xml

  • 完蛋了。你已準備好出發。

    相關問題