import java.util.List;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class AppStatusService extends Service {
private static final String TAG = "[AppStatusService]";
private ActivityManager activityManager;
private String packageName;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
activityManager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
packageName = this.getPackageName();
new Thread() {
public void run() {
try {
while (true) {
Thread.sleep(1000);
if (isAppOnForeground()) {
Log.i(TAG, "true");
} else {
Log.i(TAG, "false");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
super.onStart(intent, startId);
}
private boolean isAppOnForeground() {
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;
}
}
这是只能判断 一个app 一个进程的情况,例如app当中调用Intent发送短信则会出现mms进程
修改后虽然反应不是很灵敏 但是能用
public static boolean isAppOnForeground(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
String packageName = context.getPackageName();
List<RecentTaskInfo> appTask = activityManager.getRecentTasks(1, 0);
if (appTask == null) return false;
if(appTask.get(0).baseIntent.toString().contains(packageName)){
return true;
}
return false;
}
<uses-permission android:name="android.permission.GET_TASKS"/> //manifest中加上权限
上面方法 有时候在task中的activity切换时会出错,先修改为
List<RunningTaskInfo> runningTask = activityManager.getRunningTasks(1);
if(runningTask.get(0).baseActivity.toString().contains(packageName)){
return true;
}
继续修改:
public static boolean isOnForeground(Context context){
ActivityManager manager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runningAppProcesses = manager.getRunningAppProcesses();
for(RunningAppProcessInfo processInf : runningAppProcesses){
if(processInf.processName.equals(context.getPackageName())){
if(processInf.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
return true;
}else{
return false;
}
}
}
return false;
}
app当中调用Intent发送短信、打电话、按Home键 processInf.importance值为 IMPORTANCE_PERCEPTIBLE
按back键退出程序 processInf.importance值为 IMPORTANCE_BACKGROUND