ActivityMonitor 类的功能

本文介绍如何利用Instrumentation实现对Android Activity的启动测试。通过监听Activity的启动过程,确保应用程序的组件能正确响应用户交互。文章详细展示了如何设置测试用例,并通过具体的代码示例解释了如何使用Instrumentation的`addMonitor`方法来监测Activity的创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个类只是google为了自动测试所添加的一个类,可以说是一个工具类。

下面我们来分析一下这类是如何使用的,

最简单的方式,就是来监听activity启动是否成功,

首先来看我的单元测试文件。

/**
 * Created by xiepengchong on 15/7/26.
 */
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {

    private long TIMEOUT_IN_MS = 0;
    private TextView hello;
    private MainActivity activity;
    public MainActivityTest() {
        super(MainActivity.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        activity = getActivity();
        hello = (TextView)activity.findViewById(R.id.hello);
    }



    public void testPrecondition(){
        assertNotNull(hello);
    }

    public void testStartActivity(){
        final Button mButton = (Button)activity.findViewById(R.id.button);
        Instrumentation.ActivityMonitor monitor = getInstrumentation().addMonitor(MainActivity2.class.getName(),null,false);

        TouchUtils.clickView(this, mButton);
        MainActivity2 activity2 = (MainActivity2)getInstrumentation().waitForMonitorWithTimeout(monitor,TIMEOUT_IN_MS);
        assertNotNull("MainActivity2 is Null",activity2);
        getInstrumentation().removeMonitor(monitor);

    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
    }
}

这是来启动点击事件来启动Activity的,activity2既是启动的Activity,
 
那么这个事如何能够做到监听的呢,其实这个主要还是Instrumentation所起的作用,
通过看我的上一篇博客可以看到Activity启动流程
1085    private void postPerformCreate(Activity activity) {
1086        if (mActivityMonitors != null) {
1087            synchronized (mSync) {
1088                final int N = mActivityMonitors.size();
1089                for (int i=0; i<N; i++) {
1090                    final ActivityMonitor am = mActivityMonitors.get(i);
1091                    am.match(activity, activity, activity.getIntent());
1092                }
1093            }
1094        }
1095    }
可以看到这里来遍历Monitor的List,PS(这个list就是我们在addMonitor中添加的)
然后回调用match方法
569        final boolean match(Context who,
570                            Activity activity,
571                            Intent intent) {
572            synchronized (this) {
573                if (mWhich != null
574                    && mWhich.match(who.getContentResolver(), intent,
575                                    true, "Instrumentation") < 0) {
576                    return false;
577                }
578                if (mClass != null) {
579                    String cls = null;
580                    if (activity != null) {
581                        cls = activity.getClass().getName();
582                    } else if (intent.getComponent() != null) {
583                        cls = intent.getComponent().getClassName();
584                    }
585                    if (cls == null || !mClass.equals(cls)) {
586                        return false;
587                    }
588                }
589                if (activity != null) {
590                    mLastActivity = activity;
591                    notifyAll();
592                }
593                return true;
594            }
595        }
596    }
这里会将mLastActivity赋值了,
然后在
public Activity waitForMonitorWithTimeout(ActivityMonitor monitor, long timeOut) {
718        Activity activity = monitor.waitForActivityWithTimeout(timeOut);
719        synchronized (mSync) {
720            mActivityMonitors.remove(monitor);
721        }
722        return activity;
723    }

  public final Activity waitForActivityWithTimeout(long timeOut) {
552            synchronized (this) {
553                if (mLastActivity == null) {
554                    try {
555                        wait(timeOut);
556                    } catch (InterruptedException e) {
557                    }
558                }
559                if (mLastActivity == null) {
560                    return null;
561                } else {
562                    Activity res = mLastActivity;
563                    mLastActivity = null;
564                    return res;
565                }
566            }
567        }
这里可以看到会判断mLastActivity的值,也就是我们刚刚启动Activity时赋值的,
 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值