package com.example.screenlistenerexample;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Build;
import android.util.Log;
public class IsForgSystem {
/**
* 判断当前处于栈顶的活动是不是系统软件。 com.android.vending (谷歌电子市场)
*
* @param mContext
* @return
*/
public static boolean isForgSystem(Context mContext) {
Log.d("TAG", "开始");
PackageManager packageManager = mContext.getPackageManager();
List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(0);
for (int i = 0; i < packageInfoList.size(); i++) {
PackageInfo pak = (PackageInfo) packageInfoList.get(i);
//Log.d("TAG", pak.applicationInfo.packageName);
if (pak.applicationInfo.packageName.equals("com.android.vending")) {}
}
if (isHome(mContext)) {
Log.e("TAG", "现在系统在home页面了");
return false;
} else {
Log.e("TAG", "现在系统不在home页面了");
//return true;
}
if (Build.VERSION.SDK_INT < 21) {
ActivityManager am = (ActivityManager) mContext
.getSystemService(Context.ACTIVITY_SERVICE);
Log.e("TAG","如果不在home页面,就可以看到这句话");
@SuppressWarnings("deprecation")
List<RunningTaskInfo> tasks = am.getRunningTasks(1);//当前系统运行的所有程序包
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;//取得当前运行的所有程序包中最后一次运行的程序
for (int i = 0; i < packageInfoList.size(); i++) {//已经安装的所有程序
PackageInfo pak = (PackageInfo) packageInfoList.get(i);
if (topActivity.getPackageName().equals(pak.applicationInfo.packageName)) {//如果栈顶的程序在手机运行的程序列表里面
/*
* (pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) > 0 判断是系统程序
* (pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= 0 判断为自己装的程序
*/
if ((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) > 0) {
Log.d("TAG", pak.applicationInfo.packageName+" is system app");
//下面判断是不是浏览器程序,如果想添加其他程序视为系统程序,可以添加其他安装包作为判断
if (pak.applicationInfo.packageName.equals("com.android.browser")//如果是系统浏览器
|| pak.applicationInfo.packageName.equals("com.sec.android.app.sbrowser")) {
Log.d("TAG", pak.applicationInfo.packageName+" is system app");
return false;
}
return false;
} else {
Log.d("TAG", pak.applicationInfo.packageName+" is not system app");
return true;
}
}
}
}
}
return false;
}
/**
* 判断当前界面是否是在home页面,如果是在home页面,返回true,否则返回false
*/
@SuppressWarnings("deprecation")
public static boolean isHome(Context mContext) {
if (Build.VERSION.SDK_INT < 21) {
Log.e("TAG",Build.VERSION.SDK_INT+"" );
Log.e("TAG", "看看是不是版本小于21就出现在这里了");
ActivityManager mActivityManager = (ActivityManager) mContext
.getSystemService(Context.ACTIVITY_SERVICE);
List<String> strs = getHomes(mContext);
List<RunningTaskInfo> rti = mActivityManager.getRunningTasks(1);
if (strs != null && strs.size() > 0) {
return strs.contains(rti.get(0).topActivity.getPackageName());
} else {
return false;
}
} else {
final int PROCESS_STATE_TOP = 2;
try {
// 获取正在运行的进程应用的信息实体中的一个字段,通过反射获取出来
Field processStateField = ActivityManager.RunningAppProcessInfo.class
.getDeclaredField("processState");
// 获取所有的正在运行的进程应用信息实体对象
List<ActivityManager.RunningAppProcessInfo> processes = ((ActivityManager) mContext
.getSystemService(Context.ACTIVITY_SERVICE))
.getRunningAppProcesses();
// 循环所有的进程,检测某一个进程的状态是最上面,也是就最近运行的一个应用的状态的时候,就返回这个应用的包名
for (ActivityManager.RunningAppProcessInfo process : processes) {
if (process.importance <= ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
&& process.importanceReasonCode == 0) {
int state = processStateField.getInt(process);
if (state == PROCESS_STATE_TOP) { // 如果这个实体对象的状态为最近的运行应用
String[] packname = process.pkgList;
// 返回应用的包名
//LogUtils.debug(packname[0]);
Log.d("TAG", packname[0]);
if (getPackageName(mContext).contains(packname[0])) {
return false;
}
return getHomes(mContext).contains(packname[0]);
}
}
}
} catch (Exception e) {
}
return false;
}
}
/**
* 获得属于桌面的应用的应用包名称
*
* @return 返回所有能启动桌面程序的应用程序,包括home键,和电源键
*/
private static List<String> getHomes(Context mContext) {
List<String> names = new ArrayList<String>();
PackageManager packageManager = mContext.getPackageManager();
// 属性
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(
intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo ri : resolveInfo) {
names.add(ri.activityInfo.packageName);
Log.e("TAG",ri.activityInfo.packageName+" X ");
}
return names;
}
public static String getPackageName(Context context) {
return context.getPackageName();
}
}
判断系统运行的程序是不是系统程序还是安装包程序
最新推荐文章于 2025-06-28 11:07:49 发布