关于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()判断即可。
原文:http://www.cnblogs.com/d7501/p/6383125.html