如何在Android UiAutomator2中获取Application Context?
解决Instrumentation Context无法获取ApplicationContext的问题
嘿,这个坑我之前踩过!咱们先搞清楚核心问题,再一步步解决:
首先你要知道:InstrumentationRegistry.getInstrumentation().getContext()返回的是测试包自身的上下文,而不是你要测试的目标应用的上下文。这就是为什么你觉得找不到合适方法的原因——不是没有,是你拿错了Context实例!
下面给你几个实用的解决思路:
1. 直接获取目标应用的Context(最推荐)
如果你需要的是被测应用的ApplicationContext,别用getContext(),改用Instrumentation的getTargetContext()方法,它专门返回被测应用的上下文,之后就能正常调用getApplicationContext()了:
Context targetAppContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); ApplicationContext appContext = (ApplicationContext) targetAppContext.getApplicationContext();
2. 从测试包Context获取目标应用的ApplicationContext
如果你手里只有测试包的Context,也可以通过包名创建目标应用的上下文实例:
Context testContext = InstrumentationRegistry.getInstrumentation().getContext(); try { // 替换成你的被测应用包名 Context targetContext = testContext.createPackageContext( "com.your.target.app.package", Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY ); ApplicationContext appContext = (ApplicationContext) targetContext.getApplicationContext(); } catch (PackageManager.NameNotFoundException e) { // 处理包名找不到的异常 e.printStackTrace(); }
3. 用AndroidX Test的简化API(更便捷)
如果你在使用AndroidX Test框架(比如Espresso、JUnit测试),可以直接用ApplicationProvider来获取ApplicationContext,省去Instrumentation的繁琐步骤:
ApplicationContext appContext = ApplicationProvider.getApplicationContext();
补充说明
所有Context理论上都有getApplicationContext()方法,你之前觉得找不到,大概率是因为拿到的是测试包的Context,不是你需要的目标应用上下文。先确认自己要操作的是哪个上下文,再选对应的方法就好啦~
内容的提问来源于stack exchange,提问作者AnswerDroid
相关产品推荐
相关产品推荐

