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

如何捕获全场景应用卸载事件并触发自定义API及Device Admin Access?

如何捕获Android系统中任意场景下的应用卸载尝试事件

要实现全局监听应用卸载尝试(包括设置界面的卸载操作),Android系统没有提供直接的系统广播来通知卸载发起动作,需结合以下方案实现:

1. 用辅助功能服务(AccessibilityService)监听卸载相关UI交互

这是目前唯一能在卸载发起阶段(用户点击卸载按钮、弹出确认框时)捕获事件的可行方案:

  • 配置AccessibilityService,使其监听系统所有应用的UI事件
  • 过滤卸载相关的控件动作,比如:
    • 检测文本为「卸载」(或对应英文「Uninstall」)的按钮被点击
    • 识别卸载确认对话框(含「确定卸载」「取消」类文本的弹窗)的出现
  • 捕获到事件后,触发Device Admin Access逻辑和自定义API调用

核心代码片段:

public class UnwatchAccessibilityService extends AccessibilityService {
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED ||
            event.getEventType() == AccessibilityEvent.TYPE_VIEW_CLICKED) {
            
            List<CharSequence> texts = event.getText();
            boolean isUninstallAction = texts.stream().anyMatch(text -> 
                text.toString().contains("卸载") || text.toString().contains("Uninstall"));
            
            if (isUninstallAction) {
                // 打开Device Admin Access选项
                openDeviceAdminSettings();
                // 触发自定义API通知
                callUninstallNotifyApi();
            }
        }
    }

    @Override
    public void onInterrupt() {}
}
  • 注意:需引导用户手动开启应用的辅助功能权限,这是方案生效的前提
  • 不同厂商ROM的UI文本可能存在差异,需适配多语言和不同系统的控件文本

2. 监听卸载完成的系统广播(事后通知)

若可接受在卸载完成后触发逻辑,可注册以下广播接收器:

  • ACTION_PACKAGE_REMOVED:应用被卸载时触发(保留数据目录)
  • ACTION_PACKAGE_FULLY_REMOVED:应用被完全卸载(数据目录也删除)时触发

广播接收器代码示例:

public class UninstallReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_PACKAGE_REMOVED.equals(action) ||
            Intent.ACTION_PACKAGE_FULLY_REMOVED.equals(action)) {
            
            String targetPackage = intent.getData().getSchemeSpecificPart();
            openDeviceAdminSettings();
            callUninstallNotifyApi(targetPackage);
        }
    }
}
  • 在Manifest中注册广播:
<receiver android:name=".UninstallReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_REMOVED"/>
        <action android:name="android.intent.action.PACKAGE_FULLY_REMOVED"/>
        <data android:scheme="package"/>
    </intent-filter>
</receiver>
  • 局限性:仅能在卸载完成后触发,无法响应用户点击卸载按钮的瞬间动作

3. 针对自身应用被卸载的特殊处理

若需求仅监控自身应用的卸载尝试,可通过Native层监听应用目录变化,但该方案不适用于监控其他应用的卸载操作。

关键注意事项

  • 辅助功能权限需用户手动开启,应用需提供清晰的引导说明
  • 不同Android版本、厂商ROM的UI控件结构和文本存在差异,需做适配测试
  • 系统广播仅能捕获卸载完成事件,无法满足「尝试卸载」时的实时响应需求

内容的提问来源于stack exchange,提问作者vivekanandhan muthusamy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:25:19