SDK Instrumentation创建一个Note的实例

本文详细介绍了如何使用Android SDK底层的Instrumentation API来创建Note,对比了与Robotium框架的实现差异,并提供了创建Note的具体代码示例。包括启动活动、触发系统菜单、输入文本和保存Note的完整流程。
摘要由CSDN通过智能技术生成

除了高层框架如Robotium的solo,我们也可以直接调用SDK底层的提供的Instrumentation的API来实现如前几篇文章描述的创建一个note的功能。总所周知之Robotium就是基于Instrumentation的框架高层抽象实现的一个项目,所以对比《Robotium创建一个Note的实例》,我们可以看到robotium的实现比起直接调用Instrumetnation简介了很多。这就好比你用文本编辑器直接编写调用WIN32 API和通过Visual Studio调用高层封装的MFC实现相同功能的应用的差别。

该测试代码是建立在测试目标项目NotePad之下的


切记项目AndroidManifest.xml有两个地方需要添加才能正常运行


相对之前的例子,我们这里没有提供最后的查找到新创建的Note然后删除的功能,因为我暂时还没有查到在Instrumentation如何获得一个没有ID的ListView下面的一个TextView,当前我知道的Instrumeentation下只有findViewById的功能。

实例如下:

package come.excample.android.notepad.test;

import com.example.android.notepad.NoteEditor;
import com.example.android.notepad.NotesList;


import com.example.android.notepad.R;

import android.app.Activity;
import android.app.Instrumentation;
import android.app.Instrumentation.ActivityMonitor;
import android.content.Intent;
import android.os.SystemClock;
import android.test.InstrumentationTestCase;
import android.view.KeyEvent;
import android.widget.TextView;

public class InstrumentationTest extends InstrumentationTestCase {
	NotesList mActivity = null;
	//private static Instrumentation instrumentation = new Instrumentation();
	
	@Override 
	protected void setUp() throws Exception {
		super.setUp();
		
		//Start the NotesList activity by instrument
		Intent intent = new Intent();
		intent.setClassName("com.example.android.notepad", NotesList.class.getName());
		intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		mActivity = (NotesList) getInstrumentation().startActivitySync(intent);
	}
	
	 @Override
	    protected void tearDown()  {
	        mActivity.finish();
	        try {
	            super.tearDown();
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	 }
	
	 public void testActivity() throws Exception {
	        
		 	//Add activity monitor to check whether the NoteEditor activity's ready
	        ActivityMonitor am = getInstrumentation().addMonitor(NoteEditor.class.getName(), null, false);
	        
	        //Evoke the system menu and press on the menu entry "Add note";
	        getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_MENU);
	        getInstrumentation().invokeMenuActionSync(mActivity, R.id.menu_add, 0);
	        
	        //Direct to the NoteEditor activity
	        Activity noteEditorActivity = getInstrumentation().waitForMonitorWithTimeout(am, 60000);
	        assertEquals(NoteEditor.class,noteEditorActivity.getClass());
	        SystemClock.sleep(3000);
	        //assertEquals(true, getInstrumentation().checkMonitorHit(am, 1));
	        
	        //Input the text of the new created note
	        TextView noteEditor = (TextView) noteEditorActivity.findViewById(R.id.note);
	        getInstrumentation().runOnMainSync(new PerformSetText(noteEditor,"Note1"));
	        
	        //Save the new created note
	        getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_MENU);
	        getInstrumentation().invokeMenuActionSync(noteEditorActivity, R.id.menu_save, 0);

	    }
	 
	 private class PerformSetText implements Runnable {
	        TextView tv;
	        String txt;
	        public PerformSetText(TextView t,String text) {
	            tv = t;
	            txt = text;
	        }
	  
	        public void run() {
	            tv.setText(txt);
	        }
	    }
	 
	 //TBD, currently don't know the way to perform deleting of a menu entry by context menu options, have to roll with it
	 /*
	 private class PerformLongClick implements Runnable {
	        TextView textView;
	        public PerformLongClick(TextView object) {
	            textView = (TextView) object;
	        }
	  
	        public void run() {
	            textView.performLongClick();
	        }
	    }
	 */
	 
}

Java Agent是Arthas使用的技术,是Skywalking使用的技术,是一份十分重要的技术。 课程的稀缺性在此之前,市面上并没有针对Java Agent进行系统介绍的课程。 通过搜索引擎查找,会发现与Java Agent相关的内容大多是个人知识总结分享的内容。这些内容有如下特点:内容质量不一详略程度不一学习难度千差万别总体上来说,学习者很难有一个整体认知、系统学习的过程。 课程的设计目标 在构思课程内容时,本课程带有以下目标:课程学习梯度:从简单到复杂,让学习者有一个循序渐进的理解过程。构造完整、统一的知识体系:不是零散的知识点堆砌,而是有一个统一的贯穿始终的知识框架。具有可操作性的代码示例,不只是讲概念,更注意于实践。课程内容安排 本课程通过四章内容对Java Agent相关知识进行讲解:第一章,介绍Agent Jar的三个组成部分:Manifest、Agent Class和ClassFileTransformer。第二章,介绍Agent Jar的两种启动方式:从命令行启动和使用Attach机制启动。第三章,介绍如何利用Instrumentation API来实现Agent Jar的功能。第四章,Java Agent的应用与技巧。 通过本课程的学习,让同学们更好地建立起一个完整的知识体系:  讲师介绍我叫刘森,南京师范大学研究生毕业,2015年获得信息系统项目管理师(高级),2014年获得系统集成项目管理工程师(中级)。 目前,我的课程都是围绕着“Java字节码”技术展开: 《Java Agent基础篇》是在一个运行JVM当中提供修改字节码的机会《Java ASM系列》(免费课程)是一个操作字节码的类库《Java 8 ClassFile》专注于字节码的理论知识,入选为“51CTO数字化人才证书项目认证课程” 因此,我对字节码技术有较为深入的研究和理解,大家想学习字节码的技术可以找我:字节码技术找刘森,轻松学习又省心~~~ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值