package com.gh.common.util; import android.content.Context; import android.content.pm.*; import android.os.Handler; import android.os.Message; import com.gh.gamecenter.eventbus.EBPackage; import de.greenrobot.event.EventBus; import java.util.*; /** * 下载完成跳安装, */ public class InstallUtils { private static final int MAX_TIME = 5 * 60 * 1000; private static Map installMap; private static Map uninstallMap; private static InstallUtils mInstance; private PackageManager packageManager; private Handler handler; private boolean isRunning; private InstallUtils(Context context) { isRunning = false; packageManager = context.getPackageManager(); handler = new Handler(context.getMainLooper()) { @Override public void handleMessage(Message msg) { if (msg.what == 0x123 && packageManager != null) { ArrayList list = new ArrayList<>(); List packageInfos = packageManager.getInstalledPackages(0); for (PackageInfo packageInfo : packageInfos) { if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { list.add(packageInfo.packageName); } } if (installMap != null && installMap.size() != 0) { ArrayList keys = new ArrayList<>(); for (String packageName : installMap.keySet()) { long time = installMap.get(packageName); if (System.currentTimeMillis() - time >= MAX_TIME) { keys.add(packageName); } else if (list.contains(packageName)) { keys.add(packageName); EventBus.getDefault().post(new EBPackage("安装", packageName)); } } for (String key : keys) { installMap.remove(key); } } if (uninstallMap != null && uninstallMap.size() != 0) { ArrayList keys = new ArrayList<>(); for (String packageName : uninstallMap.keySet()) { long time = uninstallMap.get(packageName); if (System.currentTimeMillis() - time >= MAX_TIME) { keys.add(packageName); } else if (list.contains(packageName)) { keys.add(packageName); EventBus.getDefault().post(new EBPackage("卸载", packageName)); } } for (String key : keys) { uninstallMap.remove(key); } } if ((installMap != null && installMap.size() != 0) || (uninstallMap != null && uninstallMap.size() != 0)) { sendEmptyMessageDelayed(0x123, 3000); } else { isRunning = false; } } } }; } public static InstallUtils getInstance(Context context) { if (mInstance == null) { synchronized (InstallUtils.class) { if (mInstance == null) { mInstance = new InstallUtils(context); } } } return mInstance; } public void addInstall(String packageName) { if (installMap == null) { installMap = Collections.synchronizedMap(new HashMap()); } installMap.put(packageName, System.currentTimeMillis()); run(); } public void removeInstall(String packageName) { if (installMap != null) { installMap.remove(packageName); } } public void addUninstall(String packageName) { if (uninstallMap == null) { uninstallMap = Collections.synchronizedMap(new HashMap()); } uninstallMap.put(packageName, System.currentTimeMillis()); run(); } public void removeUninstall(String packageName) { if (uninstallMap != null) { uninstallMap.remove(packageName); } } public void run() { if ((installMap == null || installMap.isEmpty()) && (uninstallMap == null || uninstallMap.isEmpty())) { return; } if (isRunning) { return; } isRunning = true; handler.sendEmptyMessageDelayed(0x123, 10000); } }