Android面试材料整理

来源:互联网 发布:电商美工绩效考核方案 编辑:程序博客网 时间:2024/04/29 07:50

这是在通过许多路径下整理出来的一篇杂文,仅供参考

极光

  极光推送,把打包好的demo合成到项目中以后,必须把相同的.so文件和.jar文件同时拷贝进去否则在初始化jPush.SDK的时候就会出现初始化失败

Fragment:

FragmentManager管理器

你可以通过FragmentManager来取得FragmentTransaction的实例,如下:

FragmentManagerfragmentManager=getFragmentManager();

FragmentTransactionfragmentTransaction=fragmentManager.beginTransaction();

一个事务是在同一时刻执行的一组动作(很像数据库中的事务)。你可以用add(),remove(),replace()等方法构成事务,最后使用commit()方法提交事务。

在调用commint()之前,你可以用addToBackStack()把事务添加到一个后退栈中,这个后退栈属于所在的activity。有了它,就可以在用户按下返回键时,返回到fragment们执行事务之前的状态。

演示了如何用一个fragment代替另一个fragment,同时在后退栈中保存被代替的fragment的状态。

 

//Create new fragment and transaction

FragmentnewFragment=newExampleFragment();

FragmentTransactiontransaction=getFragmentManager().beginTransaction();

//Replace whatever is in the fragment_container view with thisfragment,

//and add the transaction to the backstack

transaction.replace(R.id.fragment_container,newFragment);

transaction.addToBackStack(null);

//Commit the transaction

transaction.commit();

 

 

 

 

 

 

一、自定义View一般步骤大概如下:

自定义view的属性

View的构造方法中获得自定义的属性值,为绘图作准备

重写onMesure,获取view的大小

重写onDraw,在初始化时绘图以及view发生改变时的重绘。

二、在View的构造方法中,获得我们的自定义的样式

必须提供一个能够获取Context和作为属性的AttributeSet对象的构造函数,获取属性。

viewXML布局中创建了之后,XML标签中所有的属性都从资源包中读取出来并作为一个AttributeSet传递给view的构造函数。

尽管可以从AttributeSet中直接读取数值,可是这样做有些弊端:

拥有属性的资源并没有经过解析

Styles并没有运用上

三、重写onMesure函数

     这个方法的参数是View.MeasureSpec,它会告诉你的view的父控件的大小。那些值被包装成int类型,你可以使用静态方法来获取其中的信息。

MeasureSpec的值由specSizespecMode共同组成的,其中specSize记录的是大小,specMode记录的是规格。specMode一共有三种类型,如下所示:

1.EXACTLY

表示父视图希望子视图的大小应该是由specSize的值来决定的,系统默认会按照这个规则来设置子视图的大小,开发人员当然也可以按照自己的意愿设置成任意的大小。

2.AT_MOST

表示子视图最多只能是specSize中指定的大小,开发人员应该尽可能小得去设置这个视图,并且保证不会超过specSize。系统默认会按照这个规则来设置子视图的大小,开发人员当然也可以按照自己的意愿设置成任意的大小。

3.UNSPECIFIED

表示开发人员可以将视图按照自己的意愿设置成任意的大小,没有任何限制。这种情况比较少见,不太会用到。

四、重写onDraw函数

在你调用任何绘制方法之前,你需要创建一个Paint对象。

注意:刚开始就创建对象是一个重要的优化技巧。Views会被频繁的重新绘制,初始化许多绘制对象需要花费昂贵的代价。在onDraw方法里面创建绘制对象会严重影响到性能并使得你的UI显得卡顿。

绘制文字使用drawText()。指定字体通过调用setTypeface(),通过setColor()来设置文字颜色.

绘制基本图形使用drawRect(), drawOval(), drawArc().通过setStyle()来指定形状是否需要filled, outlined.

绘制一些复杂的图形,使用Path.通过给Path对象添加直线与曲线,然后使用drawPath()来绘制图形.和基本图形一样,paths也可以通过setStyle来设置是outlined, filled, both.

通过创建LinearGradient对象来定义渐变。调用setShader()来使用LinearGradient

通过使用drawBitmap来绘制图片.

 

 

 

 

FragmentTransaction 管理器

 

Fragmeng优点

Fragment可以使你能够将activity分离成多个可重用的组件,每个都有它自己的生命周期和UI

Fragment可以轻松得创建动态灵活的UI设计,可以适应于不同的屏幕尺寸。从手机到平板电脑。

Fragment是一个独立的模块,紧紧地与activity绑定在一起。可以运行中动态地移除、加入、交换等。

Fragment提供一个新的方式让你在不同的安卓设备上统一你的UI

Fragment 解决Activity间的切换不流畅,轻量切换。

Fragment 替代TabActivity做导航,性能更好。

Fragment 4.2.版本中新增嵌套fragmeng使用方法,能够生成更好的界面效果。

Fragment做局部内容更新更方便,原来为了到达这一点要把多个布局放到一个activity里面,现在可以用多Fragment来代替,只有在需要的时候才加载Fragment,提高性能

注意事项

fragmentonCreatefragment初次创建时调用。尽管它看起来像是ActivityOnCreate()函数,但这个只是用来创建Fragment的。此时的Activity还没有创 建完成,因为我们的Fragment也是Activity创建的

一部分。所以如果你想在这里使用Activity中的一些资源,将会获取不到。比如:获取 同一个Activity中其它Frament的控件实例。(代码如下:),如果想要获得Activity相关联的资源,必须在onActivityCreated中获取。

 

HTTPS通信原理

HTTPSHTTP over SSL/TLSHTTP是应用层协议,TCP是传输层协议,在应用层和传输层之间,增加了一安全套接层SSL/TLS

HTTP+SSL/TLS+TCP=HTTPS

 

 

 

面试技巧

http://zhidao.baidu.com/link?url=YQ30FITF453NIAXXIDp37M25FVkGah8gZZINTuDelGJa_vd-jnaC6y9N9UzXOMDTA14YdJI8AmowCnfjx9c0rSrJU8x-KYuf5o2UIkwx7EC

http://www.xuexila.com/koucai/mianshi/682556.html

 

 

 

Android 性能优化

 

涉及的内容主要有程序启动时间性能优化的三个方面:优化 activity 的创建过程,优化 Application 对象的启动过程,正确使用启动显屏达到优化程序启动性能的目的。另外还介绍了减少安装包大小的checklist 以及如何使用VectorDrawable 来减少安装包的大小。

 

上述流程里面的绝大多数步骤都是由系统控制的,一般来说不会出现什么问题,可是对于启动速度,我们能够控制并且需要特别关注的地方主要有三处:

1.Activity onCreate流程,特别是 UI的布局与渲染操作,如果布局过于复杂很可能导致严重的启动性能问题。

2.Application onCreate流程,对于大型的 App来说,通常会在这里做大量的通用组件的初始化操作。

3.目前有部分 App会提供自定义的启动窗口,这里可以做成品牌宣传界面或者是给用户提供一种程序已经启动的视觉效果。

 

 

App Launch Time & Activity Creation

 

   以下两点经验可以帮助我们对 Activity 启动做性能优化:

1.优化布局耗时:一个布局层级越深,里面包含需要加载的元素越多,就会耗费更多的初始化时间。

2.异步延迟加载:一开始只初始化最需要的布局,异步加载图片,非立即需要的组件可以做延迟加载。

 

App Launch Time & Bloated Application Objects

     Application 初始化的地方做太多繁重的事情是可能导致严重启动性能问题的元凶之一。Application里面的初始化操作不结束,其他任意的程序操作都无法进行。

1.不要把过多的初始化房子applicationonCreate里面进行操作,这样会导致APP启动过慢;

2.组件是需要做区别对待的,有些可以做延迟加载,有些可以放到其他的地方做初始化操作,特别需要留意包含Disk IO 操作、网络访问等严重耗时的任务,它们会严重阻塞程序的启动。

3.耗时、繁琐、不住要的可以在application里面做延迟加载,也可以把一些初始化的操作延迟到组件真正被调用到的时候再做加载。

 

App Launch Time & Theme Launch Screens

   闪屏启动:

正确方法是,自定义一张图片,把这张图片通过设置主题的方式显示为启动闪屏,代码执行房子主页面的onCreate的时候设置为正常的主题;

Smaller APKs: A Checklist

减少应用程序安装包的大小,不仅仅减少了用户的网络数据流量还减少了下载等待的时间。毋庸置疑,尽量减少程序安装包的大小是十分有必要的。通常来说,减少程序安装包的大小有两条规律:要么

 

减少程序资源的大小,要么就是减少程序的代码量。这里总结一个简易版的减少安装包大小的 Checklist

 

减少安装包大小的方法:

   第一、减少程序图片资源的大小;

1.确保在 build.gradle文件中开启了minifEnabledshrinkResources的属性,这两个属性可以帮助移除那些在程序中使用不到的代码与资源,帮助减少App 的安装包大小。

2.有选择性的提供对应分辨率的图片资源,系统会自动匹配最合适分辨率的图片并执行拉伸或者压缩的处理。

3.在符合条件的情况下,使用 Vertor Drawable替代传统的 PNG/JPEG图片,能够极大地减少图片资源的大小。传统模式下,针对不同 dpi的手机都需要提供一套 PNG/JPEG的图片,而如果使用

 

Vector Drawable 的话,只需要一个 XML文件即可。

4. 尽量复用已经存在的资源图片,使用代码的方式对已有的资源进行复用;

 

减少程序的代码量

1.开启 MinifEnabledProguard。打开这些编译属性之后,程序在打包的时候就不会把没有引用到的代码编译进来,以此达到减少安装包大小的目的。

2.注意因为编译行为额外产生的方法数,例如类似 EnumProtocal Buffer可能导致方法数与类的个数增加。

3.部分引入到工程中的 jar类库可能并不是专门针对移动端 App而设计的,它们最开始可能是运用在 PC或者 Server上的。使用这些类库不仅仅额外增加了包的大小,还增加了编译时间。单纯依靠

 

Proguard 可能无法完全移除那些使用不到的方法,最佳的方式是使用一些更加轻量化,专门为 Android App 设计的jar 类库。

 

安装包的拆分

API<14的时候需要对APK进行拆分,这样会提高APK的使用率,根据API Level、屏幕大小以及GPU版本的不同进行拆分,使得对应平台的用户下载到最合适自己手机的安装包;(拆分方法:Configure APK

 

Splits Maintaining Multiple APKs)-->

(https://developer.android.com/training/multiple-apks/index.html)

(https://developer.android.com/studio/build/configure-apk-splits.html)

VectorDrawable for smaller APKs

使用VecrorDrawable来进行动态生成,针对不同的分辨率提供不同的图片,通过这种方式,我们可以显著减少图片资源对安装包大小的影响。

VectorDrawable通过XML文件描述图片的形状,大小,样式。

使用 VectorDrawable 还可以避免因为使用帧动画导致的图片资源过多的情况

使用VectorDrawable注意事项:

首先 VD 的加载有异于 JPEG/PNG 文件,图片文件可以依靠硬件进行纹理的渲染,而VD 文件需要先进行加载解析,然后才能够进行纹理的渲染。

其次 VD 文件适用于简单有规则的图片渲染,不适用于那些纹理过于复杂的图片,这样不仅仅会过度增加描述文件的复杂度还可能无法获取到想要的渲染效果。

最后,VD 文件中关于 Path 的描述需要尽量简化,复杂冗余的Path 信息不仅对得到想要的图片没有益处,还增加了加载渲染的难度。

 

listview优化

.图片处理,

1:不要直接拿个路径就去循环decodeFile();Option保存图片大小、图片加载的时候不要直接把加载图片到内存去,尽量使用缓存加载,在onDestroy的时候对缓存进行清理;

2:  拿到的图片一定要经过边界压缩

3:ListView中取图片时也不要直接拿个路径去取图片,而是以WeakReference(使用WeakReference代替强引用。比如可以使用WeakReference<Context> mContextRef)、SoftReference

 

WeakHashMap等的来存储图片信息,是图片信息不是图片哦!

4:getView中做图片转换时,产生的中间变量一定及时释放,用以下形式:

二、在adapter里面尽量不要使用static

1.staticJava中的一个关键字,当用它来修饰成员变量时,那么该变量就属于该类,而不是该类的实例。所以用static修饰的变量,它的生命周期是很长的,如果用它来引用一些资源耗费

 

过多的实例(比如Context的情况最多),这时就要尽量避免使用了.

三、如果为了满足需求下必须使用Context的话:Context尽量使用Application Context,因为ApplicationContext的生命周期比较长,引用它不会出现内存泄露的问题

四、尽量避免在ListView适配器中使用线程,因为线程产生内存泄露的主要原因在于线程生命周期的不可控制。

 

OOM的优化:

第一、界面优化,在处理界面的时候不要对界面进行过多的嵌套,布局不要太复杂尽量简洁大方,这样可以使APK在手机上加载的时候能够更快更流畅的加载出来;

 

第二、数据交互尽量避开主线程,不要在主线程中做太多的耗时加载处理,尽量使用子线程来进行处理。

第三、图片处理的时候尽量不要用太多格式,使用统一格式来进行适配,对于图片分辨率的适配可以使用VecrorDrawable来进行不同分辨率的操作。

Android ViewStub

    ViewStubview的子类,主要是加载大小为0view,用来延迟加载布局资源。

 

如果本文损害到你的利益,请及时回复, 会马上删除!!!

0 0
原创粉丝点击