最近的项目有一个功能需求,要求程序退到后台的时候,在顶部通知栏处显示一个通知,用以下代码:
/**
* 程序前后台判断
* @return
*/
private boolean isAppOnForeground() {
ActivityManager activityManager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
String packageName = this.getPackageName();
List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
if (appProcesses == null)
return false;
for (RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.processName.equals(packageName)
&& appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
return true;
}
}
return false;
}
经过测试,在一般情况下可行,在某些经过简洁版本的Android系统中 RunningAppProcessInfo.importance的值一直为400,原因未找到,RunningAppProcessInfo 里面的变量importance其实是表示这个app进程的重要性,因为系统回收时候,会根据importance的重要来杀进程的。具体可以去看文档。
IMPORTANCE_BACKGROUND = 400
public static final int IMPORTANCE_EMPTY = 500
public static final int IMPORTANCE_FOREGROUND = 100
public static final int IMPORTANCE_SERVICE = 300
public static final int IMPORTANCE_VISIBLE = 200
另外一种方法则可行:
/**
* 判断当前应用程序是否处于后台,通过getRunningTasks的方式
* @return true 在后台; false 在前台
*/
public boolean isApplicationBroughtToBackgroundByTask() {
List<RunningTaskInfo> tasks = activityManager.getRunningTasks(1);
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;
if (!topActivity.getPackageName().equals(getPackageName())) {
return true;
}
}
return false;
}
由于第一种方法在大部分情况下可行,所以继续沿用,并用第二种方法做保证。
全部代码,仅供参考:
public class BaseActivity extends Activity {
public static boolean notifyShowing = false;
public static boolean isSpecialSystem=false;
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
MyRestoreInstanceState(bundle);
sAllActivity.add(this);
activityManager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);
}
protected void onStart() {
super.onStart();
if(notifyShowing){
stopService(new Intent(this, LocalService.class));
notifyShowing = false;
}
}
protected void onStop() {
super.onStop();
if(!isAppOnForeground()){
notifyShowing = true;
startService(new Intent(this, LocalService.class));
}
}
ActivityManager activityManager;
KeyguardManager keyguardManager;
/**
* 判断程序是否在前台
* @return true 在前台; false 在后台
*/
private boolean isAppOnForeground() {
if(!isSpecialSystem){
boolean isspecial=true;
String packageName = this.getPackageName();
List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
if (appProcesses == null)
return false;
for (RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.processName.equals(packageName)) {
if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND||appProcess.importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
return true;
}
if (keyguardManager.inKeyguardRestrictedInputMode()) return true;
}
if(isspecial){
if(appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
isspecial=false;
}
}
}
if(isspecial){
isSpecialSystem=true;
return !isApplicationBroughtToBackgroundByTask();
}
return false;
}else{
return !isApplicationBroughtToBackgroundByTask();
}
}
/**
* 判断当前应用程序是否处于后台,通过getRunningTasks的方式
* @return true 在后台; false 在前台
*/
public boolean isApplicationBroughtToBackgroundByTask() {
List<RunningTaskInfo> tasks = activityManager.getRunningTasks(1);
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;
if (!topActivity.getPackageName().equals(getPackageName())) {
return true;
}
}
return false;
}
}