如何通过Flutter应用终止正在运行的其他应用?
核心限制提前说明
跨应用终止进程的能力完全依赖系统开放的权限,不存在Flutter层的统一跨平台API,iOS端受沙盒机制严格限制,第三方应用没有任何公开API可以终止其他运行中的应用,使用私有API实现会直接被App Store拒审,以下方案仅适用于Android端
Android端实现步骤
1. 配置对应权限
根据你适配的Android版本,在android/app/src/main/AndroidManifest.xml中声明所需权限:
<!-- 基础杀后台进程权限,Android全版本普通应用可申请 --> <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" /> <!-- Android 11及以上需要查询其他应用包名时添加,上架应用市场需符合对应审核规则 --> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" android:maxSdkVersion="34" />
- 普通第三方应用仅能通过上述权限杀死其他应用的后台进程,无法终止前台活跃的应用
- 如果需要强制终止任意状态的应用,你的应用必须持有系统签名、获得Root权限,或者被设置为设备所有者(Device Owner),普通上架的第三方应用拿不到这个级别的权限
2. 编写Flutter与原生的通信逻辑
Flutter本身没有提供操作系统进程的接口,需要通过MethodChannel调用Android原生的API实现:
首先是Flutter端的封装代码:
import 'package:flutter/services.dart'; class ProcessUtil { static const _channel = MethodChannel('native_process_control'); /// 传入目标应用包名,尝试终止对应应用进程 static Future<bool> killTargetApp(String packageName) async { try { final bool res = await _channel.invokeMethod('killApp', { 'packageName': packageName }); return res; } catch (e) { return false; } } }
然后在Android端的MainActivity.kt中添加对应方法处理:
import android.app.ActivityManager import android.content.Context import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel class MainActivity : FlutterActivity() { private val channelName = "native_process_control" override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, channelName).setMethodCallHandler { call, result -> when (call.method) { "killApp" -> { val targetPkg = call.argument<String>("packageName") if (targetPkg.isNullOrBlank()) { result.success(false) return@setMethodCallHandler } val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager // 普通权限下调用系统公开API杀后台进程 activityManager.killBackgroundProcesses(targetPkg) result.success(true) } else -> result.notImplemented() } } } }
如果你的应用已经拿到Root权限,可以替换原生端的实现逻辑,执行shell命令强杀任意应用:
Runtime.getRuntime().exec(arrayOf("su", "-c", "am force-stop $targetPkg"))
适配注意事项
- 国内MIUI、ColorOS、OriginOS等定制ROM对第三方应用杀进程的行为有额外拦截,部分机型需要用户手动开启“后台管理”“后台弹出界面”等特殊权限后功能才能正常生效
- 申请
QUERY_ALL_PACKAGES权限上架Google Play、国内主流应用市场时,需要提交明确的使用场景说明,不符合使用规范会被直接拒审 - 系统签名应用、设备所有者应用可以调用
ActivityManager.forceStopPackage()接口直接终止任意状态的应用,不需要Root权限,但普通应用拿不到这个接口的调用权限
内容的提问来源于stack exchange,提问作者user8759167
相关产品推荐
相关产品推荐

