安卓应用仅在未检测到黑名单应用时执行在线更新的实现咨询
问题根源
你当前的代码中黑名单检测和更新请求是并行执行的,启动检测的同时就直接发起了更新请求,检测结果完全不会阻断更新逻辑,所以无法实现预期的“无黑名单应用才更新”的效果。
实现方案
这里提供两种实现方式,你可以根据自身需求选择:
方案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:基于原有定时检测改造(适合需要持续监控黑名单应用的场景)
如果你需要保留后台持续检测黑名单应用的能力,可以修改原有回调逻辑实现:
- 首先修改
TorrentDetection的回调接口,新增无黑名单应用的回调:
public interface TorrentListener { void detected(ArrayList pkg); // 新增回调:未检测到任何黑名单应用 void onNoneDetected(); }
- 修改
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()停止定时任务 } }
- 调整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
相关产品推荐
相关产品推荐

