创建一个apk:按钮-click-文字display,测试apk;安装在真机进行调试的方法
问题引入:
怎么样在一个app做event事件?例如touch操作,滑动操作,和按键事件(back,home等)
回答1:device.touch(x,y) ---获取device对象,然后touch操作,这是monkeyrunner选手,用了monkeyrunner类,基于坐标
回答2:solo.clickOnView(string)---Robtium选手,使用solo类,里面很多方法查找控件,点击这样一个视图,把ID传进去,点击即可。基于控件的自动化框架
回答3:driver.findElement(By.name("Add contact".click())) ---selenium选手,定义浏览器driver,只要拿到核心driver,就能实现
回答4:不允许用任何开源的和不开源的自动化框架,howto?---Instrumentation选手,使用google基类完成
20140424
思路:
新建apk项目 - > 新增Button 、TextView ->在按钮点击事件里里添加获取TextView的内容
1. 使用Eclipse新建项目。
2. 根据Google release文档,图形化界面使用view实现,Android对于View和ViewGroup的子类提供一系列基于XML的命名和定义,因此,可以用XML来定义用户界面。sdk 4.4使用fragment代替了原来写死的布局。一方面更能体现出模块化设计,另一方面对于不同屏幕尺寸的适配也更为容易。好吧,在fragment_main.xml中捣鼓:顺序是linearlayout布局设定,添加需要的组件,组件里用到资源的,到values文件夹下添加。
Tips:遇到的标签:
RelativeLayout--- 相对布局可以控制组件摆放的位置(放在任一组件的上下左右等位置) 参考http://blog.csdn.net/kaypro/article/details/10156773
LinearLayout --水平布局 http://www.cnblogs.com/songtzu/archive/2012/07/11/2586462.html
二者对比:http://blog.csdn.net/renzhe333/article/details/12970565
基于此,我们使用LinerLayout,然后里面放个button和Textview
到这里,此布局将被用于在创建项目时SDK工具生成的缺省Activity类,现在可以通过运行一下,已经看到界面出来啦。
3. 添加按钮响应事件,同时需要将默认textview值隐藏,待点击后方可出现。
Tips:
所有“Activity”的子类必须实现“onCreate()”方法。当系统创建一个此activity的新实例的时候,将调用此方法。这个方法就是你使用“setContentView()”方法定义activity布局和为activity的各个构件(components)初始化设置(initial setup)的地方。
要在屏幕上显示这则消息,需要创建一个“TextView”部件(widget)然后通过“setText()”方法设置它的显示文字。因此,通过“setContentView()”方法,将“TextView”添加到布局中作为activity的根视图元素。
不过此处不用更改onCreate(),因为并没有新建一个Activity,只是把OnClick方法中实现TexView
- public class APK4MainActivity extends ActionBarActivity {
- private TextView tv = null;
- //View.OnClickListener mOnClickListener = null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.fragment_apk4_main); // this code always should be put forward.
- tv = (TextView) this.findViewById(R.id.textview1);
- Button button=(Button)this.findViewById(R.id.btn1);
- button.setOnClickListener(mOnClickListener);
- }
- View.OnClickListener mOnClickListener = new View.OnClickListener() {
- // mOnClickListener = new View.OnClickListener() {
- public void onClick(View v) {
- //send_msg(v);
- if(v.getId()== R.id.btn1) //由于有很多中view的onCLick事件,系统需要知道是不是buttonID的事件,因此获取view的ID
- tv.setText("OKKK");
- }
- };
- public class testapk4ianthe extends InstrumentationTestCase{
- //明确一个Activity,让Instrumentation找到目标apk的主Activity入口类
- APK4MainActivity mActivity = null;
//声明button变量,用来存放下面用findViewByID得到的button控件- private Button btn1 = null;
//声明textview变量,用来存放findVIewByID得到的TextView控件- private TextView tv1 = null;
- //为ddms行方便,查看log
- private static final String tag="ianthe";
- /**
- * @测试setUP初始化
- */
- @Before
- public void setUp() throws Exception {
- //这是程序初始化过程,第一步是调用父类方法
- super.setUp();
- // 初始化意图请求
- Intent intent = new Intent();
- //通过找到包 - 类名,让intent知道程序源的信息
- intent.setClassName("com.example.apk4ianthe", APK4MainActivity.class.getName());
//设置intent标志位,这个参数常用在setup中。Activity的intent跳转到另外Activity有四种模式,这是标准模式- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- //重要函数getInstrumentation()登场!!!它用来得到Instrumentation实例,相当于new Instrumentation,之后可以使用Instrumentation中的方法了。得到目标Activity的主入口(其实哪个Activity启是在menifest.xml中指定好的)
- mActivity= (APK4MainActivity) getInstrumentation().startActivitySync(intent);
//找到被测试apk的主要控件- tv1=(TextView)mActivity.findViewById(R.id.textview1);
- btn1=(Button)mActivity.findViewById(R.id.btn1);
- }
- @Test
- public void test() throws Exception{
- //健壮性测试
- for (int i = 0;i <5;i++){
//阻塞性方法,比如如果主线程timeout了,则整个没有响应;如果是网络下载按钮,则timeout后出现ANR. runOnMainSync()需要一个线程类对象,提出来单独写比较好。- getInstrumentation().runOnMainSync(new PerformClick(btn1));
- SystemClock.sleep(500);
- Log.i(tag, "-----点击!!");
- }
- assertEquals("OKKK",tv1.getText().toString());
- }
- private class PerformClick implements Runnable{
- Button btn;
- public PerformClick(Button button){
- btn = button;
- }
- @Override
- public void run(){
- btn.performClick();
- }
- }
经常遇到的问题是,缓存问题。解决方法是重启Eclipse。写java文件之前,要记得在AndroidMenifest.xml中添加:
<instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="被测包名" />
以防万一,在<application>里面加入<uses-library android:name="android.test.runner" />
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);这里涉及到Activity启动模式(需要在menifest.xml中设置),查了资料大概这样子的:
术语:任务栈 : 内部实现是链表,后进先出
standard ---标准默认启动模式,menifest里不加说明时,就是用的这种。activity按照先后顺序依次压入任务栈,再依次销毁。
singleTop---如果人物栈的栈顶元素,是要被激活的组件,不会创建新的Activity放在任务栈,而会复用栈顶的Activity。如果发现栈顶不是要激活的Activity,就会创建信的Activity放置到任务栈里面。使用场景:打开书签页,一口气添加N个书签,然后返回,用户体验好的情况是,按一次返回键就回到主标签Activity页,即此种模式,而不是一次一次回退到头。。。
singleTask---一般情况下,跟singletop类似:如果发现任务栈里已经有了要启动的Activity,它会去清空这个Activity上面的所有Activity,然后直接复用已经存在的Activity。场景:浏览器应用:BrowserActibity -> 开销很大,原理在于初始化webkit/c++嵌入式浏览器内核。为了节省开销,把broweractivity配置成singleTask,则可以复用 -- 以空间换时间
singleInstance--会开启一个新的任务栈,把要激活的actibity放置到新的任务栈里面。这个任务栈里面只有一个实例。不想被放到默认的任务栈里面,新开辟一个任务栈。场景:有道词典,在notification里点击直接进入查询界面,这个界面和有道主程序无关。
创建一个apk:按钮-click-文字display,测试apk;安装在真机进行调试的方法的更多相关文章
- [UWP]创建一个进度按钮
1. 前言 最近想要一个进度按钮. 传统上UWP上处理进度可以这样实现,首先是XAML,包括一个ProgressBar和一个按钮: <StackPanel Orientation="H ...
- android应用程序monkey压力测试(模拟器或真机)
首先需要安装一个模拟器: 前置条件: 1.jdk环境配置 2.eclipse下载安装(直接解压即可) 3.网站上下载ADT: 由于国内禁止google的浏览,所以需要自己上网找资源,下面这个网站有比较 ...
- 【转】让Xcode支持iOS12.0 设备真机测试(不断更新真机支持包)Xcode 真机测试 iOS
最新支持12.0 (16A366)! 所有真机包都是同一大版本号向下兼容.例如12.0 Beta6的真机包,是可以兼容12.0 Beta2及Beta1的. 12.0 (16A366)正式版可用!所有低 ...
- [UWP]创建一个ProgressControl
1. 前言 博客园终于新增了UWP的分类,我来为这个分类贡献第一篇博客吧. UWP有很多问题,先不说生态的事情,表单.验证.输入.设计等等一堆基本问题缠身.但我觉得最应该首先解决的绝对是Blend,那 ...
- 一个先进的App框架:使用Ionic创建一个简单的APP
原文 http://www.w3cplus.com/mobile/building-simple-app-using-ionic-advanced-html5-mobile-app-framewor ...
- Delphi XE7下如何创建一个Android模拟器调试
利用Delphi XE7我们可以进行多种设备程序的开发,尤其是移动开发应用程序得到不断地加强.在实际的Android移动程序开发中,如果我们直接用android真机直接调试是非常不错.一是速度快,二是 ...
- 创建一个vue-cli项
一.vue cli脚手架 Vue 提供了一个官方的cli,为单页面应用 (SPA) 快速搭建繁杂的脚手架,通过这个工具我们就可以很方便的来创建一个基于vue的项目. 二.安装一些必要的东西node.n ...
- Cordova之如何用命令行创建一个项目(完整示例)
原文:Cordova之如何用命令行创建一个项目(完整示例) 1. 创建cordova项目 (注意:当第一次创建或编译项目的时候,可能系统会自动下载一些东西,需要一些时间.) 在某个目录下创建cordo ...
- 创建一个 Laravel 项目
创建一个 Laravel 项目,首先需要安装 Composer ,如果没有安装的参考 https://docs.phpcomposer.com/00-intro.html 一.安装 Laravel 安 ...
随机推荐
- Python基础教程(006)--Python的特点
前言 了解Python背景,明白Python在目前社会中的标准库是有成千上万的Python爱好者共同维护的. 知识点 Python是完全面相对象的语言 函数,模块,数字,字符串都是对象,在Python ...
- Effective Objective-C 2.0
Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法 作者:Matt Galloway(英) 译者:爱飞翔 出版社:机械工业出版社 出版年:2014-01 ...
- 耗时十个月的德国APS,教会我的学习方法
考过了准备了10个月的Aps ,想送给关注我的8175个粉丝,一份礼物,感谢你们看的起我,对我的支持和关注. 这份礼物,我就大言不惭的称之为:达令的学习方法. 我的考试经历:高考两次,中戏艺考三试,导 ...
- jq动画效果慢慢滚动到固定位置
function contentTop(top){ $('body,html').animate({ scrollTop: top }, 500 ); } 获取元素top传入即可 contentTop ...
- Arduino入门套件 Arduino UNO R3
限时大抢购:原价5.6元超声波模块HC-SR04,现只需3元,亏本大甩卖,只赚人气,如需购买的客户请直接拍下以下链接3件=3元购买,备注超声波模块即可,每个客户ID每天仅限购一个.http://det ...
- leetcode上的位运算
136-只出现过一次的数字 思路:可以考虑到数字以二进制形式存储,当两个不同的数字异或的时候会是true,所以把数组里的数字都一一处理一遍就可以了. class Solution { public: ...
- 微信小程序,获取二维码
微信小程序,获取二维码 找到一篇很实用的博客,他已经写得很详细了,自己也懒得写,亲测有效 参考网址
- 用 Flask 来写个轻博客 (9) — M(V)C_Jinja 语法基础快速概览
#目录 前文列表 扩展阅读 Jinja 变量名 注释 控制语句 if 语句 循环 过滤器 无参数调用 带参数调用 宏 定义宏 调用宏 结果 兼容 JavaScript 前文列表 用 Flask 来写个 ...
- Spingboot整合Redis,用注解(@Cacheable、@CacheEvict、@CachePut、@Caching)管理缓存
背景:项目从头开始,需结合Springboot和Redis 需求:用注解管理缓存 方法: 一.用Redis取代Springboot原有缓存 1.pom引入依赖 2.applicatio ...
- vim以超级用户权限保存文件
以普通用户打开文件 保存时执行 :w !sudo tee % > /dev/null