Android(安卓)判断程序前后台状态
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
更多相关文章
- Android中Broadcast的Intent大全
- android中设置进度条读取
- Qt_Qtopia与Android的进程间通讯方式
- Android(安卓)的网络编程(5)-通过ksoap2调用webservice示例
- 修改Android的开关机铃声、Android开关机画面与动画(附代码流程)
- android客户程序调用Webservice 心得
- WebView.onDraw (Android(安卓)4.1)
- Android(安卓)Process生命周期
- Android退出多个Activity的两个经典方法