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()
và 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 isAppRunning
là true
, ứ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.
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
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
nhưng cách theo dõi xem nó có hoạt động khác không ... – Kasma