判斷Android應用是否在前台顯示


關於Android應用判斷是否在前台顯示的問題,網上也有了很多方法,這里總結一個網上的方法和分享一個自己的方法。

先解決網上一些方法的問題

在網上還有很多文章是采用下面這種方法處理:

1 ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
2         List<RunningTaskInfo> runnings = am.getRunningTasks(Integer.MAX_VALUE);
3         for(RunningTaskInfo info : runnings){
4             if(info.topActivity.equals(activityName)){
5                 ...
6             }
7         }

這段代碼只是描述一種解決辦法,但不是完整的,這里僅僅只是貼出判斷某個Activity是否在前台顯示的部分,只需循環一下某應用的所以Activity即可,問題在於現在am.getRunningTasks(int)現在已經廢棄不再使用了,那就需要尋找一種新方法,網友們給出了另一個實現,如下:

 1 ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
 2         List<RunningAppProcessInfo> runnings = am.getRunningAppProcesses();
 3         for(RunningAppProcessInfo running : runnings){
 4             if(running.processName.equals(getPackageName())){
 5                 if(running.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND 
 6                         || running.importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE){
 7                     //前台顯示... 8                 }else{
 9                     //后台顯示...10                 }
11                 break;
12             }
13         }

可能同樣需要實現某種特殊功能的朋友看到這段代碼直接就拿去用了,然后發現一直都是執行前台顯示的代碼,網上很多文章沒有提到解決方法,其實方法也很簡單,只需將這部分代碼

在用戶線程上運行就可以了,也就是弄個線程,問題解決,因為可能會涉及到UI變化的問題,下面順便貼上關於異步處理的一種方案的代碼:

Handler:

1 Handler handler = new Handler(){
2         @Override
3         public void handleMessage(Message msg) {
4            switch(msg.what){
5             case FOREGROUND:
6             ......
7             }
8         }
9     };        

核心代碼:

new Thread(new Runnable() {
            @Override
            public void run() {
                ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
                List<RunningAppProcessInfo> runnings = am.getRunningAppProcesses();
                for(RunningAppProcessInfo running : runnings){
                    if(running.processName.equals(getPackageName())){
                        if(running.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND 
                                || running.importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE){
                            handler.sendEmptyMessage(FOREGROUND);
                        }else{
                            handler.sendEmptyMessage(...);
                        }
                        break;
                    }
                }
            }
        }).start();

那這兩部分代碼去用,問題就可以解決了

順便說說自己的另一個方法

這個方法其實也很簡單,首先弄個Activyty的管理類,然后弄個BaseActivity繼承Activity,然后添加一個判斷標志,重寫六個方法,即可

首先,編寫管理類

ActivityCollector:

 1 public class ActivityCollector {
 2 
 3     public static List<AppCompatActivity> activitys =
 4             new ArrayList<>();
 5 
 6     public static void addActivity(AppCompatActivity activity){
 7         activitys.add(activity);
 8     }
 9 
10     public static void removeActivity(AppCompatActivity activity){
11         if(activitys.contains(activity)){
12             activitys.remove(activity);
13         }
14     }
15 
16     public static boolean activityInForeground(AppCompatActivity activity)     {
17         return ((BaseActivity)activity).isForeground;
18     }
19 
20     public static boolean hasActivityInForeground(){
21         for(AppCompatActivity activity : activitys ){
22              if(activityInForeground(activity)){
23                  return true;
24              }
25     }
26         return false;
27     }
28 }

BaseActivity:

 1 class BaseActivity extends AppCompatActivity{
 2     private boolean isForegroud = false;
 3 
 4     @Override
 5     protected void onCreate(@Nullable Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         ActivityCollector.addActivity(this);
 8     }
 9 
10     @Override
11     protected void onDestroy() {
12         super.onDestroy();
13         ActivityCollector.removeActivity(this);
14     }
15 
16     @Override
17     protected void onStop() {
18         super.onStop();
19         isForegroud = false;
20     }
21 
22     @Override
23     protected void onPause() {
24         super.onPause();
25         isForegroud = true;
26     }
27 
28     @Override
29     protected void onResume() {
30         super.onResume();
31         isForegroud = true;
32     }
33 
34     @Override
35     protected void onStart() {
36         super.onStart();
37         isForegroud = true;
38     }
39     
40     public boolean isForegroud(){
41         return isForegroud;
42     }
43 }

然后編寫的Activity都繼承BaseActivity,然后在需要判斷應用是否在前台顯示的地方簡單調用ActivityCollector.hasActivityInForeground()判斷即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM