您的位置:首页 > 移动开发 > Android开发

Android复习

2016-04-20 22:15 344 查看
1.Android屏幕适配

图片适配:不同的文件夹下存放分辨率不同的图片

布局适配:单独为某一个分辨率创建一个布局文件夹,layout-800x480

尺寸适配:(常用)dp=px/设备密度

240x320(0.75)

320x480(1)

480x800(1.5)

1280x720(2.0)

代码适配:在代码中通过屏幕的宽和高设置控件所占的比例

权重适配:layout_weight

2.点击事件的四种写法

内部类

匿名内部类

布局文件中的onClick属性

继承OnClickListener接口,重写onClick方法

3.android5.0新特性

用户界面

材料设计语言

优化了通知栏系统,可以在锁屏界面直接访问通知消息

系统底层,使用art代替dalvik

针对电池进行了软件优化

4.安卓数据缓存

好处:减少服务器的压力

提高客户端的响应速度

支持离线浏览

常见的缓存管理方法是数据库和文件

数据库:下载完文件以后,把文件的相关信息存放到数据库,建议把url作为唯一的标识信息,

下次下载的时候根据url先查数据库

需要创建表,缓存的文件存放在手机内部存储空间,容易浪费内存,需要及时清理

文件缓存:使用File.lastModified得到文件最后修改的时间,与当前的事件进行比较,来达到缓存的效果

5.activity提供的actionbar在3.0以上才可以使用,actionbarActivity是兼容2.x版本的,当当前的activity

继承actionbarActivity时,使用theme.noTitle.FullScreen时会报错

6.什么是ANR,如何避免?

答:在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当用户的操作在5s内

应用程序没有做出响应,BroadReceiver在10s内没有执行完毕,就会出现应用程序无响应对话框。

避免方法:Activity应该在它的关键生命周期方法尽可能的少去做创建操作。耗时操作,例如网络或者数据库

操作,应该在子线程里进行,主线程应该给子线程提供一个Handler,以便完成是能交给主线程。

7.进程优先级:

前台进程:当前activity正在与用户交互

可见进程:用户仍然可以看到这个进程,某个activity的界面,但是不能操作。

服务进程:一个应用程序,一个后台服务在运行

后台进程:没有任何服务的进程,打开一个activity,按home键最小化

空进程:没有任何活动组件的进程

8.布局套的层级多了,会不会有性能上的问题?

会,在DDMS的层级视图里面能够看到布局的层级关系,以及响应的measure,layout,draw的时间,可以通过

时间来判断性能,如果使用线性布局,会发现时间是最长的,尤其使用layout-weight属性,会发现measure的时间

变为两倍,尽量减少内嵌的层级,考虑使用更平级的组建,尽量使用FrameLayout,然后是RelativeLayout,最后

是LinearLayout

9.在listview的优化中,为何使用convertview,为何使用viewholder,那个更能解决问题?

答:使用convertview可以实现对view的复用,减少了内存的消耗,这样大大节省了每次创建对象的时间,提升了listview的显示

效率,使用viewholder可以将view的子控件封装在viewholder中,通过view.setTag(ViewHolder)可以将view

和viewHolder进行绑定,这样就不用每次都调用view.findViewById方法查找控件。

使用convertview更能解决问题,使用viewholder解决了控件换时间的问题,因为给view对象设置一个tag本身就

是占用内存的,因此viewholder的使用还是要区分不同的应用场景的。如果内存足够需要高效就使用viewholder,否则

不建议使用。

10.VIew.inflate和view.findViewById哪个更耗时?

答:当然是view.inflate,这个方法完成的功能是把xml布局文件通过pullParser的形式解析到内存中,需要io,

需要递归子节点

11..ArrayList是不是线程安全的,如果不是,如何变成线程安全的?

答:不安全,可以使用Collections.synchronizedList(list)将ArrayList变为安全的

Collections是针对集合的一个工具类,提供了一系列的静态方法对集合进行搜索。排序,线程安全化等操作

12.多态时成员的访问特点?

成员变量:编译运行都看左边

成员函数:编译看左边,运行看右边

静态函数:编译运行都看左边,静态方法不能算方法的重写

13.堆和栈有什么区别?

栈中存放对象的引用,堆中存放对象的实体,堆中的对象由jvm的垃圾回收器负责回收。

14.jvm加载class文件的原理机制?

jvm加载class文件是动态性的,也就是当需要的时候才加载,这也是为节约jvm的内存来考虑的。同时jvm的加载是

父委托机制,这个机制简单来说,就是类装载器有载入类的需求的时候,会先请示parent使用其搜索路径

帮忙载入,如果parent找不到,那么才自己依照自己的搜索路径搜索类。

15.Linux常用的命令?

cd 进入某个路径

ls 显示文件和目录结构

mkdir 创建目录

touch 生成一个空文件 touch hello.txt

echo 生成一个带内容的文件 echo “hello” > hello.txt

cp 复制文件或目录

cat 显示文件内容

rm 删除文件

16.使用Bundle类传递数据包时,可以放入一个可序列化的字段,这样,当要传递的数据字段比较多时,采用该方法

比较方便

使当前的类继承java.io.serializable

Bundle bundle = new Bundle();

bundle,putSerializable(name,value);

17.Handler机制的原理?

答;Android中的handler用于实现子线程和主线程之间的通信,例如子线程是不允许修改UI的,这时候可以

在子线程使用handler向主线程发送消息,让主线程修改UI。handler机制的实现,还依赖于Looper,Message这

两个类,当我们通过handler发送消息的时候,该消息就会被添加到消息队列中,Looper会不断的从消息队列中

取出消息。android默认为主线程创建了一个Looper对象和MessageQueue.去消息的过程是线程阻塞的,这样不至于

在没有消息的时候耗费过多的CPU资源。

线程阻塞:指一个线程在执行过程中暂停,等待某个条件触发它。

18.Thraed和AsyncTask的区别?

答:AsyncTask是封装好的线程池,是Handler和Thread的封装。AyncTask在操作UI线程上更为方便,因为

onPreExcute(),onProgressUpdate(),onPostExcute()方法均运行在主线程,这样就不用Handler发消息了。

但是AsyncTask存在缺陷,我看过它的源码,AsyncTask全局只有5个工作线程,也就是如果一个应用使用

AsyncTask来执行线程,那么同一时间只能有5个线程在工作,其他线程将被阻塞,(当我们使用Thread类创建线程的时候不存在

这个限制),所以AsyncTask不要用于多线程获取网络数据,这样容易产生阻塞,从而降低效率。总的来说,如果

需要简单的操作UI,AsyncTask更好一些,数据量多并且

复杂的情况下建议使用handler+thread

注意事项:Task的实例必须在主线程中创建

excute方法必须在主线程中调用

不要手动的调用onPreExcute等方法

task只能被执行一次,多次执行会发生异常

19.说说MVC模式在android中的应用?

答:MVC是Model,View,Controller三部分组成,其中view主要由xml布局文件,或者用代码编写动态布局

来体现,Model是数据模型,其实类似javabean,不过这些javabean封装了对数据库,网络的操作,Controller

一般由Activity负责,它根据用户的输入,控制用户界面数据的显示及更新model对象的状态,它通过控制

view和model和用户进行交互。

20.什么情况下会出现内存泄漏?如何避免这种情况?

答:内存泄漏:如果在一个应用程序中,不再使用某个对象,但是还说有引用指向这个对象,那么垃圾回收器

就无法回收这个对象,这个对象所占的内存控件就无法被使用,这就造成了内存泄漏,android为不同类型的

进程分配了不同的内存上限,如果程序在运行过程中出现了内存泄漏而造成应用程序的内存超出上限,就会被

系统杀死。

可能出现内存泄漏的情况:1)引用没有释放:注册的监听器,广播没有取消,集合中的对象没有清理2)资源没有释放:网络,数据库的游标,

io流没有关闭

如何避免:使用资源记得关闭,保证资源能够释放,对于图片的操作要记得使用缓存,同时要及时回收图片,

使用listview的时候,尽量复用convertview

21.android中数据的存储方式?

答:数据库,网络,文件,SharedPreference存储,ContentProvider存储

22.AIDL的全称是什么,如何工作,能处理那些类型的数据?

答:Android Interface Definition Language,安卓接口定义语言

AIDL一般用于远程服务,也就是进程间通信,我们可以分为服务器端和客户端,服务器端声明aidl文件,

文件命名为xxx.aidl,adt会自动生成aidl的代码文件,代码文件提供了aidl接口的实现类Stub,客户端如果

要使用服务端提供的服务,需要将xxx.aidl文件拷贝到自己的目录下,然后生成java类,然后在ServiceConnection

对象的onServiceConnected方法里面通过Stub.asInterface方法得到aidl的实现类,然后我们就可以调用

这个类的方法了

基本类型数据都可以,复杂数据也可以,不过要实现parcelable接口

23.java如何调用C,C++语言?

答:Java通过JNI调用,使用的时候先通过System.loadLibrary(“xxx”)将xxx.so文件加载到jvm中,同时

在类中必须对so文件中的方法进行声明:public native void test();

24.activity和fragment之间是如何进行数据传递的?

答:activity向fragment传递数据:在fragment中通过getActivity拿到当前fragment所关联的activity,

通过activity对象拿到fragmentManager对象,通过fragmentManager的findFragmentById或者findFramgnetByTag拿到

指定的fragment对象,调用fragment对象的方法

fragment向activity传递:通过getActivity拿到当前fragment关联的activity,必要时进行强转,调用activity中的方法。

25.ListView中下拉刷新,在下拉刷新的过程中,突然立刻点击条目,怎么屏蔽ListView条目的点击事件?

答:重新BaseAdapter的两个方法:

areAllItemsEnabled(){//所有条目是否可以点击

return false;

}

public bolean isEnabled(int position){//某个位置的条目是否可以点击

return false;

}

26.convertview的个数为在listview滑动过程中当前屏幕上能看到的最多条目的个数。

27.当前的item点击之后里面的textview变为红色,item被重新拉回来显示的时候,会默认回复原来的样子?

为什么?如何解决?

答:因为每次getView获取当前item的时候,都会重新new一个viewholder与当前item的布局文件绑定,也就是说,

每次会产生一个新布局给convertview显示。

解决办法:对converview进行复用,当convertivew为空的时候,将生成的布局利用setTag保存在convertview

里面,当converview利用回收机制回收回来的时候,通过getTag将保存的布局取出来,重新将布局文件里的控件

赋值即可。

28.当item继续往上滑的时候,可能出现下面的item样式也改变了,为什么,如何解决?

答:因为下面的item利用的是上面item的convertview

使用ArrayList保存控件改变的item的位置,然后在绘制当前item的时候,根据这个position是否在集合中

来判断是否要改变控件的样式。

29.android中的设计模式?

答:装饰者设计模式:对已有的对象的功能进行增强,可以自定类,将已有的对象传入,基于已有的功能,并提供加强功能,

那么自定义的类就成为装饰类,装饰类通常会提供构造方法,接受被装饰的对象,基于被装饰的对象的功能,提供更强的方法

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

在读取单个字节的基础上进行装饰,可以读一行

单例设计模式:,节省内存空间,节省时间,数据库的访问

工厂设计模式:定义一个用于创建对象的接口,让子类决定实例化哪一了类,工厂方法使一个类的实例化延迟到子类

20.asynctask:异步任务,就是在主线程运行的时候,我们可以完成一些异步操作,可以将耗时的操作放在asynctask中,通过asynctask

可以解决多线程之间的通信问题。

21.去掉数组中重复元素?

定义一个list集合,遍历当前数组,如果集合中不包含数组中的元素,添加到集合中

2.找出两个数组中相同的元素?

答:

8.fragment的生命周期?

答:oncreate: fragment被创建

oncreateview:初始化fragment的布局

onactivitycreated: fragment所依赖的activity创建完成

9.shareSDK:当我们需要进行分享的时候,,把所有的平台集中在一起,省去了跟好多平台打交道的麻烦

先要去下载sdk,下载的时候可以选择我们需要的平台

登录网站,添加app,获得appkey

解压下载的sdk.双击quickintegrate.jar生成文件,覆盖当前的项目,会在当前项目下生成对应的文件

添加权限,还有activity,

在assect目录下的shareSDK文件下将appkey替换成我们申请的appkey

把分享的代码添加到我们需要调用的地方
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: