如何使用Espresso或UiAutomator模拟应用杀死并重启操作?
用Espresso或UiAutomator实现测试中杀死并重启应用的方法
一、Espresso结合Instrumentation方案
杀死应用
通过系统ActivityManager操作,先获取目标应用包名,再调用进程停止方法:
String packageName = InstrumentationRegistry.getTargetContext().getPackageName(); ActivityManager activityManager = (ActivityManager) InstrumentationRegistry.getTargetContext() .getSystemService(Context.ACTIVITY_SERVICE); // 常规方式:杀死后台进程 activityManager.killBackgroundProcesses(packageName); // 彻底强制停止(需系统权限,一般测试不推荐) // activityManager.forceStopPackage(packageName);
注意:
forceStopPackage需要在测试清单中添加<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES" />,但该权限仅系统应用或Root设备可用,多数场景用killBackgroundProcesses即可满足需求。
重启应用
通过包管理器获取应用启动Intent,启动主Activity并等待加载完成:
Intent launchIntent = InstrumentationRegistry.getTargetContext() .getPackageManager() .getLaunchIntentForPackage(packageName); launchIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); InstrumentationRegistry.getTargetContext().startActivity(launchIntent); // 等待应用UI加载完成 Espresso.onView(ViewMatchers.isRoot()).perform(ViewActions.waitForIdle());
二、UiAutomator方案
UiAutomator支持系统级操作,适合模拟用户手动杀应用的流程:
步骤1:获取UiDevice实例
UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
步骤2:打开应用信息页面并强制停止
String packageName = InstrumentationRegistry.getTargetContext().getPackageName(); // 启动应用信息页 Intent settingsIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri appUri = Uri.fromParts("package", packageName, null); settingsIntent.setData(appUri); settingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); InstrumentationRegistry.getTargetContext().startActivity(settingsIntent); // 等待并点击"强制停止"按钮 device.wait(Until.hasObject(By.text("强制停止")), 5000); UiObject forceStopBtn = device.findObject(By.text("强制停止")); if (forceStopBtn.exists() && forceStopBtn.isEnabled()) { forceStopBtn.click(); // 确认弹窗 device.wait(Until.hasObject(By.text("确定")), 3000); UiObject confirmBtn = device.findObject(By.text("确定")); if (confirmBtn.exists()) confirmBtn.click(); }
步骤3:重启应用
// 返回桌面 device.pressHome(); // 方式1:通过应用图标启动(需替换为你的应用名称/描述) UiObject appIcon = device.findObject(By.desc("你的应用名称")); if (appIcon.exists()) appIcon.click(); // 方式2:通过Intent启动(和Espresso方式一致) // Intent launchIntent = InstrumentationRegistry.getTargetContext().getPackageManager().getLaunchIntentForPackage(packageName); // launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // InstrumentationRegistry.getTargetContext().startActivity(launchIntent); // 等待应用加载完成 device.wait(Until.hasObject(By.pkg(packageName).depth(0)), 10000);
三、关键注意事项
- 执行杀应用操作前,确保应用处于后台状态,避免干扰当前测试流程
- 不同Android版本的系统控件文本可能不同,建议通过资源ID定位(如
By.res("android:id/button1"))替代文本定位,提升兼容性 - 重启后必须添加足够的等待逻辑,确保应用完全初始化完成后再执行后续测试步骤
内容的提问来源于stack exchange,提问作者Venkataramanan
相关产品推荐
相关产品推荐

