2013-10-02 22 views
10

Tôi có một ứng dụng theo dõi hoạt động của người dùng trên ứng dụng bao gồm thời gian, v.v. Nếu người dùng đã mở ứng dụng, ứng dụng sẽ bắt đầu phiên và cho đến khi người dùng trong ứng dụng này, phiên của anh ấy sẽ tiếp tục có thể chuyển sang nhiều hoạt động. Bây giờ khi đó ông chuyển sang ứng dụng khác, khai thác gỗ phiên ông nên dừng lại và viết ra để nộpSự kiện bắt đầu và kết thúc ứng dụng Android

Những gì tôi cố gắng

Tôi tạo ra một hoạt động cơ sở và Mở sự kiện resume nếu bộ đếm là số không, tôi bắt đầu phiên và tăng số lượt truy cập và Khi sự kiện dừng, số lượt truy cập giảm và số lượt truy cập bằng 0, tôi dừng phiên

Nhưng điều này sẽ không tính toán sự cố theo dõi thực sự khi Android không ngừng hoạt động khi người dùng chuyển sang ứng dụng khác.

Vì vậy, có cách nào để đạt được điều đó.

bổ sung:

Nếu chúng ta có thể nhận được cho dù hoạt động ứng dụng đang hoạt động trên màn hình để sự kiện có thể được sử dụng để bắt đầu hoặc phiên cuối.

Trả lời

0

Bạn cần xem xét Vòng đời hoạt động trên Android.

gì bạn cần là - xem tài liệu here

Tôi cũng muốn nhắc tới điều onPause là bắn ngay cả khi chuyển đổi giữa nhiều hoạt động, vì vậy bạn sẽ cần phải theo dõi khi nó ngừng lại để đi đến màn hình khác.

+0

do đó, sử dụng onPause sẽ không cung cấp thông tin ứng dụng về việc chuyển sang ứng dụng khác hay hoạt động khác ... – Kasma

+0

Không, đây chỉ là một phần hoạt động của hoạt động, hoạt động khi hoạt động không còn tập trung. Điều này xảy ra khi người dùng chuyển sang ứng dụng khác, ứng dụng khác lấy tiêu điểm trước (tôi nhận thấy điều này xảy ra nếu bạn thêm từ vào từ điển trên bàn phím) và ngay cả khi thiết bị bị khóa bởi người dùng hoặc thời gian chờ màn hình khóa thiết bị. – EvilGeniusJamie

+0

nhưng cách theo dõi xem nó có hoạt động khác không ... – Kasma

5

tôi có thể nghĩ đến hai cách để làm điều đó:

Lựa chọn 1:

Bạn có thể tạo một dịch vụ mà quét cho các ứng dụng hiện hành về tiền cảnh và xem nếu nó là hoạt động của bạn. Dưới đây là một số mã bạn có thể sử dụng, tôi lấy nó từ một câu trả lời khác:

Có một cách dễ dàng để nhận danh sách các tác vụ đang chạy từ dịch vụ ActivityManager. Bạn có thể yêu cầu số lượng tác vụ tối đa chạy trên điện thoại và theo mặc định, tác vụ hiện đang hoạt động là được trả lại trước tiên.

Khi bạn có điều đó, bạn có thể nhận đối tượng ComponentName bằng cách yêu cầu tính năng hàng đầu từ danh sách của bạn.

Đây là một ví dụ.

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(); 

Bạn sẽ cần sự cho phép sau trên biểu hiện của bạn:

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

Liên kết với các câu trả lời: Android: How can I get the current foreground activity (from a service)?

Bạn có thể gọi đây là mỗi một giây hoặc ít hơn để phát hiện nếu ứng dụng của bạn vẫn hoạt động.Xin lưu ý rằng nó là một phản đối và không được khuyến khích sử dụng cho các loại của sự vật, theo tài liệu chính thức:

getRunningTasks()

Lưu ý: phương pháp này chỉ được thiết kế để gỡ lỗi và trình bày nhiệm vụ quản lý giao diện người dùng. Điều này sẽ không bao giờ được sử dụng cho logic lõi trong một ứng dụng, chẳng hạn như quyết định giữa các hành vi khác nhau dựa trên về thông tin được tìm thấy tại đây. Việc sử dụng như vậy không được hỗ trợ và sẽ khả năng xảy ra trong tương lai. Ví dụ: nếu nhiều ứng dụng có thể hoạt động cùng một lúc, các giả định được thực hiện về nghĩa là ý nghĩa của dữ liệu tại đây cho mục đích kiểm soát sẽ là không chính xác.


Phương án 2:

Lựa chọn thứ hai là để tạo ra một lớp mà kéo dài Application với một lá cờ, ví dụ isAppRunning, mà sẽ là đúng hay sai theo nếu ứng dụng của bạn là trên tiền cảnh hay không:

public class MyAppContext extends Application { 

    public boolean isAppRunning = true; 

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

    public boolean isAppRunning(){ 
     return isAppRunning; 
    } 

} 

Sau đó, trên AndroidManifest.xml bạn phải thêm lớp này để nó sẽ được sử dụng khi ứng dụng của bạn ation bắt đầu. Chỉ cần thêm android:name=".MyAppContext" dưới thẻ ứng dụng:

<application 
     android:name=".MyAppContext" 

Bây giờ trong mỗi hoạt động mà bạn có, bạn nên ghi đè onResume()onPause() và đặt cờ với giá trị tương ứng:

class BaseActivity extends Activity { 


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

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

Trên đường này mỗi khi bạn bắt đầu Hoạt động giá trị của isAppRunning trong MyAppContext sẽ là true, khi bạn thoát khỏi Activity, nó sẽ là false nhưng nếu một Hoạt động khác mở ra (ví dụ: nếu bạn nhấn nút quay lại để quay trở lại hoạt động trước đó) giá trị sẽ ngay lập tức là true.

Khi bạn cuối cùng hoàn thành tất cả các hoạt động của bạn không có onResume() phương pháp này sẽ được gọi và tất cả các onPause() phương pháp này sẽ được gọi là như vậy isAppRunning sẽ false và bạn biết bạn Activity là không còn trên mặt trước.

Vì vậy, tiếp tục, nếu isAppRunningtrue, ứng dụng của bạn ở trên nền trước (bắt đầu theo dõi phiên) nếu không nó sẽ biến mất (dừng theo dõi phiên). Bạn có thể tạo một Timer trong MyAppContext lớp để kiểm tra giá trị của isAppRunning định kỳ, vì vậy nó sẽ là:

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() { ... }; 

} 

Bạn nên sửa đổi timerRate theo sự chính xác bạn muốn nhận được trong việc theo dõi phiên của bạn.

+0

Đây là API không dùng nữa và không luôn trả lại giá trị chính xác. Tôi buộc phải sử dụng nó trong ứng dụng của tôi và nó không hoạt động mọi lúc. Các tài liệu API đề cập rõ ràng điều đó. –

+0

Có, nhưng tôi không thể nghĩ ra bất cứ điều gì khác để theo dõi hoạt động. – Andres

2

Kéo dài tất cả Hoạt động của bạn từ BaseActivity như dưới đây. Đây là tùy chọn tốt nhất cho bạn như phương thức onPause và onResume được đảm bảo được gọi bất cứ khi nào Hoạt động của bạn hiển thị hoặc biến mất khỏi màn hình điện thoại.

class BaseActivity extends Activity { 


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

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

Đây là cách đơn giản nhất (và tốt nhất) để sử dụng và cũng là cách sử dụng được đề xuất cho hầu hết các API của bên thứ ba yêu cầu điều này (ví dụ: Flurry) –

0

1.Tạo một lớp có tên AppLifecycleTracker và dán.

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); 
      } 
     } 

* trong onActivityCreate nếu numOfCreated = 0, sau đó bạn có thể nói ứng dụng đã bắt đầu. * trong onActivityDestroyed nếu numOfCreated = 0, sau đó bạn có thể nói ứng dụng bị đóng.

  1. Tạo một lớp mở rộng ứng dụng, trong onCreate, thêm dòng này

    registerActivityLifecycleCallbacks (mới AppLifecycleTracker());

  2. tên ứng dụng được ấn định là lớp ứng dụng trong manifest.xml

Thats nó. Bạn tốt để đi.

Các vấn đề liên quan