Espresso(Android UI测试)运行时如何终止应用程序?技术求助
在Espresso测试中彻底终止应用的可行方案
我明白你要的是彻底终止应用、不让它留在后台的效果,用返回键确实达不到这个要求,这里给你几个经过验证的实用解决方案:
方法一:通过UiDevice执行Shell命令(最推荐)
如果你已经在使用UiDevice,直接执行adb shell的强制停止命令是最省心的——效果和你手动在终端敲am force-stop <包名>完全一样,不需要额外配置权限,还能确保应用被彻底终止:
import androidx.test.uiautomator.UiDevice import androidx.test.platform.app.InstrumentationRegistry fun stopAppCompletely() { val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) val packageName = InstrumentationRegistry.getInstrumentation().targetContext.packageName device.executeShellCommand("am force-stop $packageName") }
方法二:借助ActivityManager强制停止应用
通过Android系统的ActivityManager直接强制停止应用进程,能彻底清理所有相关组件,但需要在测试目录的AndroidManifest.xml中添加权限:
import android.app.ActivityManager import android.content.Context import androidx.test.core.app.ApplicationProvider fun forceStopApp() { val packageName = ApplicationProvider.getApplicationContext<Context>().packageName val activityManager = ApplicationProvider.getApplicationContext<Context>() .getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager activityManager.forceStopPackage(packageName) }
测试目录下的权限配置:
<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES" />
方法三:关闭所有Activity后杀死进程
如果不想添加额外权限,可以先清空Activity任务栈,再直接杀死当前进程,也能达到彻底终止的效果:
import androidx.test.platform.app.InstrumentationRegistry import android.os.Process fun terminateApp() { val instrumentation = InstrumentationRegistry.getInstrumentation() // 启动Launcher意图并清空任务栈 instrumentation.runOnMainSync { instrumentation.targetContext.startActivity( instrumentation.targetContext.packageManager.getLaunchIntentForPackage( instrumentation.targetContext.packageName )?.apply { addFlags(android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK or android.content.Intent.FLAG_ACTIVITY_NEW_TASK) } ) } // 杀死当前进程 Process.killProcess(Process.myPid()) }
内容的提问来源于stack exchange,提问作者Kamil
相关产品推荐
相关产品推荐

