促使开发者工具整合有四个因素:集成的挑战、端到端性能监控、发现瓶颈,以及艰难的B2D经济。
2013开发者经济研究发现选择工具最重要的两大因素之一是易于集成。通过将多种工具集于一身,降低开发者在集成的开销。
其次,整合被端到端的应用性能监控需求所驱动。应用下载样式尚不能充分了解,但可了解哪个广告网络和渠道引导用户下载,下载中哪些可转为有效用户。在此,沿开发者之旅的整合变得有价值,例如应用商店分析Distimo有机扩展到用户分析。在开发者之旅中扩展服务的范围,同样有助于厂商深入开发者档案信息。
第三,整合被日益成熟的B2D市场所驱动。工具发现之于开发者就如应用发现之于消费者般困难。除VisionMobie的开发者经济门户外,没有直接的开发者工具搜索引擎。占据先机的厂商,如Flurry,或在桌面领域占有优势,如Google分析,常常可以在工具发现瓶颈下生存。结果是,很多开发者工具类别倾向于整合到一个或两个厂商:用户分析的Google和Flurry,应用商店分析的App Annie和Distimo,后端即服务的Parse,广告网络的Google(adMob),交叉推荐网络的Tapjoy和Flurry。
最后,整合被艰难的B2D经济所驱动。开发者服务已是零门槛,意味着开发者采用新工具零成本,花费最小精力,这趋势继承了PC/Internet开发者市场。开发者工具创业公司的策略通常是到达量第一,收入第二,在开发者支付服务之前,将SDK价格降至零以获取用户。
因此,只靠自己的工具厂商难以与获得风投的创业公司竞争,很快投降或被收购。随着市场成熟,只有拥有强大财力的厂商才能生存。
预期直至2015年,即B2D市场诞生后6年,开发者工具的整合趋势都不会减缓。同时,这不应是开发者推延决定采用新工具的借口。开发者应在选择某个工具前进行调查,避开工具厂商因缺乏市场牵引力而消失的陷阱。
整合会使新类型的大型SDK厂商兴起,它们集成开发者之旅的最常用类别的工具。我们认为整合将围绕两大工具类型:营销工具和企业移动服务。不仅是这两类型受欢迎,而且他们与开发者收入直接需求相关,有更大生存机会。
只要应用发现瓶颈存在,移动营销重要性就只会增加。如今的开发者不仅是编程者,设计师和企业家,更重要的是精明营销人员,将想法转变为认知和金钱。当应用数量从1.5M发展到10M,Apple和Google商店继续主导应用发布,发现瓶颈只会更糟。传统的应用营销方法是移动广告,根据Gartner的数据,估计在2012年有$114亿市场。这里挤满了数百家广告网络和广告交换公司。但赢家很少,如Google,作为传统的在线广告网络收购了AdMobe,将服务扩展至移动,并可在Android应用中集成。
“在大众消费应用领域,更多是炒作和英雄应用。在企业方面,你必须能用投资回报率说服商务人士。这里不是点击购买,是长销售过程,但有更具扩展性和利润的商务模式。”Louis Jonckheere,ShowPad联合创始人
另一类型是企业移动服务,随着企业对其内网移动化的需,并允许雇员携带自己设备工作。和大众消费者应用领域不同,企业为每个员工提供一笔数量可观的IT预算,对数据安全、身份管理、后端系统整合和支持协议有非常严格的要求。在这领域中,最早大型SDK厂商很可能来自跨平台工具,如Appcelerator,IBM(收购Worklight),以及Xmamarin,通过整合整个开发-部署-管理的工作流程,将自己定位为移动企业应用平台(MEAPs)。
随着有超过500工具或SDK提供,在激烈竞争的开发者工具红海中很难发现蓝海 - 未开发市场 。先发优势现已非常难建立,只有很少区域,如消费者支持,消费者投票管理,尚未开发。
很多B2D创业公司希望能在有效盈利前被收购。同时,不少工具类型的工具间变得无差异,使在非集成厂商中难以竞争,即那些不能在核心服务之上提供增值服务的厂家。整合的大型SDK厂商Appcelerator,Flurry和Google将门槛提高。同时,整合对开发者是好消息,因为选择变得稳定,B2D市场走向成熟。不管是否喜欢,建立和推销应用开始成为普通商务,跟随之前的web开发和软件开发的脚步。
End
相关链接:我的产业生态链和杂谈文章
1. 改变
在软件开发中,没有什么事情会一直停滞不前。现在你正在开发的东西,只是软件的其中一个版本,未来随时可能发生变化。
变化是在软件开发中最常见的事情,你最好接受这一事实。一种好的做法是,使你的代码更加模块化,这样在未来需求改变时,可以容易地进行更改。
遵循DRY(Don't Repeat Yourself)和YAGNI(You
Aren't Gonna Need It)原则。经常看看你的代码,相信自己可以做得更好。立即采取行动,并进行重构,你等的时间越长,代码维护起来就越艰难。有可能会混乱到你无法处理。
2. 移除死代码和注释掉的代码
在开发中,往往会遇到一些无用的或注释掉的代码,你可能不愿意删除,因为你不知道它们以后会不会排上用场。
立刻删除了吧!因为有版本管理工具来负责记住这些代码。现实中太多的项目充斥着大量注释掉的代码,如果不需要,就删除吧,不要害怕。
完美,不是在没有东西需要补充的时候,而是在没有东西需要去掉的时候。——《小王子》
3. 犯错误
没有人是完美的,每个人都会犯错误。犯错是一个学习的过程。如果你不承认任何错误,你将不会有任何改善。
所以,每当你犯了一个错误的时候,你要从中学到一些新的东西,来提高你的知识。此外,不要隐藏自己的错误,或为它们感到羞愧,诚实、坦率地说出你的错误,为自己或他人作前车之鉴。批评与自我批评是推动一个成功团队向前的重要工具。
从未犯过错误的人,是没有机会尝试新东西的。—— 阿尔伯特•爱因斯坦
4. 向其他人展示你的代码
你是不是害怕其他人审查你的代码?为什么呢?你没有尽全力写好吗?你害怕犯任何错误吗?
你不应该这样,代码审查中发现的每一处错误都可以为你积累一些经验,在以后的编码中,你将不会再犯同样的错误。因此,你应该为你写的代码感到骄傲,不要害怕别人看到。
5. 失败
这是最重要的一个。如果你害怕失败,那么你将永远无法解决手头的问题。永远不要放弃希望,把它当作是一个挑战。尝试从另一个角度看东西。成功地解决难题之后,会让你更加强大。
我并没有失败,我刚刚发现了1万种无法正常工作的方式。——托马斯•爱迪生
6. 你自己代码的稳定性
你向你的老板或客户展示你的项目时,你开始担心“能正常运行吗?希望我在开发过程中没有遗漏什么。”
这是一个不好的征兆,你不应该担心。你应该尽早测试你的项目。当然,你无法100%肯定你的作品是完美的,但通过编写自动化测试,可以大大提高你对你的代码的信任度。
7. 新的、复杂的技术
有些开发人员很懒惰,经常沉浸在他们的“Good Old”技术中。要知道,IT正在以令人难以置信的速度发展,每一天都会有新的、更好的技术出现。
因此,开发人员要以开放的态度,多学习一些东西,阅读一些博客,使你不至于与新技术脱节。如果技术/框架满足你的需求,尝试一下也无妨。
8. 项目时间压力
别让时间压力毁了项目的质量。保证你的代码干净、稳定,这是你的工作。高质量也意味着需要深思熟虑的决策和开发时间,有时你需要争取一下。你的客 户期待你用100%(甚至120%)的努力来完成一个可维护的、最先进的产品,如果最终你交付一个次品,那么你后面的时间将被各种需求变更、维护工作占 用,并且老板和客户对你的信任度也会降低。
在开发中,你节省的时间往往会为你带来更多的技术债务。因此,当涉及到项目质量时,拿出你的勇气,诚实地与你的老板谈谈。
popupwindow窗口之外的区域popupwindow消失 , 以前说过需要设置:
mPopupWindow.setFocusable(true); // 设置PopupWindow可获得焦点 mPopupWindow.setTouchable(true); // 设置PopupWindow可触摸 mPopupWindow.setOutsideTouchable(true); // 设置非PopupWindow区域可触摸 mPopupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.chooseballbg));// // 这句话必须有,否则 // // 按返回键 // // popwindow不能消失 或者加入这句话 // ColorDrawable dw = new ColorDrawable(-00000); // mPopupWindow.setBackgroundDrawable(dw);
但是: 加入这些之后,我给Popwindow加了动画的,出现一个恶心的问题:就是popwindow在执行动画过程中,如果Popwindow上有button类似的控件,控件有背景色的变化,就会带来非常恶心的现象: 点击的控件的那一块竟然出现漏洞了,透明的一块,这就是
mPopupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.chooseballbg));//带来的恶果!! 咋办呢? 我这样做的:这句话我不用了!! 用别的方法来实现popwindow的dismiss。
用这种方法:就是利用popwindow内部的空间加入按键事件!!
这样的:
LinearLayout layouttemp = (LinearLayout) view .findViewById(R.id.linearlayout_blank); layouttemp.setFocusable(true); layouttemp.setFocusableInTouchMode(true); layouttemp.setOnKeyListener(new OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { // 手机键盘上的返回键 switch (keyCode) { case KeyEvent.KEYCODE_BACK: mPopupWindow.dismiss(); break; } return false; } });
即可!!