android面试题(一)

自己总结了一些android的面试题,先写一部分,后续在补充

 

一、Android的四大组件是哪些?它们的作用是?

答:Activity是android程序和用户交互的界面,相当于单独的屏幕,需要为保持各界面的状态做很多持久化的事情,管理生命周期和一些逻辑跳转。

     Service是一段长生命周期,没有用户界面的程序。可以一直在后台运行,也可以跨进程访问。

     Content Provider:当开发者需要将应用数据与其他应用进行共享时,是Android提供的一个修改、增加、删除、查询外部数据的功能的中间层。是Android提供的第三方应用数据的访问方案,可以派生ContentProvider类,对外提供数据,可以像数据库一样进行选择排序。

   BroadCast.Receiver:希望开发者的应用能对外部事件做出相应,在事件发生时做一些简单的处理,转换成一台Notification。接受一种或者多重呢Intent作触发事件。

二、请简单介绍一些android中常用的五种布局?

FrameLayout: (框架布局)所有的东西都依次放在左上角,会进行重叠。

LinearLayour:(线性布局)可分为垂直布局和水平布局,当只有一行时垂直(从上往下)水平(从左往右)  

AbsoluteLayour:(绝对布局)使用xy坐标指定元素的位置,但是这种布局在屏幕旋转时会出问题

RelativeLayout :(相对布局)以某一个元素为参照物,进行布局相对于某一个元素:layout_below layout_toleftof layout相对于父元素layout_alignparentLeft

TableLayout:(表格布局)以行列划分。

三、Android中的动画元素有哪些?其特点和区别?

   Frame动画(帧动画): 由图片组成,为传统的动画。通过播放排列好的图片来实现。

   Tween动画(补间动画):可以使组件移动、放大、渐变。

四、Android中有哪几种方式来解析xml?官方推荐? 以及他们的原理和区别?

   SAX:基于时间的解析器。流程是从文件的开始解析到文件的结束,不能暂停或者倒退

优点:不占内存空间,解析属性方便;缺点:不记录标签的属性关系。在手机和敏感数据库使用

DOM:将整个XML加载到内存中去,在PC机上使用的比较的多。

PULL:运行与SAX类似,都是基于事件的模式,不同于在于返回数字,且需要我们自己获取产生的事件然后解析。SAX是由触发器。

五、List的优化方案?

if(converview==null){
itemview = View.inflate(this,view1,view2,null);

holter = new Holder();

item .setTag(holter);

}else{

Itemview= converview;

Holder=(viewHolder)itemview.getTag();}

一层优化:判断contentview是否为空。尽可能少的创建view

二层优化:给contentview设置setag(),传入一个viewholder对象,用于缓存要加载的数据,达到图像异步加载的效果。减少findbyid

三层:进行分页显示

六、介绍android的数据存储方式?

□SharedPreferences:是android提供的一些简单配置信息的一种机制。采用的Map数据结构来保存,进行简单的读写。

获取SharedPreference的两种方式:

  1. 调用context对象的getsharedPrederenes()方法,在统一程序下的其他组件所共享
  2. 调用Activity对象的getpreferences()方法,只能在该Avtivity中使用

四种模式:

  1. Context.MODE_PRIVATE:为默认的模式,文件是私有数据,写入的内容覆盖原文件的内容。
  2. Context.MODE_APPEND:会检查文件是否存在,存在追加,部存在就创建。
  3. Context.MODE_ WORLD_READABLE:表示当前文件可以被其他应用程序进行读。
  4. Context.MODE_ WORLD_WRITEABLE:表示当前文件可以被其他应用程序进行读。

实例化:

SharedPrefence .Editor = myshared .edit();

editor.putString();

editot.commit();

先调用edit使其进入编辑状态,使用xml进行存储,文件在file explorer 中的/data/date/<package name >/shares_prefs下。且只能在同一个包中使用。

□文件存储:与java中的机制一样。使用file  

FileInputStrea  fis =openFileInput();  FileOutputStrea  fos =openFileOutput();  

□网络存储数据

调用WebService返回的数据或者解析HTTP协议实现网络数据交互。

□ContentProvider:四大组件之一,用与应用程序之间共享数据。统一的数据访问的方式

七、ConrentProvider的使用简介

基础:首先需要获得一个ConrentResolver的实例通过Acrtivity的成员的getContentResolver()方法得到。实例自带的方法可以找到指定的Content provider方法并且获取到,通过ConrentResolver代理,用户不能访问。每一个Content provider都有一个公共的uri,用于表示这个Content provider所提供的数据。Content provider的每一行都带有一个唯一值的数字字段,名为_id

创建:继承Content Ptovider类,实现query,inset,update等方法

声明:在manifest中声明。

查询:想使用一个Content Ptovider需要的信息有○定义这个Content Ptoviderde 的uri返回结果的字段名称,以及这些数据类型○如果需要查询Content Ptovider数据集的特定记录行,需要知道该记录的id,没有加id会得到多行数据

构建查询:输入uri的参数,能够找到uri对应的Content Ptovider,则返回一个cursor对象,通过ContentResolver.Query()或者activity.manageQuery()实现(能够管理生命周期,与activity相同)。

Cursor cur = managedQuery(uri,null,null);

或则使用withAppendedId进行拼接

Uri uri = contentUri. withAppendedId(people.CONTENT_URI,23); people.CONTENT_URI是uri常量.

修改:使用ContentValue

Uri简介:“conrent://主机名/路径”

主机名表示唯一表示这个Content provider,在《provider》中定义。

路径表示我们要操作的数据,例如操作contact表中id为10的jiljk。  /conract/10

将一个字符串转换成uri,Uri uri = Uri.parse(“”);

 

八、Activity的启动模式有哪些?是什么含义?

Standard:默认的启动模式,每一个实例处理一个Intent,总是新建实例;

SingleTop:如果被启动的Activity已经在栈顶,则将实例传给他onNewIntent,否则新建实例。

SingleTask:单实例总是把activity作为一个task的根元素,允许有其他的activity在task。

SingleInstance:与singleTsak相同,但是不允许有其他的activity在task中。

九、跟activity和task有关的intent启动方式有哪些?其含义?

FLAG_ACTIVITY_NEW_TASK:首先会查找是否存在和被启动的Activity具有相同亲和性的任务,(即taskAffinity,注意同一应用程序中的activity的亲和性一样)如果有则把这个栈直接整体移到前台,并保持其中的顺序不变,如果没有则新建一个栈来存放被启动的activity。且如果启动的activity正在运行则不会为其新建,而是将原有的包含activity的task返回到前台,其中顺序不变。

FLAG_ACTIVITY_CLEAR_TOP:如果设置,并且这个ativity已经在当前的task中运行,因此不再重新启动一下这个activity的实例,而是将这个activity上方的所有activity都将关闭,然后这个intent会作为一个新的intent投递到老的activity中。

十、activity在屏幕旋转时的生命周期

不设置activity的android:configChange时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。

设置android:configChange=“orientation”时,都只重新调用一次。

设置android:configChange=“orientation|keyboardhidden”不会重新调用各个生命周期,只会执行onconfigurationchanged方法。

如何启动Service,如何停用Service。

第一步:继承service类

第二步:在manifest中的《application》声明

第三步:进行启动

Cotext.startService():与调用者没有关联,一旦运行则一直运行,在服务未被创建之前就调用oncreate(),如果调用的服务已经存在,不会导致多次创建服务,但会导致多次调用onstart();

Context.bindService():与调用者的生命周期相同,不会多次调用oncreate()和onbind();横竖屏切换时,之前使用的bindservice则会断开

 

十四、解释单线程模式中的Message、Handler、Message Queue 、Looper之间的关系?

Meaage:理解为线程间的交流信息,处理数据后台线程需要更新的UI,则发送Message内含一些数据给UI线程。获取实例最好的方法是调用Message.obtain()或者是Handler.message(),因为是型回收池获取。尽管他的构造方法是public。

Message Queue:消息队列,用来存放通过Handler发布的消息。按照先进先出执行。Message不是直接加到一个MessageQueue中,而是通过MessageQueue.idlehandler关联到looper。可以通过looper。Myqueue从当前的线程中获取。每个消息队列对应一个Handler。它象消息队列发送消息的两种方法:sendMessage和post。SendMessage发送一个Meaage,由handler的handlermeaager()执行。二post发送的是一个runnable,自己执行。

Looper:是每条线程里面的管家。

他们之间的关系:handler获取当线程中的looper对象,looper用来从存放的message的messageQueue中取出Message,再有handler进行message的分发和处理。

十五、简单解释intent?

Intent:不同组件之间相互通信的纽带,封装的不同组件之间的通信的条件,用于保存和传输各种数据。

activity的使用:使用StartActivity(),StartActivityForResult();传递给一个activity

service的使用:传给onstar(),onBind();

Broad Receiver:传给onReceive();

Intent的使用:setClass();putExtra();

十六、说说MVC的 原理,在android中的应用?

Model:模型,业务逻辑层,对数据库、网络的操作、还有算法等计算。

View:视图层,负责用户的界面,一般是xml文件。

Control:控制层,是根据用户的输入,控制用户界面的数据显示及更新Model对象的状态。Dao。

十七、什么是ANR?如何避免它?

Application Not Responding(应用无响应):活动管理器和窗口管理器负责监视应用程序的响应,当用户操作5s内应用程序不能做出反应,BroadcastReceiver在10秒内没有执行完毕,机会出现ANR提示。

避免:在activity的关键生命周期内尽可能少的去做创建操作、潜在的耗时操作、网络,数据库操作,耗时的计算应该在子线程中完成,线程应该为子线程提供一个Handler,以便完成时能提交给主线程。

十八、什么情况下会导致Force Close?如何避免?如何捕捉异常?

答:程序出现异常时,例如空指针。在logcat中能够看到

十九、描述一下android的系统框架

答:4个层次,从上往下为:

Linux内核层(Linux Lernel):由c语言实现,硬件和团建之间的抽象层,里面包含各种驱动。

系统运行库(Linbraries):由c/c++实现,通过android应用程序框架为开发者提供服务。由D埃里克Java虚拟机和java类库组成。

Android应用框架层(application framework):程序所使用的api

Android应用程序层(applications):是应用程序层,用java编写。

二十、如果后台的activity由于某种原因被系统回收了,如何在被系统回收之前保存当前的状态?

答:重写OnSaveInstaceState(),保存需要保存需要保存的数据,他会在系统回收activity之前被调用。

二十一、如何将acrivity设置成窗口的样式?

答:在<activity>中配置,android:theme=“@android:style/theme.Dialog”;

另外android:theme=”@android:style/theme.translucent”设置为透明

 

二十二、如何退出activity?如何安全退出以调用多个activity的application?

单一的activity:退出activity的方法:finish(),killprocess(),system.exit();

多个activity:◎记录打开的activity,在退出的时候关闭。◎发送特定的广播,收到广播的activity退出。◎递归退出:使用startActivityForResult(),在其中调用函数。

二十三、AIDL的全称是什么?

答:Android的接口描述语言,用于跨进程通信。

如果需要在一个activity中,访问另一个Service中的某个对象,需要先将对象转化成AIDL可识别的参数,然后使用AIDL来传递这些参数,在消息的接受端,使用这些参数组装成自己需要的对象。

序列化:将传输的数据转化为能够在内存之间流通的形式。

二十四、Service和Thread的区别?

Thread:是程序执行的最小单位,用来执行一些异步操作,独立于Activity运行,当一个activity被finish()后,如果没有主动停止Thread或者Thread.run方法里面的东向没有运行完,则Thread会一直运行。而且当activity被结束之后就不在持有Thread的引用,没有办法在不同的Activity对同一thread进行控制。

Service:是android的一种机制。可以被不同的组件来控制。

二十五、请解释android程序运行时权与文件系统权限的区别?

答:运行时权限:Dalvik(指apk在运行时所获取到的权限)

文件系统权限: 是指相应的用户或者组对于某一个文件的读写执行权限

二十七、android dvm进程和linux的进程,应用程序的进程是否为同一个概念?

答:dvm指的是dalivk的虚拟机,每一个android应用程序都在它自己的进程中运行,都有一个独立的dalvik虚拟机实例。而每一个dvm都是在linux中的一个进程,所以说可以是同一个概念。

二十八、NDK是什么?

答:NDK是一些列工具的集合,NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将SO和JAVA 应用打成apk包。NDK集成了交叉编译器,并提供了相应的mk文件盒隔离cpu、平台等差异,开发人员只需简单的修改mk文件就可以创建出so。

二十九、android的内存回收?

按照优先级释放无用的进程,在内存不够的时候,释放掉那些不要了的进程。

三十、保存Activity的运行状态?

调用onSaveInstanceState()

当activity对象被暂停或者停止时,任然保存在内存里面,关于他的成员信息和当前状态都是活动的,此时可以进行状态的保存,

当系统回收回收内存而将activity销毁时,就无法保存其状态,所以需要调用onSaveIntanceState保存

三十二、Java中的==和equals和哈市Code的区别?

==:基本类型的比较:比较值

     对象的比较:比较内存地址

equals:重写了此方法,比较对象的内容是否相同

三十三、String 、StringBuffer、 StringBuilder的区别?

String:字符常量,不适用与经常要改变值的情况,每一次的改变相当于新生成一个新的变量

StringBuffer:字符串变量,线程比较安全

StringBuilder:字符串变量,在单线程下效率比较高,线程不安全

三十四、什么是内部类?内部类的作用?

内部类可以直接访问外部类的属性,java中的内部类主要分为成员内部类、局部内部类,匿名内部类,静态内部类。

内部类最吸引人的地方在于:每个内部类都能独立地继承一个接口的实现,无论外围类是否已经继承了某个接口的实现,对于内部类都没有影响。

三十五、进程和线程的区别?

进程是cpu资源分配的最小单位,线程是cpu的最小单位进程之间不能共享资源,而线程共享所在线程的地址空间好和其他资源。一个进程里面可以拥有多个线程,进程可以开启进程,也可以开启线程。一个线程属于一个进程,线程可直接使用进程的资源,线程依赖于进程存在

二十六、final、finally、finallize的区别?

final:用于修饰类,成员变量和方法,类不可被继承,成员变量不可以改变,成员方法不可以重写

finally:与try—catch共同使用,确保无论是否出现异常都能够被调用

finalize:类的方法,垃圾回收之前会调用此方法,子类可以重写此方法实现对资源的回收。

三十七、SerializableParcelable的区别?

Serializeble是java序列化接口,在硬盘上读写过程中有大量临时变量的产生,内部执行大量的i/o操作,效率比较的低。

Parcelable:是android的序列化接口,效率高,使用麻烦,在内存中读写,对象不能保存在磁盘中。

三十八、string转换成integer的方法及原理?

String->integer intrger.parseint(string);

Integer-> integer.toString();

三十九、JDK是什么?JRE是什么?

JDK:java开发工具包。 JRE:java运行时环境

四十、什么是java的平台无关性?

Java 源文件被被编译成字节码的形式,无论在什么系统环境下面,只要有java虚拟机就能运行这个字节码文件。

四十一、在一台电脑上配置java环境,path起什么作用?如何配置?

在dos环境下面,能在任意位置使用jdk目录中的bin文件夹中的可执行文件,用来执行java程序、

在环境变量中找到path变量,把bin文件夹的绝对路径加上

四十二、什么是隐式类型转换?什么是显示类型转换?

当占位数少赋值给占位数多的,java自动隐式转换,反之为显示转换

四十三、什么是类方法和类成员?

使用static修饰的成员变量和成员方法

四十四、什么是方法重载?

是指一个类中可以有多个方法具有相同的名字,但这些方法的参数个数或者类型不一样。

四十五、什么是拆装箱?

拆:把包装类型转换成基本数据类型。装:把基本类型转换成包装数据类型

四十六、java中有没有指针?

有,但是被隐藏了,开发人员无法直接进行操作,由jvm来操作

四十七、Statice关键字的作用?

修饰方法时:方法属于当前类,使用类名来调用。不能再该方法中使用this或者super关键字

修饰变量时:被所有的实例共享,共同使用一块内存区域。

修饰代码块:用来做程序优化,只会执行一次,在实例化之前已经分配的区域。

四十八、string str= aa string str = new string(aa);一样吗?

不一样,前者分配在常量池中,后者分配在堆内存中。

四十九、面向对象的特征有哪些方面?
抽象(关注对象的属性和行为,将一类对象的共同特征总结出来构造类的过程),继承、封装(将数据和操作数据的方法绑定起来)、多态性(允许不同字类型的对象对同一消息作出不同的响应)

五十、多态要做的两件事情:方法重写、对象构造(使用父类的引用调用子类的实例)

五十一、访问修饰符的区别?

作用域

当前类

子类

其他

Public

Protected

Default

private

&和&&的区别?

位运算和逻辑运算。逻辑运算有短路效果

五十四、解释内存中栈(stack)和堆(heap)和静态存储区的用法?

答:定义基本类型的变量,对象的引用,函数的调用的现场保存使用内空间中的栈(操作块,内存小),new和构造一个对象使用堆空间(大的对象在堆空间,整个硬盘的虚拟内存),放在静态存储区

补充:String str = new String(“HELLO”); 堆:str 静态:HELLO

五十五、Math.round(),的四舍五入是加上0.5以后进行向下取整

五十六、数组有没有length()方法?String有没有?

数组有length属性,string有

五十七、equsls满足的规律?

自反性(x.equals(x)==true)、传递性(x.equals(y), y.equals(z), z.equals(z))、对称性(x.equals(y), y.equals(x))、一致性x.equals(null)==false/

五十八、String是final类,不可以被继承

五十九、两个字符串在静态存储区已经存在,使用+比使用StringBuffer要高效

六十、为什么不能根据返回值来区分重载?

因为调用时不能指定类型信息没编译器不知道要调用哪个函数。例如float max(); int max();当调用max时不知道要调用哪一个.

六十一、char能不能存储一个中文字符?

java中char能够存储一个中文字符:因为采用unicode编码,char 2字节,转移到外部的是够InputStreamteader是字节流之间的适配器,承担了编码的转换任务、

六十二、抽象类和接口有什么异同?

:都不可以被实例化,一个类如果继承了某个接口或者某个抽象类,则需要实现其中的抽象方法,否则还是抽象类。

异:抽象类中可以定义构造类,可以定义变量和其他的方法,可以使用修饰符、接口中只能有抽象方法。为public,成员都是常量。

六十三、静态嵌套类和内部类的不同?

静态嵌套类可以不依赖外部类被实例化,内部类需要在外部类实例化后才能被实例化。

六十四、java中会存在内存泄露吗?

Java有回收机制理论上是不会的,但是在实际开发中也会存在无用但是可达的对象。例如hiberbate中的session中的对象属于持久态,垃圾回收机制是不会回收这些对象的,但是这些对象中也有可能存在无用的对象、

六十五、抽象的方法是否可同时是静态,是否同时是本地法,是否可同时被synchronized修饰?

答:不可以是静态的,抽象方法需要子类进行重写,而静态方法是不可以进行重写的。不是本地方法,抽象方法在本地类中是没有实现的,synchronized也与具体的实现细节有关。

六十六、是否可以从一个静态方法内部对非静态方法调用?

不可以,因为静态方法可以在对象实例化之间进行调用,而非静态方法是必须等对象实例化之后由对象进行调用

 

六十七、GC是什么?为什么要有GC?

答GC是垃圾回收的意思,内存处理时编程人员最容易出问题的地方,忘记或者错误的回收垃圾都有可能造成系统的奔溃。Java的gc功能可以自动的检测对象是否需要进行回收。

六十八、数据类型之间的转换。

String-基本数据类型  调用类型包装类的parsexxx或者valueof

基本数据类型-string 调用string的valueof或者基本数据类型+“”

六十九、Error和Exception有什么区别?

Error表示系统级的错误和程序不必处理的错误,是恢复起来很困难的一种严重错误。比如内存溢出。

Exception:表示需要捕捉或者需要程序进行处理的异常。

七十、try(含return)与finally执行过程?

遇到try中的return时,会临时保存return的值,然后跑去执行finally中的语句。Finally中的语句表示一定会被执行的语句。

七十一、如何创建一个对象?

  1. 使用new运算符和类的构造方法分配内存,如果没有构造方法则使用默认的构造方法

七十二、为什么可以直接使用类来调用类成员和类方法?

当类被加载到虚拟机的时候,类成员变量就被分配内训,类方法就被分配地址,所以不用创建对象。

七十三、简述super关键字的作用?

1调用父类的构造方法 3调用父类隐藏的成员变量和成员发放

七十四、上转型对象可以操作什么?不可以操作什么?它是什么?

上转型:是指a类是b类的父类,使用b类创建一个实例,在a类中引用b类的实例,则称a类是b类对象的上转型对象

可以操作:子类继承或者重写的一些成员变量和方法

不可以操作:子类新增的一些成员变量和成员方法

 

七十五、char数组和byte数组如何转化成string字符串:使用string的构造方法

七十六、已知一个date对象,如何对其进行格式化?

SimpleDateFormat formate = new SimpleDateFormat(“格式”);

Formate.format(new date())

七十七、如何商城一个0-100的随机整数:(int ) (Math.random()*100)

七十八、简述try,catch,throw.throws.finally

Try:保护代码,如果try中的代码出现异常则代码不在继续执行     Catch:捕捉异常,按照顺序执行      Throw:抛出异常     Throws:声明异常   Finally:无论是否出现异常都会执行

七十九、什么是i/o流,其作用?

是指数据输入输出六,i/o流提供一条通道程序,可以使用这条通道把源中的数据送到目的地

八十、实现多线程的两种方法?

从thread中派生一个新的线程类,重写run方法

实现runnable接口,实现run方法

八十一、线程同步?

使用同步方法:synchronized void kkk(){}

使用同步代码块:synchronized(obiect){}

八十二、Throw和Trows的区别?

Throw写在代码块中,throw都免跟的是一个具体的异常实例

Throws写在方法的前后,后面跟的是异常类,可以跟多个

八十二、什么是关系型数据库?

所谓关系新数据库,是指采用了关系模型来组织数据的数据库。关系模型是指由二维表格组成。

八十三、主键:能否唯一的确定表中的某个记录

八十四、外键:用于强制参照完整性

八十五、主外键关联的作用:保证数据的完整性,消除数据冗余

八十六、数据库:指长期存储在计算机内。有组织的、可以共享的数据集合

八十七、DDMS(数据库管理系统):把用户意义下的抽象的逻辑数据转化成计算机中具体的物理数据处理的软件

八十八、静态代理和动态代理的区别,什么场景使用?

静态代理类:有程序员创建或由特定的工具自动生成源代码,在对其进行编译,在程序运行之前,代理的class文件就已经存在了。

动态代理:在程序运行时,运用反射机制动态创建而成的

八十九、java反射机制:是指在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用这个对象的属性和方法

九十、List、set、map的区别?

Set:是一种集合,接口有TreeSet(对对象进行排序),HashSer(速度比较快)

List:线性,元素可以重复:arraylist(可以改变长度,可随机访问,插入删除慢),linkedlist(链表存储)

Map:键对,Hashmap(),Lindlist

九十一、run和start的区别?

Run方法 :是thread中的一个普通可以被重复调用,如果主线程中调用线程,不会启用新的线程,执行的路径只有一条,要等run中的方法执行完毕才可以执行下面的代码

Start方法:不可以重复调用,start中run中的代码可以不用执行完就可以执行,

九十二、对象锁和类锁

在JAVA虚拟机中,每个对象和类在逻辑上都是和一个监视器相关联的。代表任何时候只允许一个线程拥有的特权。如果线程释放了锁,那么在他释放这个锁之前,就没有其他线程可以获取同样数据的锁了。在java中使用synchronized进行标识一个监视区域。

九十三、在java中wait和sleep的区别?

Wait用于线程间的通信,如果等待条件为真且其他线程被唤醒时,会释放锁。Sleep仅仅释放cpu或者让当前线程停止一段是假,但不会释放锁。

九十四、wait和notify

Wait:让线程进行阻塞,并且释放锁,唤醒在等待该对象同步锁的线程(多个唤醒一个)。

Notify:调用任意对象的notify方法则导致调用该对象的wait方法而阻塞的线程中随机选择一个解除阻塞(等获取到锁之后才可以真正的执行)

什么导致线程阻塞?线程如何关闭?

是指程序会一直等待该方法完成期间不做其他的事情、例如:serversicker的accept方法就是一直等待客户端连接。这里的阻塞是指调用结果返回之前,当前线程会被挂起,直到得到结果之后才会返回。

死锁的四个必要条件?

资源竞争(资源分配不当,资源不足)、互斥条件(一个资源被一个线程占用,其他线程只能够等待)、请求保持(自己有资源,还要新的资源,但是新资源被占用,自己原本的资源不放手),不可剥夺(资源只能由自己主动释放)

什么是线程池?

创建线程是要花费昂贵的资源和时间,如果线程来了在创建线程那么响应时间会变长,一个进程能够创建的线程数量有限。为了避免这个问题有了线程池,在程序启动的时候里面就已经创建了若干线程来响应处理。有单线程池,数目固定和缓存线程池。

线程间的通信?

线程是cpu最小调度单位,在android中主线程不做耗时操作,子线程不做ui更新操作,android通信使用handler,通过调用messagequeue将保存消息的message发送到messagequeue中,而lopper对象不断的调用loop方法,从中取出nessage交个handler

AsyncTask四个方法

是android中本身一种轻量级的异步任务。在线程池中执行后台任务,然后把执行的进度和最终的结果给主线程。内部使用thread和handler。用于线程更新,但是不适用于耗时的后台任务。

OnpreExecute:在主线程中执行,在异步任务之前执行

doInBackground:线程池中执行,执行异步任务,调用publicprogress进行更新任务的进度

onProgressUpdate在主线程执行,用于任务进度更新

onPostExecute在主线程中执行,在异步任务执行完毕之后调用

HttpClient和HttpUrlConnection的区别?

两种方式都支持Http协议,都是以流的形式进行上传下载数据,也可以说是以流的形式进行数据传输,还有ipv6,以及连接池的功能。HttpClient拥有很多的API,难于扩展,另一个比较的轻量级API少,并且能够满足android大部分的数据传输。Villey在2.3版本之前为httpClient,以后是httpUrlCnnection

Java虚拟机和Dalbik虚拟机的区别?

Java:基于栈,使用指令来载入和操作栈上数据,所需指令更多,运行java字节,类编译成.class文件

Dakvuk:基于寄存器,运行自定义的.dex字节码格式,类被编译成class文件之后,会通过dx工具将所有的class转换成.dex文件,然后从中读取字节和指令。一个应用,一个虚拟机实例。

Context?

Context是抽象类,翻译为上下文,提供一些程序运行环境的基础,两个子类Context

Wrapper上下文的封装类,三个子类:ContextThemeWrapper(带主题,子类activity),service,application,ContextImpl是上下文的实现类。GetApplicationContext和getApplication是同一application类型不一样。

Context有三种类型的的子类application,service,activity,一般是通用的,但是在弹出dialog时必须使用activity,因为android不允许activity或者dialog凭空出现。

理解activity、view、window三者之间的关系?

Activity是控制单元(工人),window承载模型(窗户),view显示视图(窗花),layoutInflater(剪刀),xml图纸。

过程:activity构造window(phonewindow)-》有一个viewroot(viewGroup)->通过addview添加view

Binder机制?

在android系统中Binder由Client、Service、ServiceManager、Binder驱动程序组成,前三者运行在用户空间,Binder在内核空间

ServiceManager:提供辅助管理,用来管理service,向client提供查询dervice接口的能力,service和Client是在serviceManager的基础上进行C/S的通通信。

Binder:将上面的四种组件联合在一起,提供设备文件和用户控件的交互,实现clicent和service之间的进程通信,是核心组件,service和client通过open和ioctl文件操作相应的方法与binder进行通信

android内存泄露。

指内存空间不足。原因有:单例模式:将单例模式与app生命周期一致、注册和反注册:注册广播时要解绑、资源对象没有关闭:资源不适用是调用close,destroy等方法释放、集合对象没有及时清理

最顶级的父类:Object

RecyclerView和ListView之间的区别?

RecyclerView可以完成ListView和GridView的效果,还可以完成瀑布流,同时可以设置列表的滚动方向,他的view不用开发者自己写代码,系统封装好了,可以进行局部刷新,提供了API来实现动画效果。在性能上,频繁的刷新数据,需要添加动画,RecyclerView有很大的优势,如果只是普通的列表,则两者之间差别不是很大

为什么说Http是可靠的协议:因为http中采用tcp/ip进行数据传输,tcp/ip是可靠的传输协议

Socker建立网络连接的步骤?

建立socket连接至少需要一对套接字,其中一个运行在客户端ClientSocket,一个运行在服务端ServiceSocket。

  1. 服务器监听:服务器套接字处于等待连接的状态,实时监听网络状态,等待客户端的连接请求
  2. 客户端请求:客户端套接字提出连接请求,连接服务端的套接字,必须注明他要连接的服务器
  3. 连接确认:当服务器监听到连接请求时,响应连接请求,建立一个新的线程,把服务器的的描述发送给客户端,客户端一旦确认描述,便建立正式的连接,而服务器的套接字继续处于监听状态、

Xutils、Okhttp、VolleyRetrofit对比

Xutils这个框架比较的全面,可以进行网络请求,进行图片的加载、数据存储、view的注解。对框架的依赖严重一旦框架出现问题呢,整个项目的影响非常的严重

Okhttp是android中使用现成的api进行网络请求。Http、HttpUrlConnection进行操作,是一个高性能的网络请求库,支持同步、异步、封装了线程池,数据转换。

Volley是谷歌推出的一套小而巧的异步请求库,扩展性很强,封装了ImageLOader,也支持Okhttp,,不支持post传大数据,不适合上传文件,适合频繁的数据量小的网络请求。

ResSTful:封装很强大,涉及了一堆的涉及模式,可以使用不同的http客户端,虽然默认呢使用http,但是可以使用不同的Json Converter来序列化数据,同时提供RX Java的支持。

Volley  VS Okhttp:Volley的有事在与封装的更好,Okhttp要求有在此封装的能力。Okhttp的性能更好。但是volley同样支持okhttp

Android项目工程下面的assets目录的作用是放置一些多媒体文件。

对于一些资源以及状态的操作保存在OnStart()函数里面。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值