2015-12-10 15 views
18

Tôi đang cố gắng xác định ứng dụng hiện đang hiển thị cho người dùng. Để làm như vậy, tôi sử dụng phương thức activityManager.getRunningAppProcesses().Nhận quy trình tiền cảnh (thực) bằng cách sử dụng activityManager.getRunningAppProcesses()

Tôi biết rằng phương pháp này không được hỗ trợ như tắt Android 5.1.1 - điều này là ổn.

Ban đầu nó hoạt động như sự quyến rũ, tôi đang lặp qua danh sách của RunningAppProcessInfos và kiểm tra mức độ quan trọng.

tl; dr Phương pháp chính xác để nhận quy trình tiền cảnh hiện tại và ngăn chặn các bài đăng sai là gì? Thứ tự của danh sách được thực hiện như thế nào - API nói rằng nó không được chỉ định. Có cách nào để đặt hàng chính xác không?

Những gì tôi đã làm:

Thật không may là danh sách được trả về bởi các ActivityManager là khác nhau trên mọi thiết bị. Một số thiết bị trả về nhiều infos với tầm quan trọng 100 (là FOREGROUND), ngay cả khi quá trình này hiện không hiển thị.

Điều này đã gây ra sự cố mà tôi đã gặp phải rất nhiều phản hồi tích cực. Ví dụ, tôi đã thử nghiệm nó với facebook và tạo ra một bánh mì nướng, mỗi khi facebook ở phía trước. Tôi đã chuyển sang Trang chủ, vì vậy trình khởi chạy của tôi cần có là quy trình nền trước. Đã 10 giây, sau đó, facebook xuất hiện với tầm quan trọng FOREGROUND trong danh sách một lần nữa (nó không mở cũng không nhìn thấy được) và tôi nhận được một kết quả dương tính giả.

Tôi nhận ra rằng một số thiết bị đặt hàng danh sách theo quy trình gần đây ở trên cùng. Vì vậy, tôi quyết định thử các phương pháp sau đây:

ActivityManager.RunningAppProcessInfo appProcess = appProcesses.get(0); 
     final String processName = appProcess.processName; 
     final String packageName = removeProcessSuffix(processName); 
     if (appProcess.importance == FOREGROUND || appProcess.importance == VISIBLE){ 
      //do something, like the toast 
     } 

Với appProcesses.get (0); Tôi chỉ kiểm tra yếu tố đầu tiên và lỗi đã biến mất. Không có kết quả dương tính giả nữa.

Nhưng, giờ đây trên một số thiết bị, tôi không còn nhận được tiến trình nền trước nữa. Bởi vì họ không yêu cầu danh sách theo bất kỳ cách nào. Ví dụ: 4.2 điện thoại thông minh Sony là một số ứng viên. Tôi nhận được danh sách, nhưng quá trình thực sự hiện có thể nhìn thấy là ở chỉ số 11 hoặc hơn.

Tôi không biết phải làm gì, để có được tiến trình nền trước hiện tại, không có kết quả dương tính giả.

Phương pháp chính xác để nhận quy trình tiền cảnh hiện tại và ngăn chặn các bài đăng sai là gì? Thứ tự của danh sách được thực hiện như thế nào - API nói rằng nó không được chỉ định. Có cách nào để đặt hàng chính xác không?

Cảm ơn!

+0

Điều này có vẻ như một sự lừa đảo của http://stackoverflow.com/questions/2166961/determining-the-current-foreground-application-from-a-background-task-or-service – alzee

+0

Tôi chưa thử nghiệm, nhưng Điều này có vẻ như nó sẽ giúp bạn: http://stackoverflow.com/a/33886313/4973904 –

+0

@ ÁlissonMorais Vâng, cảm ơn đầu tiên cho phản ứng, nhưng bạn đã đọc câu hỏi hoàn chỉnh chưa? Tôi không thể sử dụng mục đầu tiên của danh sách trả về chỉ vì trên 30% thiết bị, danh sách không được sắp xếp. – JacksOnF1re

Trả lời

3

Phương pháp chính xác để nhận quy trình tiền cảnh hiện tại và ngăn chặn dương tính giả là gì?

UsageStatsManager là API chính thức duy nhất để tải ứng dụng hiện tại đang hoạt động (see #50).

Sử dụng getRunningTasks(int maxNum), getRunningAppProcesses() hoặc AccessibilityService để nhận ứng dụng tiền cảnh chưa bao giờ đáng tin cậy. Các tài liệu cho hai phương pháp đầu tiên có cảnh báo sau đây: Note: this method is only intended for debugging


Dưới đây là một ví dụ cho việc ứng dụng hàng đầu sử dụng UsageStatsManager:

Calendar endCal = Calendar.getInstance(); 
Calendar beginCal = Calendar.getInstance(); 
beginCal.add(Calendar.MINUTE, -30); 
UsageStatsManager manager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE); 
List<UsageStats> stats = manager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, 
    beginCal.getTimeInMillis(), endCal.getTimeInMillis()); 
Collections.sort(stats, new Comparator<UsageStats>() { 

    @Override public int compare(UsageStats lhs, UsageStats rhs) { 
    long time1 = lhs.getLastTimeUsed(); 
    long time2 = rhs.getLastTimeUsed(); 
    if (time1 > time2) { 
     return -1; 
    } else if (time1 < time2) { 
     return 1; 
    } 
    return 0; 
    } 
}); 
// The first "UsageStats" in the list will be the top application. 
// If the list is empty you will need to ask for permissions to use UsageStatsManager 
// To request permission: 
// startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)); 

Tôi biết điều này không phải là câu trả lời bạn đang hy vọng. Các ứng dụng như CM SecurityAppLock sử dụng UsageStatsManager trên Android 5.1.1+. Do SeLinux, bạn không thể tải ứng dụng nền trước bằng cách sử dụng getRunningTasks(int maxNum) hoặc getRunningAppProcesses().

+0

Cảm ơn bạn đã trả lời! Rất tiếc, StatsManager sẽ không hoạt động đối với hầu hết các thiết bị Samsumg chứ không phải dưới API 21 (như bạn đã nói). : / – JacksOnF1re

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