判断系统运行的程序是不是系统程序还是安装包程序

该代码示例展示了如何在Android中判断栈顶活动是否为系统软件,通过检查运行任务、应用包信息和FLAG_SYSTEM标志来区分系统程序和用户安装的应用。同时包含了判断当前界面是否为Home页面的辅助方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
	}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值