1 帧动画,属性动画和补间动画的几个常用API?
a) 帧动画:在Drawable目录下创建animation-list节点的xml文件,里面放每一帧的动画图片.java代码: AnimationDrawable ad = (AnimationDrawable) mImage.getBackground();
b) 补间动画: AlphaAnimation TranslateAnimation ScaleAnimation RotateAnimation AnimationSet也可以在res/anim/目录下定义xml文件
没有改变控件的属性,只是临时绘制出来的效果
c) 属性动画:3.0之后推出来的 改变属性
d) 1.更改view属性的方法:
view.setTranslationX(x);//3.0之后的方法
ViewHelper.setTranslationX(view,x);//NineOldAndroid动画类库中的类
2.ValueAnimator和ObjectAnimatior;ObjectAnimator允许你直接更改View的新属性;ValueAnimator只是帮你定义和执行动画流程,并没有实现任何的动画逻辑,需要你添加动画更新的监听,在执行过程中进行自定义的动画逻辑;
3.ViewPropertyAnimator:一般用NineOldAndroid中的类,它简化了ObjectAnimator
类的操作,然后直接运行我们执行更改View属性的动画;
ViewPropertyAnimator.animate(view).translationX(10).setDuration(300).start();
2 Fragment切换时的生命周期及每个生命周期的应用时机?
3 recycleView的用法!
3 JNI开发流程
a 定义并调用本地方法
b 创建jni文件夹 jni文件夹里创建c文件
c c文件中实现本地方法 创建Android.mk文件,指定要编译的c文件
d 在jni目录下,执行ndk-build.cmd,编译打包出so动态链接库
e 在java代码中加载动态链接库
使用ndk
添加本地支持
A 动生成jni文件夹
B 自动生成c文件和Android.mk文件
C 指定jni.h头文件的路径,相当于关联源码
D 不需要再去jni目录下使用ndk-build.cmd指令,项目部署时,会先打包编译so类库再去部署到手机上
4 自定义控件的实现流程和一些自定义控件的实现原理?
a 定义属性
b 继承View或者View的子类,重写构造方法【1,2,3参数,重写三参数】
TypedArray a =context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomTitleView, defStyle, 0);
c 重写onDraw()方法,绘制View paint绘制view到canvas上【将view用笔绘制到画布上】
d 重写onMeasure()方法实现将所有View重新布局【摆放】
e 添加控件的响应事件 添加事件触发器 实现事件的具体响应
F自己做过的几个自定义控件
aListView 实现下拉刷新和上拉加载更多
添加头布局和脚步局,判断第一个条目在最前面显示且往下拉的话就是下拉刷新,状态改为下拉刷,拉到刚好到达头布局的高度的时候改为松开刷新,松开后改为正在刷新,刷新完成后隐藏头布局。
两个接口回掉方法一个是下拉刷新请求网络数据 一个是上拉加载更多加载第二页数
主要就是处理onTouchEvent事件,根据下拉的情况改变不同的状态,而根据不同的状态改变头布局和脚布局上控件的显示状态
b快速检索QuickIndexBar
在onSizeChanged获取每个字母的格子的高度
在onDraw方法里drawText绘制26个字母,每个字母中心点的间距就是格子的高度
在onTouchEvent接口回调一个方法获取当前触摸的字母
c 滑动删除,类似qq
要在onInterceptTouchEvent,onTouchEvent方法中处理滑动的事件冲突
只能打开一个item.如果有别的打开的要先关闭,可以用集合管理item,也可以写一个单例模式管理.
判断是水平滑动还是左右滑动,滑动的距离等等
d 头部视差 ParallaxListView
当顶部到头 并且是手指往下拖动 就增大顶部ImageView控件的高度LayoutParams这个参数改变高度然后requestLayout方法刷新.增加的高度小于拖动的高度 这样就出现了头部视差 松开的时候恢复到最初的高度 并且设置插补器
e 下拉选择框, PopupWindow添加一个l包含listview的布局实现
f SlideMenu 轮播图广告 自定义开关
5 自定义ActionBar和对话框以及Activity主题样式?
a、actionBarStyle:该属性定义了ActionBar的主要样式,包括ActionBar背景、标题样式、分隔符等等。具体的属性如下:titleTextStyle、background、backgroundSplit、divider。
b、actionBarSize:定义ActoinBar的高度
c、actionButtonStyle:用于定义Action item button的样式,主要属性有background、paddingStart、paddingEnd、minWidth等。
d、actionBarTabStyle:用于定义ActionBar上的Tabs的样式。 e、actionBarTabBarStyle:用于定义Tab下方细条的样式。 f、actionBarTabTextStyle:用于定义Tab上文字的样式。
7 为什么要抽取BaseActivity:
a处理共同的操作,避免代码重复
b代码规范(方便阅读,真实开发80%的时间都是在阅读代码)
c可以提供一些常用变量、方法(方便调用,避免代码重复)
8 ListActivity设置一个 ArrayAdapter和onListItemClick监听即可以使用。自带listview,textview使用android自带的。
9 性能优化:listview图片加载优化,滚动的时候不要加载图片安卓默认加载图片采用的是一个像素四个字节表示,改成两个字节表示的那个模式.glide就是
数据库的优化
网络请求优化,不能重复发送多次请求,程序退出时停止发送请求。
10 内存问题 oom和ui不流畅 优化工具DDMS MAT Heaps
11 断点下载/上传的逻辑
a在写文件的时候可以往后追加new FileOutputStream(file, true);
b每次把数据写入文件的第一时间记录写入的字节数,如果中断的话,下次访问网络的时候可以指定一个range参数表示从哪个位置开始下载;
c需要服务器支持才可以实现断点续传;
12 安卓性能优化典范网站
13 Activity和Service之间相互传递数据的过程.
A UI传递数据给服务
在bindservice方法里有一个intent参数,intent可以携带数据传递给服务 ;
服务的onStartCommand方法里可以获取到这个参数从中获取传递过来的数据;
B 要实现通信就需要拿到彼此的引用对象.
在服务里创建一个handler对象,再创建一个Messenger,这个对象里封装handler对象,这个对象有一个方法messenger.getBinder(),将封装了handler的Messenger转化成一个Ibander对象,而这个对象会通过回调的方式,返回给UI的ServiceConnection的链接成功的方法里.
C UI拿到了服务发送过来的Ibander对象 ,而这个对象是封装了服务的handler的,它就可以发送消息给服务啦;
D 发送消息的内容包含UI引用和Messenger
这样在服务的HandleMessage方法里就可以拿到UI的引用和UI的Messenger.
而UI的Messenger也是封装了UI的handler 的 ,这个时候服务要可以发送消息给UI的handler了,这消息就可以封装服务的应用发给他.
14 BindServiceActivity调用service中的方法
在Activity中通过bindService的方法去启动一个服务,需要传入intent对象和ServiceConnection接口的子类对象,通过这个接口的回调方法可以监视链接服务的状态,并且返回一个binder对象,转换会它的父类IService.
binder对象是在service的onBind方法里返回的,这个对象需要继承Binder并且实现一个接口IService(接口中定义一些方法,在activity中就可以调用这些方法).
其实Binder对象就是中间通信的桥梁,定义好一些方法,让service暴露想暴露的方法给activity使用.
通过一个中间对象Binder,这个对象实现自定义的一个接口Iservice,这个对象会通过activity中Bindservice的时候在回调方法中返回,Activity就可以拿到这个接口的引用就可以调用Iservice接口的方法,而在service里面可以写每一个方法的具体实现.
15 自定义ListView 下拉刷新上拉加载更多的步骤
a继承ListView 把三个构造方法串起来,这样每个方法都会走三个参数的构造函数,就会有默认的样式.
b 分别初始化头布局和脚布局,测量宽高并隐藏.
c 初始化下拉刷新箭头的旋转动画.
d 重写onTouchEvent,当move的时候判断当前最上面显示的是第一个条目并且是下拉并且不是正在刷新状态,就改编为下拉刷新, paddingTop大于零就松开刷新.(头布局分别有三种状态,下拉刷新,松开刷新,正在刷新).根据不同的状态执行不同的动画.
e 刷新完成后,初始化各项数据,隐藏头布局,设置各个控件的状态.
f 当第一次加载网络数据时,显示下拉刷新控件.
g 设置回调接口下拉刷新和加载更多
15 NDK JNI
16 需要了解的几个开源框架
Xutils
android-async-http
Retrofit2.0
OkHttp
Volley
Picasso
PhotoView
Glide
17 设计模式
单例模式:确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例,如网站的计数器,数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。多线程的线程池的设计。
装饰模式:以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案;
代理模式:给一个对象提供一个代理对象,并有代理对象来控制对原有对象的引用;
装饰模式应该为所装饰的对象增强功能;代理模式对代理的对象施加控制,并不提供对象本身的增强功能,代理对象完成用户请求,屏蔽用户对真实对象的访问。静态代理是在程序运行之前就已经存在了代理类,动态代理是程序运行中在内存中生成代理类。
装饰器模式来说,装饰者(decorator)和被装饰者(decoratee)都实现同一个接口。
对代理模式来说,代理类(proxy class)和真实处理的类(real class)都实现同一个接口。
适配器模式是用新接口来调用原接口,原接口对新系统是不可见或者说不可用的。装饰者模式原封不动的使用原接口,适配器是知道被适配者的详细情况的(就是那个类或那个接口)。装饰者只知道其接口是什么,至于其具体类型(是基类还是其他派生类)只有在运行期间才知道。
适配器模式主要是为了接口的转换,而装饰者模式关注的是通过组合来动态的为被装饰者注入新的功能或行为(即所谓的责任)。
对于一个Thread线程,不能多次的调用start();
* 如果想再次运行,需要再次实例化此线程对象;
* 如果这个线程对象实例化时,很耗时,那么我们多次使用,就很不方便;
"线程池",它可以缓存一些"线程对象", 我们可以反复的调用缓冲的线程对象;
一个线程池包括以下四个基本组成部分:
a、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;
b、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;
c、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;
d、任务队列(taskQueue):用于存放没有处理的任务。
19 自定义进度条 对话框
20 MVP设计模式 以及 MVC设计模式
M Model V View P Presenter(主持人)
个人理解:Modle是存放数据的,里面封装了数据,存数据和取数据的方法封装在接口中。
View 一般就指Activity,用于获取界面要展示的数据以及展示数据,同样的,这些方法也是封装在接口中。
Presenter 分别获取到Model和View的接口,就可以从Model中取数据设置给View。
View 不能和Model进行通信这是和MVC最大的区别
21 单列设计模式:核心是私有构造方法,提供共有的静态方法,整个应用程序只提供一个势力对象
22 观察者设计模式:多用于监听某个状态的改变,如系统的ContentProvider。用户只要注册了观察者,当数据发生改变就会通知用户。其实就是接口的对调,不过是多个接口而已。
回调是一种多态的表现,在接口中定义方法(父类), 在一个类中声明接口的引用,在合适的位置调用接口的方法(此时的方法是抽象的,没有具体的实现,如果没有子类重写,这个方法相当于没有),在这个类中肯定有一个方法可以让别的类拿到这个接口的引用,拿这个接口的时候,因为是抽象的,如果想使用就必须有实现,这个时候接口的方法就被实现了.
所以声明接口的这个类当在指定的条件下就会调用别的类的这个实现方法,而观察者模式是将所有实现了这个接口的类用集合管理记录下来,当状态发生改变的时候都通知他们.回调只会调用正在和它发生关系的这个类.
回调是一对一的关系 观察者设计模式是一对多的关系
23 模板方法模式模式
抽象类就可以看成是一个模板,父类定义了很多想实现的方法,但是父类没有能力或者不知道怎么实现,只是定义好了公式或者说定义好了模板,子类在继承父类的时候只要按照父类的步骤去实现每一个功能就好了.如View 自定义View就需要按照步骤实现onMeasure onLayout onDraw.
抽象类也可以看出是基类,回封装子类都需要实现的一些功能
24 装饰设计模式
对原来的类的功能不满意,需要对它进行封装满足需求的
25 简单工厂方法模式
不用关心工厂具体的实现细节,在不同情况下都可以通过工厂提供的方法生产出不同的对象.往往这些方法都是静态的,所以也叫静态工厂方法