软件不仅是开发那么简单

软件不仅是开发那么简单

7个月前 (03-09) 浏览: 399 评论: 6

许多“有抱负”或者热爱编程的程序员,对全栈工程师可能都是孜孜以求。全栈是一种极客精神,对软件的每一种编程语言、每一个开发平台都有着浓厚的兴趣,并愿意为之付出努力,全栈工程师应该对软件各个方面都有广泛的接触面,对软件有深刻的洞察力,这种广而深的见识将让我们开发出更加高效率地开发应用。 我们周遭的人对全栈的描述往往是“我熟悉C/C++,java;swift,Ruby都会一点,还能开发IOS、Android、Windows应用,Web前端后端都做过。用过这些框架:……” 全栈元素周期表,来自xebialabs 是的,在没有接触ThoughtWorks之前,我对全栈的定义就是这样的,什么语言都“会”,至少写过,各个平台上的开发都有经验。在这种定义下,我会略自负地讲自己算是一个全栈工程师吧。甚至,哈哈,除了上面讲的这些,我还开发过硬件平台上的软件(Arduino),自己用PS为自己的Android客户端设计过界面、图标,鼓捣过图标字体。是呀,想想这就骄傲,突然发现自己会那么东西。(当然了,理性地讲,其实自己心知肚明也就是“会一点”。) 窃认为我本人是一个对生活比较有想法的人,当我发现生活中有一些可以用软件来解决问题的时候,我喜欢自己开发出软件来解决:比如 我曾因为看到大学请假不方便,然后开发出给学生、辅导员、任课老师使用的请假APP,这个最后作为我Android开发实践课的大作业作品,老师打了100分;由于学校会经常让学生签到,我和几个同学利用微信公众号首先让学生在微信上签到并且获取他们的地理位置;由于在火车上无聊,我和几个同学做出一个在火车上搭建局域网然后借助我们的系统让乘客在火车上点餐、看电影、看火车沿途风景直播、到站提醒的应用……。在这个过程中,我得到很大的满足感和成就感,也学会了更多的软件技术,似乎离“全栈”更近了一步。 产品不仅是有想法就去干,而是持之以恒的打磨,它许多软件开发的多个角色地合力完成 暑假在腾讯实习的两个月,学习到的技术实际上是其次的;甚至因为实习颠覆了之前对BAT神一样存在的看法。他们的代码质量的确很高,但是并不是不食人间烟火,他们也会写Hard code,也会满百度、谷歌地贴代码。实习中让我看到的更多的是,一个好的互联网企业善于让多个角色之间进行良好的互动,它有一个成熟地为开发代码而做的系统;与我们在学校里不同的是,一个来自与产品和测试的需求、Bug工单流传到开发有一个完善严格的流程。 我做过的许多东西,实际很多都没有投入使用,仅仅是自己的自娱自乐,一个软件产品真正投入大规模使用,需要大量人力去做产品、运营。然后,我热爱开发,但是觉得产品、运营是个麻烦事。 入坑越久,你以为越渊博,实际上不自知视野变小了 校招,加入了我一个很喜欢的公司:ThoughtWorks(TW),TW是一个崇尚分享的公司,她期望我们把我们自己的想法用文章的形式表达出来。在周末时间,公司安排了职前培训,其中有一项任务是让我们在简书上写我们的学习过程、分享心得感受。同时公司的培训团队(“思沃大讲堂”)还会定期统计我们的文章,统计方式是做了一个爬虫抓取简书上的文章信息然后汇总输出报告。 当时,我正在学习Ruby网络请求的知识,看见每周一次发来的文章统计报告,我就萌生了做一个Ruby爬虫的想法。做出来以后我输出了一篇文章到简书,负责TW培训的李鹏大哥(下称“总理”)看到以后,便决定让我的代码来做帮助同学们统计文章的工作,之后让我专门成立了一个小团队:思沃大讲堂爬虫项目组 我最初想成立这个项目组的目的,帮我们统计文章只是其一,更重要的是我想通过这个项目带动自己的Ruby学习进程。而总理的目的则是,希望学习项目开发的过程,让更多的人参与、合作。 到今天,几个月过去了,虽然爬虫组虽然基本能定期给参加思沃大讲堂的同学们发送一份统计报告,但是远远没有达到初衷。个人的出发点,本来想把报告做的更漂亮一点,页面中加入一些图片、报表等直观的视觉效果,加入文章排行提高同学们的活跃度,通过简单的算法实现好文章、优秀作者的推荐,找出最贴心的小buddy等等。从这些我想达到的初衷讲,这个项目显然失败了,而失败的原因,也正是总理 想要我们通过这一项目培养的项目开发、交流合作等方面的能力不足。 这个项目中,作为项目发起人,我最早为项目勾画了一个蓝图,搭建起项目的框架。一个在自己看起来很简单的一个需求点,对于自己看来实现起来也十分简单,但是传达给项目成员并实施却十分困难;首先,对于项目发起人,可能会根据自己的一些经验提出一些需求点,虽然这些需求在提出时就经过自己的大脑过滤是可实现的,但是对于没有相关经验的其它团队成员来说,他们认为的可不一定有那么简单。作为作为软件工程科班出身的学生,在我们“稚嫩”的认识中,软件的世界里似乎只有程序员这一个角色,当然“只有”这个词说的太偏执,诚然我还知道产品、测试、运营、运维等角色,但是长期囿于学校里小型项目的学生,往往长期忽略了产品甚至测试的重要性,产品,提需求的是我们;测试,我们写代码的自己测,不重要的地方就省掉吧;运维,随便搭个服务器呗。我们把软件开发的绝大部分重心放在开发上面,做软件就是开发,这一意识的植入,将会导致深重的开发本位思想,或者做事情的都站在开发的角度。比如作为一个项目发起人,我负责这个项目要实现什么样的功能,带着开发思维,是这样提“工单”的: 实现数据库中插入和更新文章信息(封装成一个方法),用于以后在爬虫抓取文章信息后直接调用 甚至我还会写明大家使用Sqlite3数据库。这样的工单开发思维就比较重了,作为项目发起人、作为产品、作为BA(业务分析),这样的单子就严重越权了,我们的职责应该是作为一个角色,要达到什么效果,这样做有什么价值(As a role,I want to …, so that …),具体怎么做应该交给开发,而不是用什么技术都要规划好。当总理指出我的错误,我却依旧带着“开发”的思维来规划项目时,我想我“入坑”依旧了。 或许,对于一个个人项目,我们可能有非常清晰的意图知道自己接下来做什么,然而,做一个较大的项目始终依托团队来完成,作为“世界上最复杂的逻辑实体”,软件是越来越难被一个人完成的。 我所看到“市面”上的“软件工程师”,坦诚地讲,往往等同于“码农”,或者通俗地讲就是“写代码的”。写代码,码农,从“软件工程”的学科定义来讲,并不能算的上是软件工程师的,更谈不上全栈软件工程师。作为一名“科班出身”的“软件工程”专业的学生,教科书上的定义翻译成通俗点的话是这样的:用工程化的方法来开发软件。 而我想,作为工程,应该是怎样规划“施工”,怎样管理团队,怎样让工程更加高效、有序地进行,而这正是软件工程师与“写代码的”之区别本质所在。而全栈,也不仅仅是局限于开发技术上的全栈,而是包括业务分析、项目管理等等软件工程应用上的全栈。   版权印为您的作品印上版权22104666

Emmet优雅地搭建起Html骨架

Emmet优雅地搭建起Html骨架

10个月前 (12-05) 浏览: 173 评论: 0

曾经看见一位学长在PHP-Storm上输入一段奇怪的代码,当他按下了Tab键后,神奇的事情就发生了。 如果HTML也是一种编程语言的话,私以为Html会是我们接触到的最多的编程语言。可能有人并不知道什么是HTML(超文本标记语言),但是当他人生中第一次上网打开浏览器浏览网页的时候,他与HTML的邂逅就开始了……只是当初,他不知道纷繁绚丽的网页的背后,是HTML语言在默默支撑; HTML+JS+CSS是前端的三大语言。如果把网页比作人的话,HTML给了人以骨架,CSS未知赋予了血肉、发肤以至衣物、妆饰,而JS则给了他运动的灵魂。 这边文章从HTML讲起,对于HTML的基本知识在此就不便赘述了,Google一下,你就知道。在此,我主要讲的是怎样快捷地搭建起HTML的骨架。 把HTML比作骨架并非我心血来潮,我只是在告诉自己写HTML页面要有搭框架的意识。不瞒你说,我以前的HTML的代码都是拼凑而成的。哪里不对改哪里,效率很低。正向箭头 + 标签名+反响箭头这种重复的代码,写多了就觉得腻了。那么有没有什么快捷的方式让我们关注HTML的架构本身,而不是繁杂的html语言本身呢? 用Emmet Tab一下 Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生。它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度 Emmet 的语法极客人目前还只是刚刚入门,这里主要是抛砖引玉一下,给大家几个例子,更专业的介绍与教程,给大家推荐下面文章:http://www.iteye.com/news/27580 ,在此我也就不大篇幅地复制粘贴了。 ** 输入“!”或“html:5”,然后按Tab键: ** * ** 连续输入元素名称和ID,比如输入p.foo: ** 还有一些较复杂的用法大家自行研究,在此不做赘述,因为我的作用就是抛砖引玉,勾起大家的兴趣。 ** 要见证奇迹的话建议自己亲手试一下!!** 一个例子:实现列表 我要实现的效果如下: 按照搭建骨架的意识,我们得弄清这个列表的结构是什么样子: ** 最外层一个无序列表,这个无序列表每个列表项都嵌套一个有序列表,这个有序列表有两个列表项,每个列表项含有个无序列表 ** Emmet语法如下:   Tab一下: 然后把文字填进去   效果预览 > Javascript 第一章 const let 第二章 function object Java 第一章 class package 第二章 private public 参考文章: * http://www.iteye.com/news/27580 * http://www.powerxing.com/emmet-syntax-cheatsheet/

Gradle下利用配置文件对构建工具版本集中控制

Gradle下利用配置文件对构建工具版本集中控制

1年前 (2016-08-12) 浏览: 120 评论: 0

由于Android studio和Android相关SDK和构建工具具有极快的更新速度。对相关版本的修改有时候是一件比较敏感的事情,尤其是在团队项目中,个人在本地修改了相关工具的版本并且不小心提交到远程代码库,别人更新下来往往出现各种问题。Android studio项目文件中版本字段十分分散,当SDK环境出现改变时,修改起来还是比较麻烦的。本文章利用配置文件对构建工具版本集中控制。 在项目根目录下gradle.properties文件定义版本信息并赋值   在使用版本信息的地方引用gradle变量 Dependencies build.gradle(project) build.gradle(module)

火车局域服务系统

火车局域服务系统

2年前 (2016-03-19) 浏览: 250 评论: 2

长长的火车,长长的旅程,常常长达20多小时的火车行程,令我们疲惫不堪。我们发现,封闭的火车就像一个迷你的大千世界,我们想在火车上建立一个局域网相连的信息“生态系统”。传统的火车订餐,需要乘务员拉着餐车询问乘客,常常无功而返;火车进入隧道时,我们的手机讯号全无,仿佛与世隔绝;有时我们和同道人不在邻座,换座十分麻烦。。。我们可以做一个基于火车环境的局域网信息系统: 在火车每个车厢放一个路由器,将所有路由器进行桥接,建立一个局域网,搭建服务器,提供一下服务: 一、订餐;乘务人员定点送餐,送餐地点为乘客座位号 二、乘客沟通换座与聊天; 三、替代当前的乘务人员对讲机; 四、火车到站提醒; 五、火车到站推送当地风土人情,趁机植入广告; 六、资源共享,乘客访问火车服务器观看上面的电影、听音乐、收听电台等;

百度地图API位置偏移的校准算法

百度地图API位置偏移的校准算法

2年前 (2016-02-17) 浏览: 2012 评论: 0

在开始使用百度地图API进行开发时可能会遇到一件相当奇怪的事情,使用百度定位的经纬度在地图上显示相当不准确,这一问题我在微信开发和安卓开始时都遇到过。第一次使用百度地图api获取位置并在地图上显示是在微信开发的时候,那是不知道具体原因无奈在微信获取的地理位置上加了一个偏移量进行校准,虽能勉强解决,但是不太准确。后来在安卓开始也同样遇到了这个问题,才发现百度地图API定位偏移已经不是一个偶然问题了。 百度地图API定位偏移的原因 以下来自互联网: 一、坐标体系 首先我们要明白,开发者能接触到哪些坐标体系呢? 第一种分类: 1、 GPS,WGS-84,原始坐标体系。一般用国际标准的GPS记录仪记录下来的坐标,都是GPS的坐标。很可惜,在中国,任何一个地图产品都不允许使用GPS坐标,据说是为了保密。GPS坐标形式如图,度分秒形式的经纬度:   2、 GCJ-02,国测局02年发布的坐标体系。又称“火星坐标”。在中国,必须至少使用GCJ-02的坐标体系。比如谷歌,腾讯,高德都在用这个坐标体系。GCJ-02也是国内最广泛使用的坐标体系。 3、 其他坐标体系。一般都是由GCJ-02进过偏移算法得到的。这种体系就根据每个公司的不同,坐标体系都不一样了。比如,百度和搜狗就使用自己的坐标体系,与其他坐标体系不兼容。 第二种分类: 首先明白,所有坐标体系的原点,都是非洲。 1、 经纬度。这个是球面坐标,对于北京来说,就是(116.38817139.935961)这样的坐标。比如腾讯、高德、百度都是这样的经纬度坐标。谷歌是经纬度顺序写反的经纬度坐标。 如果是度分秒坐标,需要进行转换,才能得到这样的经纬度坐标。详见坐标转换。 2、 墨卡托坐标。平面坐标,相当于是直线距离,数字一般都比较大,像这样的。(215362.00021333335 99526.00034912192) 墨卡托坐标,主要用于程序的后台计算。直线距离嘛,加加减减几乎计算方便。 搜狗地图API就是直接使用的墨卡托坐标。 二、坐标转换 在各种web端平台,或者高德、腾讯、百度上取到的坐标,都不是GPS坐标,都是GCJ-02坐标,或者自己的偏移坐标系。 比如,你在谷歌地图API,高德地图API,腾讯地图API上取到的,都是GCJ-02坐标,他们三家都是通用的,也适用于大部分地图API产品,以及他们的地图产品。 例外,百度API上取到的,是BD-09坐标,只适用于百度地图相关产品。 例外,搜狗API上取到的,是搜狗坐标,只适用于搜狗地图相关产品。 例外,谷歌地球,google earth上取到的,是GPS坐标,而且是度分秒形式的经纬度坐标。在国内不允许使用。必须转换为GCJ-02坐标。 1、度分秒坐标转换为经纬度 比如,在GPS记录仪,或者google earth上采集到的是39°31'20.51,那么应该这样换算,31分就是31/60度,20.51秒就是20.51/3600度,结果就是39 + 31/60 + 20.51/3600 度。 2、 GPS转换为GCJ-02坐标 谷歌,高德,腾讯的地图API官网上,都不直接提供这样的坐标转换。如果要得到GCJ-02坐标,最好在他们的地图上直接取点,或者通过地址解析得到。(这个工具我后续会贴出来的。我就爱干这样的事情,哈哈。) 不过,在网上搜到了这样的接口,该接口的type=1就是GPS转到GCJ-02的墨卡托坐标。请大家对接口保密,哈哈。详见: http://map.sogou.com/api/documentation/javascript/api2.5/interface_translate.html#late_intro 3、GCJ-02与BD-09之间互转 国测局GCJ-02坐标体系(谷歌、高德、腾讯),与百度坐标BD-09体系的转换,在CSDN上有很详细的讲解: http://blog.csdn.net/coolypf/article/details/8569813 不过也有更简单的算法,线性算法(lat和lng是经纬度,球面坐标): To_B是转到百度,To_G是转到GCJ-02。 var TO_BLNG = function(lng){return lng+0.0065;}; var TO_BLAT = function(lat){return lat+0.0060;}; var TO_GLNG = function(lng){return lng-0.0065;}; var TO_GLAT = function(lat){return lat-0.0060;}; 4、经纬纬度转成墨卡托 网上也有详细讲解: http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=78245 (大家发现没,高德是api,腾讯和百度是mapapi,说明什么?) 三、坐标偏移 如果您的坐标在转换之后,还有偏移,那么考虑以下几个方面。 A、原始坐标系弄错,比如以为自己是GPS坐标,但其实已经是GCJ-02坐标。 解决方案:请确保采集到的数据是哪个坐标体系,需要转换到哪个坐标系,再进行坐标转换。 B、原始坐标准确度不够 解决方案:如果您是GPS坐标,请确保采集GPS数据时,搜到至少4颗以上的卫星。并且GPS数据准不准,还取决于周围建筑物的高度,越高越不准,因为有遮挡。 如果本来就是GCJ-02坐标,在不同地图放大级别的时候,看到的地方可能不一样。比如你在地图级别4(国家)取到的坐标,放大到地图12级(街道)时,坐标就偏了。请确保在地图最大放大级别时,拾取坐标。 C、度分秒的概念混淆 比如,在google earth上采集到的是39°31'20.51,那么应该这样换算,31分就是31/60度,20.51秒就是20.51/3600度,结果就是39 + 31/60 + 20.51/3600 度。 D、经纬度顺序写反了 有些公司(比如高德,百度,腾讯)是先经度,再纬度,即Point(lng lat)。但谷歌坐标的顺序恰好相反,是(lat lng)。 相关问题的百度解释:http://developer.baidu.com/map/question.htm 百度地图API位置偏移的校准算法 C++算法  

AndroidStudio代码混淆和NDK预防apk反编译

AndroidStudio代码混淆和NDK预防apk反编译

2年前 (2016-01-09) 浏览: 763 评论: 0

代码混淆 什么是代码混淆 Java 是一种跨平台的、解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中。由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名、方法名,并且通过这些名称来访问变量和方法,这些符号带有许多语义信息,很容易被反编译成 Java 源代码。为了防止这种现象,我们可以使用 Java 混淆器对 Java 字节码进行混淆。 混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。被混淆过的程序代码,仍然遵照原来的档案格式和指令集,执行结果也与混淆前一样,只是混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,在缺乏相应的函数名和程序注释的况下,即使被反编译,也将难以阅读。同时混淆是不可逆的,在混淆的过程中一些不影响正常运行的信息将永久丢失,这些信息的丢失使程序变得更加难以理解。 混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的缩短变量和函数名以及丢失部分信息的原因, 编译后 jar 文件体积大约能减少25% ,这对当前费用较贵的无线网络传输是有一定意义的。   NDK将应用的核心代码或通讯协议打包成so文件 NDK可以实现代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。 因为java是半解释半编译性语言,,先将java的代码解释成CLASS文件,然后编译给计算机中的JVM虚拟机,然后由虚拟机调用相应的计算机部件进行运算,而安卓的SO文件是linux下的文件,用c或者c++写的,c++你可以看做是C的扩充版,C有良好的机器兼容性,就是因为它可以直接编译为机器指令,执行效率相对java高,而java是跨平台移可植性强大。 C/C++更接近底层系统实现和依赖于编译器,不同编译器生成的二进制代码会相对不同平台有所区别,甚至同一操作系统不同系列的编译器都会有一点差异,比如在linux下编译C/C++得到的二进制代码就很难或无法运行在windows平台上,反之亦然,所以反编译很困难,现在大多数反编译软件都只能反编译成汇编。有一些号称可以反编译成C或者C++的工具,但反编译出来的结果大多看不明白,还不如用汇编。  

第一个android studio+NDK程序

第一个android studio+NDK程序

2年前 (2016-01-08) 浏览: 130 评论: 0

NDK(android native develop kits ):android 本地开发工具集 ,可以把c/c++ ->编译成一个 linux下可以执行的二进制文件 java代码里面就可以通过jni 调用执行二进制的文件。 什么是JNI :java本地开发接口,JNI是一个协议这个协议用来沟通java代码和外部的本地代码(c/c++).通过这个协议,java代码就可以调用外部的c/c++,代码外部的c/c++代码也可以调用java代码。 java可以实现上层应用的开发,但是不能写底层驱动,有些android项目必须和底层硬件打交道,比如要精确快速的获取某种传感器的值,那么java是不能办到的,那怎么办,就通过JNI开发,通过c/c++完成底层驱动或者值得获取,然后将值传回到java层。同样java层也可以将数据传递给c/c++层,这样通过JNI完成数据的交互。 为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。 2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。 3. 便于移植,用C/C++写的库可以方便在其他的嵌入式平台上再次使用。 MainActivity: 下面是通过javah命令自动生成的 cn_wangbaiyuan_ndktest_MainActivity.h   在build.gradle(Module:App)加入下列配置可指定生成.so文件的CPU平台类型以及so文件的名称,如果没有指定,android将会生成libapp.so,以及所有平台的so文件;生成so文件路径为:你的项目根目录\app\build\intermediates\ndk\debug\lib build.gradle(Module:App)    

安卓实现打开指定链接调用其他应用程序

安卓实现打开指定链接调用其他应用程序

2年前 (2016-01-01) 浏览: 110 评论: 0

有些网站在网页上设置了点击跳转到其官方APP上的链接,比如京东;近期在做王柏元的博客客户端上我加入此功能,用以打开网页上的链接调用我的客户端打开相关文章。下面是实现方法: 安卓实现打开指定链接调用其他应用程序 在打开指定链接需要跳转到的Activity的AndroidManifest.xml清单文件中中加入一条intent-filter标签,并如下面的例子设置scheme、HOST等属性。 并做了一个网页亲测成功:  

微信开发获取位置与百度地图经纬度解析

微信开发获取位置与百度地图经纬度解析

2年前 (2015-12-14) 浏览: 787 评论: 3

微信开发中我们常常需要知道用户的位置,在微信的JS-SDK中提供了访问地理位置的方法,这不需要你的公众号是认证账户,普通未认证的订阅号也有访问地理位置的权限。 微信开发获取位置与百度地图经纬度解析 根据微信公众号开发者文档中的 JSSDK使用步骤 1.1.1 步骤一:绑定域名 1.1.2 步骤二:引入JS文件 1.1.3 步骤三:通过config接口注入权限验证配置 1.1.4 步骤四:通过ready接口处理成功验证 1.1.5 步骤五:通过error接口处理失败验证 微信开发获取位置与百度地图经纬度解析,我们可以根据官方文档可以获取很多高级功能,这里就不赘述。可能比较棘手的是后面遇到的消息签名问题。下面是官方给的代码: 在PHP中调用: 在HTML中加入js代码: 调用js代码获取经纬度: 百度地图经纬度解析 微信JS-SDK提供的只是经纬度,而不是像“陕西省西安市”这样的地理位置,下面是将经纬度转为地理位置的PHP函数,调用的是百度地图的web-api:

Android模拟点击按钮

Android模拟点击按钮

2年前 (2015-10-02) 浏览: 527 评论: 0

在安卓开发过程中,常常会出现在不同的环境的情况下执行相同的操作,当然我们很容易想到的方法就是将相同的操作抽出来放在一个函数中,在执行相同或者类似的操作中只需要届时运行函数即可。如果执行的函数在不同的类或者activity(当然activity也是类),我们只需要将函数的访问等级定义为public static即可。 上面的相信即使是最基础的开发者都知道,似乎极客人在此没有什么说的必要。在一个类A中调用另一个类B的公用静态方法b时,如果方法b中使用了类B的其他变量c、d、f等等,在修改方法b为公用静态时还要将类B的变量c、d、f一并修改为静态变量,因为静态方法不允许调用非静态变量,这一改往往牵一发而动全身。 有时候我们常常会恰巧遇到这种情况:类B中执行的操作就是点击Activity某一个按钮所进行的操作。比如我们在开发一个安卓app时常常有一个应用更新的功能,进入MainActivity时,app往往在后台神不知鬼不觉地执行一下检查更新的操作,同时在APP的“关于”页面我们还能让用户手动点击button然后“检查更新”。其实这两个检查更新的执行动作是一模一样的,如果重复写在两个Activity中将十分麻烦。,这个时候我们不妨尝试一下安卓按钮的模拟点击,实现代码模拟人手点击按钮。 代码: 调用performClick()可引发 Click 事件

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

切换登录

注册