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

如何检测Activity是否接收其他Activity发送的Intent?Espresso测试求助

问题1:如何检查一个Activity是否接收到来自另一个Activity的Intent?

其实很简单,在目标Activity(比如你说的Activity2)的onCreate方法里,直接通过getIntent()就能拿到启动它的那个Intent,接着就可以检查里面的extras啦。举个例子:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_2);
    
    Intent receivedIntent = getIntent();
    if (receivedIntent != null) {
        // 先检查有没有你要的那个key对应的extra
        if (receivedIntent.hasExtra("YOUR_CUSTOM_KEY")) {
            String extraValue = receivedIntent.getStringExtra("YOUR_CUSTOM_KEY");
            // 这里你可以把值显示在UI上,或者打个日志确认一下
            Log.d("Activity2", "收到的extra值:" + extraValue);
        }
    }
}

要是方便测试的话,还可以在Activity2里写个公开方法,直接返回Intent里的extra内容,这样测试的时候就能直接调用啦。


问题2:用Espresso测试Activity2是否收到Activity1的Intent(带Extras)

别慌,我给你分两种场景讲,从简单到完整流程都有,跟着做就行:

第一步:先确保项目加了Espresso依赖

先打开你模块级的build.gradle文件,把这些依赖加上(版本号可以用最新的):

androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'

场景1:单独测试Activity2的Intent接收(不用启动Activity1)

这种方式适合单独验证Activity2处理Intent的逻辑,不用依赖Activity1的跳转代码,很直接:

创建一个测试类,放在androidTest目录下,比如叫Activity2IntentTest:

@RunWith(AndroidJUnit4.class)
public class Activity2IntentTest {

    @Test
    public void testActivity2GetsCorrectExtras() {
        // 先构建一个和Activity1发送的一模一样的Intent
        Intent testIntent = new Intent(ApplicationProvider.getApplicationContext(), Activity2.class);
        testIntent.putExtra("USER_NAME", "Ray");
        testIntent.putExtra("USER_SCORE", 95);

        // 启动Activity2
        ActivityScenario<Activity2> scenario = ActivityScenario.launch(testIntent);

        // 方式一:直接获取Activity实例,检查Intent里的extras
        scenario.onActivity(activity -> {
            Intent receivedIntent = activity.getIntent();
            assertNotNull("Intent不能为null哦", receivedIntent);
            assertEquals("Ray", receivedIntent.getStringExtra("USER_NAME"));
            assertEquals(95, receivedIntent.getIntExtra("USER_SCORE", -1)); // 第二个参数是默认值,用来判断有没有拿到值
        });

        // 方式二:如果Activity2把extra显示在UI上,直接验证UI更贴近用户行为
        onView(withId(R.id.tv_user_name)).check(matches(withText("Ray")));
        onView(withId(R.id.tv_user_score)).check(matches(withText("95")));
    }
}

场景2:模拟完整流程——从Activity1点击按钮跳转到Activity2

这种方式测试的是真实用户操作流程,更全面:

同样在androidTest目录下创建测试类Activity1ToActivity2FlowTest:

@RunWith(AndroidJUnit4.class)
public class Activity1ToActivity2FlowTest {

    @Test
    public void testButtonClickSendsCorrectIntent() {
        // 先启动Activity1
        ActivityScenario.launch(Activity1.class);

        // 模拟点击按钮(替换成你Activity1里按钮的id)
        onView(withId(R.id.btn_jump_to_activity2)).perform(click());

        // 现在Activity2已经启动,获取它的实例来检查Intent
        ActivityScenario<Activity2> activity2Scenario = ActivityScenario.launch(Intent.class);
        activity2Scenario.onActivity(activity -> {
            Intent receivedIntent = activity.getIntent();
            assertNotNull("应该收到Intent", receivedIntent);
            
            // 这里替换成你实际传递的key和预期值
            String expectedName = "Ray";
            assertEquals(expectedName, receivedIntent.getStringExtra("USER_NAME"));
        });

        // 同样可以验证UI显示是否正确
        onView(withId(R.id.tv_user_name)).check(matches(withText("Ray")));
    }
}

一些小提醒

  • 一定要保证测试里用的key和Activity1中发送Intent时的key完全一致,别写错拼写!
  • 如果是用startActivityForResult启动的Activity,测试返回结果可以用ActivityScenario.result()来处理
  • 验证UI的方式更贴近真实用户体验,而直接检查Intent是更底层的逻辑验证,你可以根据需求选

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:31:39