android开发干货
㈠ Android开发工程师是干什么的需要掌握哪些技能
Android开发应该是先当下最具人气、最吸引人的行业。首先是因为其开源、免费的特点能为企业节省大量成本,其次是国产智能手机用户群体庞大,2014第一季度Android平台已占所有移动广告流量来源的42.8%,首度超越iOS。所以android开发工程师就业前景好薪资待遇高。
一、高大上的app开发
俗称应用程序开发,就如今日头条,大众点评这类应用。对于开发者来讲就是用android
api进行开发(大部分使用java开发),这类开发是目前主流的android开发。主要针对的终端开发,手机平板。
二、可以做手机
android手机开发也是一大块,android手机开发又有那些工作做呢?
1、底层开发就是内核定制驱动开发
就是拿着cpu芯片提供的android sdk
加上一些自选器件的驱动不过一般的器件驱动android都包含了。当然这个玩不好那手机各种不稳定你懂的。
2、android framework
基本上扩展些接口,开机,升级,植入自己的东西。android 本身是很强大的这一层的东西都是十八般武器。
3、从事UI定制
这个就是把android原生的UI推到重来,这个叫中国特色,UI定制其实工作是很多的,好不好用(死机重启除外)这个是关键,想得够多做得够细,好用符合习惯是硬道理,UI定制类似与app开发,是把硬件本身能提供的东西更好的让使用者使用。
三、移动浏览器
移动浏览器是各大互联网巨头都要占领的地盘,在chromium加个壳,那它也能是忍者神龟。虽然是在chromium上加了个壳但是没有技术实力,这个马甲还是不好穿的。
四、智能设备开发
这个市场就比较大了比如给插座装上个android系统它就叫智能插座了。不过目前搞得比较火的是智能电视,买不起智能电视的来个智能机顶盒嘛。那我们就来普及一下智能机顶盒用android如何开发?
其实大体思路是跟手机开发一样一样的,包括后期智能穿戴设备都可以涉及到。
一般需要掌握JAVA、Android基础、Android高级、商业应用项目分析等等。
随着Android用户的与日俱增,其开发团队的人员也是供不应求的。
㈡ 有哪些android开发技巧
1、android:clipToPadding
意思是控件的绘制区域是否在padding里面。默认为true。如果你设置了此属性值为false,就能实现一个在布局上事半功陪的效果。先看一个效果图。
上图中的ListView顶部默认有一个间距,向上滑动后,间距消失,如下图所示。
如果使用margin或padding,都不能实现这个效果。加一个headerView又显得大材小用,而且过于麻烦。此处的clipToPadding配合paddingTop效果就刚刚好。
同样,还有另外一个属性也很神奇:android:clipChildren,具体请参考:【Android】神奇的android:clipChildren属性
2、match_parent和wrap_content
按理说这两个属性一目了然,一个是填充布局空间适应父控件,一个是适应自身内容大小。但如果在列表如ListView中,用错了问题就大了。ListView中的getView方法需要计算列表条目,那就必然需要确定ListView的高度,onMesure才能做测量。如果指定了wrap_content,就等于告诉系统,如果我有一万个条目,你都帮我计算显示出来,然后系统按照你的要求就new了一万个对象出来。那你不悲剧了?先看一个图。
假设现在ListView有8条数据,match_parent需要new出7个对象,而wrap_content则需要8个。这里涉及到View的重用,就不多探讨了。所以这两个属性的设置将决定getView的调用次数。
由此再延伸出另外一个问题:getView被多次调用。
什么叫多次调用?比如position=0它可能调用了几次。看似很诡异吧。GridView和ListView都有可能出现,说不定这个祸首就是wrap_content。说到底是View的布局出现了问题。如果嵌套的View过于复杂,解决方案可以是通过代码测量列表所需要的高度,或者在getView中使用一个小技巧:parent.getChildCount == position
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (parent.getChildCount() == position) {
// does things here
}
return convertView;
}
3、IllegalArgumentException: pointerIndex out of range
出现这个Bug的场景还是很无语的。一开始我用ViewPager + PhotoView(一个开源控件)显示图片,在多点触控放大缩小时就出现了这个问题。一开始我怀疑是PhotoView的bug,找了半天无果。要命的是不知如何try,老是crash。后来才知道是android遗留下来的bug,源码里没对pointer index做检查。改源码重新编译不太可能吧。明知有exception,又不能从根本上解决,如果不让它crash,那就只能try-catch了。解决办法是:自定义一个ViewPager并继承ViewPager。请看以下代码:
/**
* 自定义封装android.support.v4.view.ViewPager,重写onInterceptTouchEvent事件,捕获系统级别异常
*/
public class CustomViewPager extends ViewPager {
public CustomViewPager(Context context) {
this(context, null);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
try {
return super.onInterceptTouchEvent(ev);
} catch (IllegalArgumentException e) {
LogUtil.e(e);
} catch ( e) {
LogUtil.e(e);
}
return false;
}
}
把用到ViewPager的布局文件,替换成CustomViewPager就OK了。
4、ListView中item点击事件无响应
listView的Item点击事件突然无响应,问题一般是在listView中加入了button、checkbox等控件后出现的。这个问题是聚焦冲突造成的。在android里面,点击屏幕之后,点击事件会根据你的布局来进行分配的,当你的listView里面增加了button之后,点击事件第一优先分配给你listView里面的button。所以你的点击Item就失效了,这个时候你就要根据你的需求,是给你的item的最外层layout设置点击事件,还是给你的某个布局元素添加点击事件了。
解决办法:在ListView的根控件中设置(若根控件是LinearLayout, 则在LinearLayout中加入以下属性设置)descendantFocusability属性。
android:descendantFocusability="blocksDescendants"
官方文档也是这样说明。
5、getSupportFragmentManager()和getChildFragmentManager()
有一个需求,Fragment需要嵌套3个Fragment。基本上可以想到用ViewPager实现。开始代码是这样写的:
mViewPager.setAdapter(new CustomizeFragmentPagerAdapter(getActivity().getSupportFragmentManager(), subFragmentList));
导致的问题是嵌套的Fragment有时会莫名其妙不显示。开始根本不知道问题出现在哪,当你不知道问题的原因时,去解决这个问题显然比较麻烦。经过一次又一次的寻寻觅觅,终于在stackoverflow上看到了同样的提问。说是用getChildFragmentManager()就可以了。真是这么神奇!
mViewPager.setAdapter(new CustomizeFragmentPagerAdapter(getChildFragmentManager, subFragmentList));
让我们看一下这两个有什么区别。首先是getSupportFragmentManager(或者getFragmentManager)的说明:
Return the FragmentManager for interacting with fragments associated with this fragment's activity.
然后是getChildFragmentManager:
Return a private FragmentManager for placing and managing Fragments inside of this Fragment.
Basically, the difference is that Fragment's now have their own internal FragmentManager that can handle Fragments. The child FragmentManager is the one that handles Fragments contained within only the Fragment that it was added to. The other FragmentManager is contained within the entire Activity.
已经说得比较明白了。
6、ScrollView嵌套ListView
这样的设计是不是很奇怪?两个同样会滚动的View居然放到了一起,而且还是嵌套的关系。曾经有一个这样的需求:界面一共有4个区域部分,分别是公司基本信息(logo、名称、法人、地址)、公司简介、公司荣誉、公司口碑列表。每部分内容都需要根据内容自适应高度,不能写死。鄙人首先想到的也是外部用一个ScrollView包围起来。然后把这4部分分别用4个自定义控件封装起来。基本信息和公司简介比较简单,荣誉需要用到RecyclerView和TextView的组合,RecyclerView(当然,用GridView也可以,3列多行的显示)存放荣誉图片,TextView显示荣誉名称。最后一部分口碑列表当然是ListView了。这时候,问题就出来了。需要解决ListView放到ScrollView中的滑动问题和RecyclerView的显示问题(如果RecyclerView的高度没法计算,你是看不到内容的)。
当然,网上已经有类似的提问和解决方案了。
给一个网址:
四种方案解决ScrollView嵌套ListView问题
ListView的情况还比较好解决,优雅的做法无非写一个类继承ListView,然后重写onMeasure方法。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
ListView可以重写onMeasure解决,RecyclerView重写这个方法是行不通的。
说到底其实计算高度嘛。有两种方式,一种是动态计算RecycleView,然后设置setLayoutParams;另外一种跟ListView的解决方式类似,定义一个类继承LinearLayoutManager或GridLayoutManager(注意:可不是继承RecyclerView),重写onMeasure方法(此方法比较麻烦,此处不表,下次写一篇文章再作介绍)。
动态计算高度如下:
int heightPx = DensityUtil.dip2px(getActivity(), (imageHeight + imageRowHeight) * lines);
MarginLayoutParams mParams = new MarginLayoutParams(LayoutParams.MATCH_PARENT, heightPx);
mParams.setMargins(0, 0, 0, 0);
LinearLayout.LayoutParams lParams = new LinearLayout.LayoutParams(mParams);
honorImageRecyclerView.setLayoutParams(lParams);
思路是这样的:服务端返回荣誉图片后,由于是3列显示的方式,只需要计算需要显示几行,然后给定行间距和图片的高度,再设置setLayoutParams就行了。
int lines = (int) Math.ceil(totalImages / 3d);
至此,这个奇怪的需求得到了解决。
可是在滑动的时候,感觉出现卡顿的现象。聪明的你肯定想到是滑动冲突了。应该是ScrollView的滑动干扰到了ListView的滑动。怎么办呢?能不能禁掉ScrollView的滑动?
网络一下,你肯定能搜索到答案的。先上代码:
/**
* @author Leo
*
* Created in 2015-9-12
* 拦截ScrollView滑动事件
*/
public class CustomScrollView extends ScrollView {
private int downY;
private int touchSlop;
public CustomScrollView(Context context) {
this(context, null);
}
public CustomScrollView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
int action = e.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
downY = (int) e.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int moveY = (int) e.getRawY();
if (Math.abs(moveY - downY) > touchSlop) {
return true;
}
}
return super.onInterceptTouchEvent(e);
}
}
只要理解了getScaledTouchSlop()这个方法就好办了。这个方法的注释是:Distance in pixels a touch can wander before we think the user is scrolling。说这是一个距离,表示滑动的时候,手的移动要大于这个距离才开始移动控件,如果小于此距离就不触发移动。
看似很完美了。
但是还有另外一个问题:我每次加载这个界面花的时间太长了,每次由其它界面启动这个界面时,都要卡上1~2秒,而且因手机性能时间不等。并不是由于网络请求,取数据由子线程做,跟UI线程毫无关系。这样的体验自己看了都很不爽。
几天过去了,还是那样。马上要给老板演示了。这样的体验要被骂十次呀。
难道跟ScrollView的嵌套有关?
好吧,那我重构代码。不用ScrollView了。直接用一个ListView,然后add一个headerView存放其它内容。因为控件封装得还算好,没改多少布局就OK了,一运行,流畅顺滑,一切迎刃而解!
本来就是这么简单的问题,为什么非得用ScrollView嵌套呢?
stackoverflow早就告诉你了,不要这样嵌套!不要这样嵌套!不要这样嵌套!重要的事情说三遍。
ListView inside ScrollView is not scrolling on Android
当然,从android 5.0 Lollipop开始提供了一种新的API支持嵌入滑动,此时,让像这样的需求也能很好实现。
此处给一个网址,大家有兴趣自行了解,此处不再讨论。
Android NestedScrolling 实战
7、EmojiconTextView的setText(null)
这是开源表情库com.rockerhieu.emojicon中的TextView加强版。相信很多人用到过这个开源工具包。TextView用setText(null)完全没问题。但EmojiconTextView setText(null)后就悲剧了,直接crash,显示的是null pointer。开始我怀疑时这个view没初始化,但并不是。那就调试一下呗。
@Override
public void setText(CharSequence text, BufferType type) {
SpannableStringBuilder builder = new SpannableStringBuilder(text);
EmojiconHandler.addEmojis(getContext(), builder, mEmojiconSize);
super.setText(builder, type);
}
EmojiconTextView中的setText看来没什么问题。点SpannableStringBuilder进去看看,源码原来是这样的:
/**
* Create a new SpannableStringBuilder containing a of the
* specified text, including its spans if any.
*/
public SpannableStringBuilder(CharSequence text) {
this(text, 0, text.length());
}
好吧。问题已经找到了,text.length(),不空指针才怪。
text = text == null ? "" : text;
SpannableStringBuilder builder = new SpannableStringBuilder(text);
加一行判断就行了。
先想到这么多,以后再补充。
㈢ 做Android开发 需要掌握哪些知识
Android开发是基于linux平台,在java基础之上,用来开发手机APP的一门编程语言
判断是否可以从事安卓开发的相关工作,可以从以下三个方面思考:
1,Android基础阶段:平台架构特性(JAVA/C) Market/应用程序组件 环境搭建与部署/打包与发布 AVD/DDMS/AAPT 调试与测试 。
2,Android进阶初级:组件Widget/ 菜单Menu/ 布局Layout 详解 Xml解析(Pull/Dom/Sax)/JNI 解析SQL数据库原理。
3,Android进阶高级:蓝牙/WIFI SMS/MMS 应用实现 深层次解析GPS原理。
实现LocationManager/LocationProvider 进行定位/跟踪/查找/趋近警告以及Geocoder正逆向编解码等技术细节 2D图形库(Graphics/View)详解 SDCARD/传感器/手势 应用实现
如果自身实力还不到位的话,可以点 击 头 像 试 听 课 程了解一下,专业的事要由专业的人来做。
㈣ 开发一个完整android app 需要掌握哪些知识
这个问题有些笼统,一个完整的app有简单有复杂,不同的app应用功能的差异也导致不同的技术实现或者算法模型。大体来说,一个app从设计到最终实现需要懂得以下几个必要方面:
1、前期需求规划与信息、交互设计——需要制定出一个完整的需求文档,功能文档,流程图,时序图。
2、交互设计、UI设计——设计出基本且完善的原型图和app基础的交互设计效果,之后再根据这些设计出完整的UI界面并学会切图,一些需要做自适应的素材图片需要做点9patch。 这里还需要懂得px,pt和dp之间的换算,屏幕密度的换算和相互之间的系数,以便app能完美适应不同分辨率设备。其中交互设计需要懂得很多人机操作的技巧经验,掌握Axure等交互工具的使用,UI设计需要掌握Photoshop和Illustrator等操作。
3、使用ADT之类的开发环境进行app开发,最基本的也得掌握java语言,熟悉android环境和机制,这里面涉及面广,请根据项目自行学习相关知识。
4、如果不是单机版的app,需要用到服务器,那还得掌握WebService相关知识和开发语言,常用的有ASP.Net,PHP,JSP等。
5、熟悉并能开发数据库。
6、某些功能需要做算法,这还需要一定得专业知识,尤其是数学基础。
7、熟悉API接口开发,这里包括自行开发API的能力以及调用第三方API的经验。
8、熟悉TCP/IP,socket等网络协议和相关知识。
9、熟练掌握App发布的流程,真机调试技巧,证书,打包,上架。
App开发其实不一定适合一个人搞,太费劲,除非是一个单机版的小应用,或者利用现成的api开发简单的第三方应用,否则还是让一个团队来完成各自擅长的领域。
㈤ android开发自学之路
Android是基于java代码的,所以你必须先学习java基础代码,也就是java se,不用去学习java EE。然后在去学习Android才可以
创新办公室有一些Android视频,比较完整,你可以去看看
㈥ android开发入门需要具备哪些知识
android 是一个专门针对移动设备的软件集,它包含一个操作系统,中间件和一些重要的应用程序(可以理解为一个手机操作系统)。内核采用的是linux内核2.6,android sdk提供了在android平台上使用java语言进行开发Android应用程序开发的工具和API接口。
实际就是使用java语言和android api 为android手机开发应用软件。
无论是java,C++有基础就差不多。最好用过java,Eclipse。如果进行过一些类似的sdk开发就应该没什么问题啦。。。
㈦ 初学者学习Android开发,有什么好网站推荐
推荐你可以学习华清创客学院的教程,每个知识点都有对应的案例,理解起来很容易,零基础入门的量身教程。在线问答让你的每天的问题可以得到及时的解答,不留尾巴。课程内容干货多,废话少,交互式让枯燥的课程变得生动有趣,加强你的学习欲望。