You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

安卓应用仅在未检测到黑名单应用时执行在线更新的实现咨询

问题根源

你当前的代码中黑名单检测和更新请求是并行执行的,启动检测的同时就直接发起了更新请求,检测结果完全不会阻断更新逻辑,所以无法实现预期的“无黑名单应用才更新”的效果。

实现方案

这里提供两种实现方式,你可以根据自身需求选择:


方案1:单次同步检测(简单高效,仅更新前检查一次)

不需要修改原有TorrentDetection类,直接在更新前同步执行一次黑名单检测即可,逻辑更简洁:

// 新增工具方法:检查是否安装了黑名单应用
private boolean hasBlackAppInstalled() {
    PackageManager pm = getPackageManager();
    for (String pkg : Constraints.torrentList) {
        try {
            pm.getPackageInfo(pkg, PackageManager.GET_ACTIVITIES);
            // 检测到黑名单应用,直接返回true
            return true;
        } catch (PackageManager.NameNotFoundException e) {
            // 未安装当前应用,继续检查下一个
        }
    }
    return false;
}

// 修改后的update方法
void update() {
    // 先检查是否有黑名单应用
    if (hasBlackAppInstalled()) {
        stopService();
        // 弹不支持应用提示
        new AlertDialog.Builder(MainActivity.this)
            .setTitle("不支持的应用!")
            .setMessage(String.format("检测到设备安装了以下不支持应用:%s", TextUtils.join(", ", Constraints.torrentList)))
            .setPositiveButton("确定", null)
            .setCancelable(false)
            .create()
            .show();
        return;
    }
    // 无黑名单应用,才执行更新逻辑
    new UpdateCore(this, Constraints.updater, new UpdateCore.Listener() {
        // 原有更新回调逻辑保持不变
        @Override
        public void onLoading() {
        }
        @Override
        public void onCompleted(final String config) {
            try {
                final JSONObject obj = new JSONObject(MilitaryGradeEncrypt.decryptBase64StringToString(config, Constraints.confpass));
                if (Double.valueOf(obj.getString("Version")) <= Double.valueOf(conts.getConfigVersion())) {
                } else {
                    new SweetAlertDialog(MainActivity.this, SweetAlertDialog.CUSTOM_IMAGE_TYPE)
                        .setTitleText("更新")
                        .setContentText("\n" + obj.getString("Message"))
                        .setConfirmText("立即更新")
                        .setCustomImage(R.drawable.ic_update)
                        .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
                            @Override
                            public void onClick(SweetAlertDialog sDialog) {
                                sDialog.dismissWithAnimation();
                                welcomeNotif();
                                restart_app();
                                try {
                                    db.updateData("1", config);
                                    sp.edit().putString("CurrentConfigVersion", obj.getString("Version")).commit();
                                } catch (JSONException e) {}
                            }
                        })
                        .show();
                }
            } catch (Exception e) {
            }
        }
        @Override
        public void onCancelled() {
        }
        @Override
        public void onException(String ex) {
        }
    }).execute();
}

方案2:基于原有定时检测改造(适合需要持续监控黑名单应用的场景)

如果你需要保留后台持续检测黑名单应用的能力,可以修改原有回调逻辑实现:

  1. 首先修改TorrentDetection的回调接口,新增无黑名单应用的回调:
public interface TorrentListener {
    void detected(ArrayList pkg);
    // 新增回调:未检测到任何黑名单应用
    void onNoneDetected();
}
  1. 修改TorrentDetection的check()方法,补全回调逻辑:
void check() {
    ArrayList arrayList2 = new ArrayList();
    for (String pack : items) {
        if(check(pack)){
            arrayList2.add(pack);
        }
    }
    if (arrayList2.size() > 0) {
        listener.detected(arrayList2);
        stop();
    } else {
        // 未检测到黑名单应用时触发回调
        listener.onNoneDetected();
        // 如果不需要持续检测,这里也可以调用stop()停止定时任务
    }
}
  1. 调整MainActivity逻辑,将更新逻辑放到无黑名单的回调中:
// 修改TorrentDetection初始化逻辑
torrent = new TorrentDetection(this, Constraints.torrentList, new TorrentDetection.TorrentListener() {
    @Override
    public void detected(ArrayList pkg) {
        stopService();
        new AlertDialog.Builder(MainActivity.this)
            .setTitle("不支持的应用!")
            .setMessage(String.format("%s", new Object[]{TextUtils.join(", ", (String[]) pkg.toArray(new String[pkg.size()]))}))
            .setPositiveButton("确定", null)
            .setCancelable(false)
            .create()
            .show();
    }

    @Override
    public void onNoneDetected() {
        // 检测无黑名单应用,执行更新逻辑
        executeUpdate();
    }
});

// 抽离更新逻辑为单独方法
private void executeUpdate() {
    new UpdateCore(this, Constraints.updater, new UpdateCore.Listener() {
        // 原有更新回调逻辑保持不变,和方案1中的一致即可
    }).execute();
}

// 修改update方法,仅启动检测
void update() {
    torrent.start();
}

内容的提问来源于stack exchange,提问作者Hiels Viles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:57:02