java与Android知识点

Java基础java

  1. 什么是重载,什么是重写?有什么区别? 重载(Overload): (1)Overloading是一个类中多态性的一种表现,让类以统一的方式处理不一样类型数据的一种手段。多个同名函数同时存在,具备不一样的参数个数/类型。 (2)重载的时候,方法名要同样,可是参数类型和个数不同,返回值类型能够相同,也能够不相同。没法以返回型别做为重载函数的区分标准。 重写(Override): (1) 父类与子类之间的多态性,对父类的函数进行从新定义。即在子类中定义某方法与其父类有相同的名称和参数。 (2)若子类中的方法与父类中的某一方法具备相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可以使用super关键字,该关键字引用了当前类的父类。
  2. 泛型T和?有什么区别? a)先看个方法的代码 public T getT(T arg){ return arg; } public List getT(List arg){ return new ArrayList(); } b) 经过两个方法能够看到,T和?均可以用于声明泛型, 可是T能够用来约束函数的返回值类型,而?不会约束返回值类型。在工做里面使用T是更安全的。
  3. 使用final关键字修饰一个变量时,是引用不能变,仍是引用的对象不能变? 使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容仍是能够改变的。 例如,对于以下语句: final StringBuffer a=new StringBuffer("immutable"); 执行以下语句将报告编译期错误: a=new StringBuffer(""); 可是,执行以下语句则能够经过编译: a.append(" broken!");
  4. String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有? 没有。 由于String被设计成不可变(immutable)类,因此它的全部对象都是不可变对象。在这段代码中,s原先指向一个String对象,内容是 "Hello",而后咱们对s进行了+操做,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另外一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量再也不指向它了。
  5. "=="和equals方法究竟有什么区别? ==:操做符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操做符。 equals:方法是用于比较两个独立对象的内容是否相同,就比如去比较两我的的长相是否相同,它比较的两个对象是独立的。 例如,对于下面的代码: String a=new String("foo"); String b=new String("foo"); 两条new语句建立了两个对象,而后用a/b这两个变量分别指向了其中一个对象,这是两个不一样的对象,它们的首地址是不一样的,即a和b中存储的数值是不相同的,因此,表达式a==b将返回false,而这两个对象中的内容是相同的,因此,表达式a.equals(b)将返回true。 在实际开发中,咱们常常要比较传递进行来的字符串内容是否等,字符串的比较基本上都是使用equals方法。
  6. 什么是Activity? 四大组件之一,用于显示和用户交互的界面 setContentView() ,// 要显示的布局 findViewById(R.id.textview);// 查找界面上的控件 button.setOnclickLinstener{ }

我开发经常使用的的有 FragmentActivitiy,ListActivity , PreferenceActivity 等… 若是多个界面有共同的特色或者功能的时候,还会本身定义一个BaseActivity. 7. 请描述一下Activity 生命周期。 a、生命周期描述的是一个类 从建立(new出来)到死亡(垃圾回收)的过程当中会执行的方法.在这个过程当中 会针对不一样的生命阶段会调用不一样的方法 b、Activity从建立到销毁有多种状态,从一种状态到另外一种状态时会激发相应的回调方法,这些回调方法包括:onCreate onDestroy onStart onStop onResume onPause c、其实这些方法都是两两对应的,onCreate建立与onDestroy销毁; onStart可见与onStop不可见;onResume可编辑(即获取焦点)与onPause; d、另外还有一个onRestart方法,在Activity被onStop后,可是没有被onDestroy,在再次启动此Activity时就调用onRestart(而再也不调用onCreate)方法; e、最后讲在项目中的使用。好比说每次进入某个界面的时候都要看到最新的数据,这个刷新列表的操做 就放在onStart()的方法里面.这样保证每次用户看到的数据都是最新的. 多媒体播放, 播放的时候来电话.在 onStop() 时中止视频, 将视频声音设置为0 , 记录视频播放的位置;在 onStart() 时根据保存的状态恢复现场. 8. 两个Activity之间跳转时必然会执行的是哪几个方法。 a、通常状况好比说有两个activity,分别叫A,B ,当在A里面激活B组件的时候, A 会调用 onPause()方法,而后B 调用onCreate() ,onStart(), OnResume() ,这个时候B覆盖了窗体, A会调用onStop()方法.
b、若是B是个透明的界面,或者是对话框的样式, 就不会调用onStop()方法。 9. 横竖屏切换时候Activity的生命周期。 这个生命周期跟清单文件里的配置有关系 不设置Activity的android:configChanges时,切屏会销毁当前Activity,而后从新加载,从新调用各个生命周期。 设置Activity的android:configChanges="orientation|keyboardHidden|screenSize"时,切屏不会从新调用各个生命周期,只会执行 onConfigurationChanged 方法linux

(横竖屏切换的时候,若是有弹窗会被销毁。-- 若是要在旋转屏幕后保留对话框应该怎么办?) 10. 如何将一个Activity设置成窗口的样式。 能够设置activity的样式为对话框 android:theme="@android:style/Theme.Dialog" 11. 若是后台的Activity因为某缘由被系统回收了,如何在被系统回收以前保存当前状态?android

除了在栈顶的activity,其余的activity都有可能在内存不足的时候被系统回收,一个activity越处于栈底,被回收的可能性越大. protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putLong("id", 1234567890); } public void onCreate(Bundle savedInstanceState) { // 判断 savedInstanceState是否是空. // 若是不为空就取出来 super.onCreate(savedInstanceState); } protected void onRestoreInstanceState(Bundle savedInstanceState) { }git

备用方案:切换到后台的时候就先把数据保存,在切换到前台的时候从新获取数据恢复界面 12. 两个Activity之间传递数据,除了intent,广播接收者,content provider还有啥? 1)利用static静态数据,public static成员变量 2)利用外部存储的传输, 例如 File 文件存储
SharedPreferences首选项
Sqlite 数据库 (Activity间哪些方式传递数据?) 13. 如何退出Activity?如何安全退出已调用多个Activity的Application a、一般状况用户退出一个Activity只需按返回键,咱们写代码想退出activity直接调用finish()方法就行。 b、记录打开的Activity: 每打开一个Activity,就记录下来。在须要退出时,关闭每个Activity便可。程序员

c、发送特定广播: 在须要结束应用时,发送一个特定的广播,每一个Activity收到广播后,关闭便可。 d、递归退出 在打开新的Activity时使用startActivityForResult,而后本身加标志,在onActivityResult中处理,递归关闭。 e、经过 intent的flag 来实现intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一个新的activity。此时若是该任务栈中已经有该Activity,那么系统会把这个Activity上面的全部Activity干掉。其实至关于给Activity配置的启动模式为SingleTop。 14. service是否在main thread中执行, service里面是否能执行耗时的操做? a、默认状况, Service和activity是运行在当前app所在进程的main thread(UI主线程)里面,service里面不能执行耗时的操做(网络请求,拷贝数据库,大文件 ) . 若是要执行耗时操做,须要开启子线程执行 Thread.currentThread().getName(); b、特殊状况 ,能够在清单文件配置 service 执行所在的进程 ,让service在另外的进程中执行。独立进程和当前应用主线程无关,能够作任意的耗时操做。github

  1. 怎么在启动一个Activity时就启动一个service? 在activity的onCreate()方法里面 startService();
  2. 同一个程序,但不一样的Activity是否能够放在不一样的Task任务栈中? a、Singleinstance 运行在另外的单独的任务栈里面 b、在激活一个新的activity时候, 给Intent的flag添加FLAG_ACTIVITY_NEW_TASK,这个被激活的activity就会在新的task栈里面 Intent intent = new Intent(A.this,B.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
  3. 怎么在activity中启动service? 启动service有两种方式 a、startService() 一旦被建立 调用着无关 无法使用service里面的方法 b、bindService () 把service 与调用者绑定 ,若是调用者被销毁, service会销毁。bindService()方式启动服务让activity可以访问到 service里面的方法
  4. 描述下Service的生命周期。 Service有绑定模式和非绑定模式,以及这两种模式的混合使用方式。不一样的使用方法生命周期方法也不一样。 a、非绑定模式:当第一次调用startService的时候执行的方法依次为onCreate()、onStartCommand(),当Service关闭的时候调用onDestory方法。 b、绑定模式:第一次bindService()的时候,执行的方法为onCreate()、onBind()解除绑定的时候会执行onUnbind()、onDestory()。 上面的两种生命周期是在相对单纯的模式下的情形。咱们在开发的过程当中还必须注意Service实例只会有一个,也就是说若是当前要启动的Service已经存在了那么就不会再次建立该Service,固然也不会调用onCreate()方法。 c、一个Service能够被多个客户进行绑定,只有全部的绑定对象都执行了onBind()方法后该Service才会销毁,不过若是有一个客户执行了onStart()方法,那么这个时候若是全部的bind客户都执行了unBind()该Service也不会销毁。(播放音乐时,播放界面要控制Service的音乐播放--bindService特性,退出音乐界面后音乐还要继续播放--startService特性)
  5. 子线程不能代替service吗? a、不能替代 b、 首先要确认一件事,Service做为四大组件之一,是运行在主线程的,能够直接显示吐司,修改View等。若是要运行耗时操做,服务须要本身开启子线程。 c、 只做为后台来理解的话,相比于线程,服务具有完善的生命周期,更方便随时释放资源。 d、 服务本身就有上下文(Context)对象,能够保证上下文是正常可用的。线程须要从外部获取上下文对象,在运行时没法保证该对象没有被系统销毁。 e、在没有界面存在的时候;只有子线程运行的进程是空进程,随时可能被回收;只有服务运行的进程是服务进程,比较难被回收。
  6. 什么是IntentService?有何优势? a、普通的service,默认运行在ui main 主线程 b、IntentService是Sdk给咱们提供的方便的,带有异步处理的service类, 它的OnHandleIntent() 方法在子线程运行,方便处理耗时的操做
  7. 何时使用Service? a、Service的特色可让他在后台一直运行,能够建立线程去完成耗时的操做. b、Broadcast receiver生命周期较短,捕获到一个事件以后,能够起一个service来完成一个耗时的操做. c、Service若是被启动起来,能够被屡次bind, 但不会从新create.在多个应用间共用一段代码,节约系统资源。好比索爱手机X10i的人脸识别的service能够被图库使用,能够被摄像机,照相机等程序使用. d、全部界面都已经关闭,须要在后台监控数据的时候。 e、拥有service的进程具备较高的优先级,能够保护应用资源不会被回收。 官方文档告诉咱们,Android系统会尽可能保持拥有service的进程运行,只要在该service已经被启动(start)或者客户端链接(bindService)到它。当内存不足时,须要保持,拥有service的进程具备较高的优先级。 1. 若是service正在调用onCreate, onStartCommand或者onDestory方法,那么用于当前service的进程至关于前台进程以免被killed。 2. 若是当前service已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,可是比那些不可见的进程更重要,这就意味着service通常不会被killed. 3. 若是客户端已经链接到service (bindService),那么拥有Service的进程则拥有最高的优先级,能够认为service是可见的。 4. 若是service可使用startForeground(int, Notification)方法来将service设置为前台状态,那么系统就认为是对用户可见的,并不会在内存不足时killed。 若是有其余的应用组件做为Service,Activity等运行在相同的进程中,那么将会增长该进程的重要性。
  8. 请描述一下Intent 和 Intent Filter。 Android 中经过Intent 和IntentFilter能够实现四大组件的调用与激活。 Intent能够比做一封邮件,包含收件地址和具体的内容。其中消息“目的地”是必须的,而内容则是可选项。 Intent filter: 能够理解为邮箱…

这个分拣系统经过3个参数来识别 Action: 动做 view Category :额外的附加信息 Data: 数据uri或mimetyppe uri面试

若是咱们在启动一个 Activity 时使用这样的 Intent 对象: Intent intent =new Intent(); intent.setAction("cn.itcast.action"); 那么全部的 Action 列表中包含了“cn.itcast.action”的 Activity 都将会匹配成功。 一个 Intent 能够经过 URI 携带外部数据给目标组件。在 节点中,经过 节点匹配外部数据。mimeType 属性指定携带外部数据的数据类型,scheme 指定协议,host、port、path 指定数据的位置、端口、和路径。 若是在 Intent Filter 中指定了这些属性,那么只有全部的属性都匹配成功时 URI 数据匹配才会成功。好比注册了 http协议的 Audio/Mp3 类型文件,那就不会有其余的调用唤起当前Activity。 23. 系统上安装了多种浏览器,可否指定某浏览器访问指定页面? 启动一个界面有隐式意图和显式意图两种方式。 隐式意图能够启动一个类型的界面,显示意图能够启动指定应用的指定界面。 这里使用显示意图就能够。 Intent intent = new Intent(); intent.setClassName(packageName, className); intent.seturi() 24. Intent传递数据时,能够传递哪些类型数据? a、 数据的uri, intent.setData() intent.getData(); 数据的type,intent.setType(), intent.getType(); b、八大基本数据类型 Intent .putextra() intent.getextra(); c、可序列化对象。 (传递序列化对象时要生成新的对象,传递图片的时候应该传递uri,不要直接传递bitmap对象。) 25. Serializable和Parcelable的区别 性能: a、Serializable在序列化的时候须要把对象先写到磁盘上,致使性能较低。Parcelable序列化在内存里处理,性能较高。谷歌推荐使用Parcelable类。 b、Parcelable不能使用在要将数据存储在磁盘上的状况。尽管Serializable效率低点,但在这种状况下,只能使用Serializable 。算法

实现: a、Serializable 的实现,只须要继承Serializable 便可。这只是给对象打了一个标记,系统会自动将其序列化。 b、Parcelabel 的实现,须要在类中添加一个静态成员变量 CREATOR,这个变量须要继承 Parcelable.Creator 接口。sql

  1. 请描述一下Broadcast Receiver。 a、手机使用时有不少事件没法肯定何时会发生,好比电量变化,收到短信等,这个时候能够经过注册一个广播接收者,等待系统发送广播就能够。 b、广播分两种 有序广播 无序广播 abortBroadcast(); c、具体使用有: 接收系统的广播通知, 系统自带了不少广播,sd卡挂载,手机重启,低电量,来电,来短信等…. 关闭全部的Activity 画画板生成图片后,发送一个sd挂载的通知,通知系统的gallery去获取到新的图片. Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())); sendBroadcast(intent);数据库

  2. BroadCastReceiver的生命周期 a、 广播接收者的生命周期很是短暂的,在接收到广播的时候建立,onReceive()方法结束以后销毁; b、广播接收者中不要作一些耗时的工做,不然会弹出Application No Response错误对话框; c、最好也不要在广播接收者中建立子线程作耗时的工做,由于广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉; d、耗时的较长的工做最好放在服务中完成;

  3. 请介绍下Android的数据存储方式。 a、文件 访问权限. sdcard /。存储图片、序列化对象等 b、SharedPreference //shared_preps 。存储设置信息。 c、数据库 sqlite 。存储大量的结构化数据。 d、网络 socket tcp udp , http httpurlconnection。

  4. 为何要用ContentProvider?它和sql的实现上有什么差异? a、android 系统下 不一样程序 数据 在data目录的不一样子文件下,默认是不能共享访问 b、ContentProvider 是Android 提供的一个共享数据的类,而Sql 是一种操做数据库的语言。 c、仅针对操做数据而言,ContentProvider屏蔽数据存储的细节,对用户透明,用户只须要关心操做数据的uri就能够了 d、ContentProvider能够实现不一样app之间共享,操做数据 e、Sql也有增删改查的方法. 可是sql只能查询本应用下的数据库。而contentprovider 还能够去增删改查本地文件. xml文件、网络数据读取更改

  5. 请介绍下ContentProvider是如何实现数据共享的。 a、建立一个MyProvider类继承ContentProvider,并实现增删改查方法 b、在清单文件里注册MyProvider类,注册可以响应的Uri c、调用者获取ContentResolver,并使用约定的uri执行增删改查操做 ContentResolver resolver = getContentResolver(); resolver.query(uri, projection, selection, selectionArgs, sortOrder);} d、系统会自动找到MyProvider,并调用它的增删改查方法

  6. 说说ContentProvider ContentResolver ContentObserver之间的关系 a、ContentProvider 内容提供者,用于封装数据操做 b、ContentResolver 内容解析者,用于调用ContentProvider 处理数据 c、ContentObserver 内容监听器,能够监听数据的状态改变 d、能够经过ContentResolver.registerContentObserver(uri,observer)监听指定uri的消息。 e、使用ContentResolver.notifyChange(uri)发出消息,则正在监听该uri的observer的onchange方法会被调用。

  7. 描述一下Fragment的生命周期

  8. Fragment和Activity之间的交互, Fragment和Fragment之间的交互 a、强耦合的方式:Activity自己就持有Fragment对象,能够直接调用Fragment的函数。Fragment调用Activity的函数则麻烦一些,谷歌官方推荐在Fragment里定义一个接口,而后Activity实现该接口。那么在Fragment里获取到的Activity能够强转为接口对象,Fragment调用接口里的函数则能够和Activity的交互。 b、弱耦合的方式:使用广播接收者,在Activity和Fragment里分别注册广播接收者,互相发送消息便可,这种方式不须要Activity和Fragment互相持有引用。 c、弱耦合的方式2:使用EventBus能够达到和广播相同的效果,同时因为广播的响应范围是整个系统,而EventBus的做用范围是应用内,因此效能更高。注意:回答这种方式的话须要了解EventBus的使用。

  9. 请介绍下Android中经常使用的五种布局。 a、五大布局是:FrameLayout(帧布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局) b、FrameLayout 从屏幕的左上角开始布局,叠加显示, 实际应用 播放器的暂停按钮.
    c、LinearLayout 线性布局,这个东西,从外框上能够理解为一个div,他首先是一个一个从上往下罗列在屏幕上。每个LinearLayout里面又可分为垂直布局和水平布局)。 d、AbsoluteLayout 绝对布局用X,Y坐标来指定元素的位置 android:layout_x="20px" android:layout_y="12px" 指定平板机型的游戏开发、机顶盒开发中常常用到绝对布局。 e、RelativeLayout 相对布局可使用另外一个控件或者父窗体为参照物,来肯定控件在界面上的位置。这种布局能够处理复杂的界面,比线性布局的嵌套结构更节约内存和CPU。 f、TableLayout 表格布局相似Html里面的Table。每个TableLayout里面有表格行TableRow,TableRow里面能够具体定义每个元素,设定他的对齐方式 android:gravity="" 。能够用于oa 自动化 生成报表。目前基本被废弃了。

  10. 谈谈UI中, Padding和Margin有什么区别? Padding 是对控件的内容, margin是控件对父窗体.

  11. 描述JSON数据的Header和Body功能 a、JSON自己只是规定了数据格式,并无Header和Body的约定。此题考察的是面试者是否有工做经验。 b、在正式的项目中,传输的JSON字符串会约定好传递一个header表明请求的异常状态,此时body存放才是正真的bean数据。相似下面的格式:

  12. 说明JSON和XML二者的特性 a、都是传递数据使用的格式化字符串 b、Json的格式比较精简,XML的格式比较复杂,在移动领域里为了节约流量,大可能是使用json c、Xml有更强的扩展性,在一些特殊需求里只能使用xml

  13. 请解析下面的JSON数组

a、 字符串能够乱写,json数组不能乱拼。这个数组的格式是错误的,item的数据格式不一致,根本就不是一个数组。 b、 工做里遇到这种状况时,应该要求服务端返回的数组内容格式统一,全部的item都包含name、uid、age。同时title应该是和数组平级的数据。 39. 请解释下在单线程模型中Message、Handler、Message Queuen、Looper之间的关系。

  1. 对android主线程的运用和理解。 主线程,也就是UI线程,不能执行耗时的操做。四大组件都是在主线程运行。

  2. AIDL的全称是什么?如何工做? Android interface definition language (android接口定义语言) , 用来跨进程的访问方法, 手机卫士 Itelephony 接口挂断电话.

  3. 请解释下Android程序运行时权限与文件系统权限的区别。 a、Android程序执行须要读取到安全敏感项,好比耗电或者花钱。必需在androidmanifest.xml中声明相关权限请求, 打电话,访问网络,获取坐标,读写sd卡,读写联系人等..安装的时候会提示用户。主要是给用户看的。 b、文件系统的权限是linux权限. 也就是文件的可读可写可执行权限。主要是给程序员看的。(若是理解比较多,能够拓展说一下:777本身 同组 其余)

  4. Framework工做方式及原理,Activity是如何生成一个view的,机制是什么。 a、 使用反射, 解析配置文件来获取要使用的类和初始化属性 b、 四大组件都有本身的生命周期,Framework经过调用不一样的生命周期方法,管理四大组件的资源。 c、Activity建立一个view是经过 ondraw 画出来的, 画这个view以前,调用onmeasure方法来计算显示的大小.

  5. 如何加载音乐、图片、视频信息,如何改善其效率。 a、Android提供mediascanner,mediaStore等类,扫描储存卡里的数据, 音乐文件的信息都会存放到系统的数据库表中,能够经过MediaProvider获取, b、改善显示效率是个常见问题, 能够从如下几个方面做答, 分批加载数据, 延时加载数据, 合理使用缓存等.

  6. 要作一个尽量流畅的ListView,你平时在工做中如何进行优化的? a、复用convertView ,节约内存 b、使用ViewHolder ,节约cpu c、Item布局最好使用相对布局,层级越少越好,节约内存和Cpu。(使用hierarchyview工具查看优化。 ) d、item中有图片时,异步加载 。避免阻塞主线程。 e、快速滑动时,不加载图片。避免解析出来Bitmap却不使用,浪费内存和CPU资源。 f、item中有图片时,应对图片进行适当压缩 。节约内存。 g、实现数据的分页加载。下降CPU和内存负载峰值。

  7. 如何在ScrollView中如何嵌入ListView 好比微博详情界面,微博正文+评论列表。 a、一般状况下咱们不会在ScrollView中嵌套ListView,可是若是面试官非让我嵌套的话也是能够的。 b、在ScrollView添加一个ListView会致使listview控件显示不全,一般只会显示一条,这是由于两个控件的滚动事件冲突致使。因此须要经过listview中的item高度 * count去计算listview的显示高度,从而使其完整展现。 C、这时listview的全部item都被建立出来,不存在convertview复用,占用内存极高。工做里不建议使用,通常是把微博正文放在listview的headerView里,评论作为列表部分。

  8. 如何实现让ListView的条目显示不同的布局? a、 重写BaseAdapter的getViewTypeCount()方法返回有几种条目类型 b、 重写BaseAdapter的getItemViewType(int position)方法,返回值指定position的条目是什么类型的 c、在BaseAdapter的getView方法中根据当前position的条目类型去加载不一样的View

  9. 启动应用后,改变系统语言,应用的语言会改变么? a、已经作了多国语言的话,会变 b、可是设置了android:configChanges="locale",则不会 在项目里增长zh测试修改语言。能够看到修改语言其实是界面重启,从新加载资源。

  10. 启动一个程序,能够主界面点击图标进入,也能够从一个程序中跳转过去,两者有什么区别? a、区别是根据activity在manifest里面的配置,这个activity可能会放在不一样的task栈里面。intent设置的flag flag_new_task 也会有影响。 b、好比,步骤一,在文件管理器里打开一个文本或者图片,按home键退出;步骤二,从桌面打开图片app,能够看到图片app有本身的堆栈;步骤三,打开文件管理器。能够看到图片预览界面在文件管理器的堆栈里。

  11. Android程序与Java程序的区别? a、 Android SDK引用了大部分的Java SDK,少数部分被Android SDK抛弃,好比说界面部分,java.awt swing package除了java.awt.font被引用外,其余都被抛弃,在Android平台开发中不能使用。 b、 android sdk 添加工具jar ,好比httpclient , pull ,opengl c、将Java 游戏或者j2me程序移植到Android平台的过程当中,后台逻辑不须要修改,只要修改前台的界面就能够。

  12. Android中Task任务栈的分配。 a、首先咱们来看下Task的定义,Google是这样定义Task的:a task is what the user experiences as an "application." It's a group of related activities, arranged in a stack. A task is a stack of activities, not a class or an element in the manifest file. 这意思就是说Task其实是一个Activity栈,一般用户感觉的一个Application就是一个Task。从这个定义来看,Task跟Service或者其余Components是没有任何联系的,它只是针对Activity而言的。 b、Activity有不一样的启动模式, 能够影响到task的分配 c、standard: 标准模式,一调用 startActivity()方法就会产生一个新的实例。 d、singleTop: 若是已经有一个实例位于 Activity 栈的顶部时, 就不产生新的实例, 而只是调用Activity 中的 newInstance()方法。若是不位于栈顶,会产生一个新的实例。 e、singleTask: 会在一个新的 task 中产生这个实例,之后每次调用都会使用这个,不会去产生 新的实例了。 f、singleInstance: 这个跟 singleTask 基本上是同样, 只有一个区别: 在这个模式下的 Activity实例所处的 task 中,只能有这个 activity实例,不能有其余的实例。

  13. dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 a、每一个dvm虚拟机都是linux里面的一个进程. b、dvm的进程是dalivk虚拟机进程,每一个android程序都运行在本身的进程里面, c、三个进程不是一个概念,可是在使用中因为一个dvm虚拟机就是一个linux进程,同时一个虚拟机只运行一个应用,因此也默认三者是同一个能够统一使用。

  14. 如何判断是否有SD卡? 配置文件中有sd卡的权限, 经过environment的静态方法判断 Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED )

  15. 嵌入式操做系统内存管理有哪几种, 各有何特性。 页式,段式,段页,等 …

  16. 什么是嵌入式实时操做系统, Android 操做系统属于实时操做系统吗? 实时操做系统是指当外界事件或数据产生时,可以接受并以足够快的速度予以处理,其处理的结果又能在规定的时间以内来控制生产过程或对处理系统做出快速响应,并控制全部实时任务协调一致运行的嵌入式操做系统。 主要用于工业控制、军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这就须要使用实时系统。又可分为软实时和硬实时两种,而android是基于linux内核的,所以属于软实时。

  17. 谈谈对Android NDK的理解。 a、native develop kit 是一个交叉编译的工具,能够编译c语言代码,生成在手机上运行的.so文件,供java语言调用 b、通常在实时性要求高的应用里使用ndk,好比游戏, 图形渲染, opencv (人脸识别) ,高清解码等 c、反编译C语言比Java困难,须要对核心源码进行保密的时候也可使用NDK处理 d、咱们项目中那些地方用到了ndk, 好比手机影音、百度地图

  18. Android系统中GC什么状况下会出现内存泄露呢? 内存溢出(OOM) a、Java 内存泄露的根本缘由就是 保存了不可能再被访问的变量类型的引用 b、若是程序中存在对无用对象的引用,那么这些对象就会驻留内存,消耗内存,由于没法让垃圾回收器GC验证这些对象是否再也不须要。若是存在对象的引用,这个对象就被定义为"有效的活动",同时不会被释放。 c、要肯定对象所占内存将被回收,咱们就要务必确认该对象再也不会被使用。典型的作法就是把对象数据成员设为null或者从集合中移除该对象。 d、当局部变量不须要时,不需明显的设为null,由于一个方法执行完毕时,这些引用会自动被清理。 e、若是出现大量的内存泄露,致使有内存被对象占用不能释放,最终致使内存耗尽没法建立新的对象,就会出现内存溢出(OOM) Java带垃圾回收的机制,为何还会内存泄露呢? Vector v = new Vector(10);
    for (int i = 1; i < 100; i++) {
     Object o = new Object();   v.add(o);   o = null;
    }//此时,全部的Object对象都没有被释放,由于变量v引用这些对象。

Handler h = new Handler(); 58. java中的soft reference是个什么东西 a、StrongReference 是 Java 的默认引用实现, 它会尽量长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收 b、SoftReference 会尽量长的保留引用直到 JVM 内存不足时才会被回收(虚拟机保证), 这一特性使得 SoftReference 很是适合缓存 c、WeekReference 在每次GC时都被回收 d、在之前的开发里,图片的缓存多数使用软引用,保证内存不足时图片可以及时被回收。在Android2.3版本以后软引用的功能被修改成弱引用同样,致使图片老是要不断从新加载,性能不好。新的图片缓存实现都是LruCache机制。 59. 说说LruCache底层原理 a、LruCache使用一个LinkedHashMap简单的实现内存的缓存,没有软引用,都是强引用。若是添加的数据大于设置的最大值,就删除最早缓存的数据来调整内存。 b、经过构造方法初始化的maxSize值,它表示这个缓存的最大值是多少。通常都是可用的内存大小的八分之一, Runtime.getRuntime().maxMemory() / 8, c、插入图片时首先会判断插入后的size大小是否超过maxSize,若是超过了,就删除最长时间未使用的缓存。这个操做将一直循环下去,直到size比maxSize小或者缓存为空。 60. 如何避免oom异常 OOM内存溢出,想要避免OOM异常首先咱们要知道什么状况下会致使OOM异常。 a. 图片过大致使OOM Android 中用bitmap时很容易内存溢出,好比报以下错误:Java.lang.OutOfMemoryError : bitmap size exceeds VM budget。 解决方法: 方法1: 等比例缩小图片

以上代码能够优化内存溢出,但它只是改变图片大小,并不能完全解决内存溢出。 方法2:使用LruCache机制管理图片。限制图片的内存上限,并及时地进行recyle()操做 方法3:使用加载图片框架处理图片,如专业处理加载图片的ImageLoader图片加载框架。还有咱们学的XUtils的BitMapUtils来作处理。 b.界面切换致使oom 通常状况下,开发中都会禁止横屏的。由于若是是来回切换话,activity的生命周期会从新销毁而后建立。 有时候咱们会发现这样的问题,横竖屏切换N次后 OOM了。 这种问题没有固定的解决方法,可是咱们能够从如下几个方面下手分析。 一、看看页面布局当中有没有大的图片,好比背景图之类的。 去除xml中相关设置,改在程序中设置背景图(放在onCreate()方法中):

在Activity destory时注意,drawable.setCallback(null); 防止Activity得不到及时的释放。
复制代码

二、跟上面方法类似,直接把xml配置文件加载成view 再放到一个容器里,而后直接调用 this.setContentView(View view);方法,避免xml的重复加载。 三、 在页面切换时尽量少地重复执行一些代码 好比:重复调用数据库,反复使用某些对象等等...... c.查询数据库没有关闭cursor 程序中常常会进行查询数据库的操做,可是常常会有使用完毕Cursor后没有关闭的状况。若是咱们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操做的状况下才会出现内存问题,这样就会给之后的测试和问题排查带来困难和风险。 d.构造Adapter没有使用convertview 在使用ListView的时候一般会使用Adapter,那么咱们应该尽量的使用ConvertView。 e、为变量设置合适的做用范围 尽可能小的变量做用范围能够保证变量尽快被回收,节约内存。 61. 根据本身的理解描述下Android数字签名。 a、全部的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序 b、Android程序包使用的数字证书能够是自签名的,不须要一个权威的数字证书机构签名认证 (对于网站而言,若是要证实本身是可信的,他们须要使用权威证书网站的证书) c、若是要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。 d、数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。若是程序已经安装在系统中,即便证书过时也不会影响程序的正常功能 62. 什么是ANR 如何避免它? a、在Android上,主线程使用来更新UI的,若是你的应用程序在主线程作耗时的操做,致使有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称做应用程序无响应(ANR:Application Not Responding)对话框。 b、要避免这个问题能够把耗时的操做放在子线程里面完成, handler message,AsynTask , intentservice.等 63. android中的动画有哪几类,它们的特色和区别是什么? 帧动画, 补间动画, 属性动画;  帧动画(Frame Animation)通常用于图片的切换,实现生成连续的gif图效果  补间动画(Tween Animation)分为平移(Translate)、旋转(Rotate)、缩放(Scale)、不透明度(Alpha);补间动画只是改变了View的显示效果  属性动画(Property Animation),Android3.0 (API11)及之后出现的功能,3.0以前的版本可以使用github第三方开源库nineoldandroids.jar进行支持。支持对全部View能更新的属性的动画,如translationX水平平移, translationY竖直平移,alpha透明度, left左边位置, rotation旋转角度, scale缩放等,  属性动画不只能实现补间动画的全部效果,并且是对view或任意对象的属性的不断进行的值操做。好比一个Button的位移,补间动画只是重绘了view,并无真正的去改变Button的位置,点击事件仍是停留在原来的位置,而属性动画就是在真正改变Button的位置; 64. 如何屏幕适配 Android的屏幕适配主要有五种方式: a、layout适配,根据不一样的屏幕大小加载不一样文件夹下的布局文件图片适配. b、权重适配,设置显示比例。 c、根据不一样屏幕大小使用不一样文件夹下的图片。使用9Patch图片。 d、dimens.xml文件适配,根据不一样的手机的密度加载不一样文件夹下的dimens.xml e、java代码适配 65. Emoji表情实现 a、使用SpannableString能够把TextView或EditText的一部分文本替换为图片。 b、Span不只能够在Textview、Edittext中把一部份内容设置为图片,还能够设置一部份内容的样式,如:字体、颜色、点击事件等。

SpannableString spannableString = new SpannableString("0123456789"); Drawable icon = getResources().getDrawable(R.drawable.ic_launcher); ImageSpan span = new ImageSpan(icon); spannableString.setSpan(span,2,3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 66. 自定义控件经常使用的方法 a、onMeasure方法:测量控件的大小 b、onLayout方法:对子View进行排版 c、onDraw方法:把控件画出来 d、onTouch方法:处理触摸事件 67. Android中touch事件的传递机制是怎样的? a、Touch事件传递的相关API有dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent b、Touch事件相关的类有View、ViewGroup、Activity c、Touch事件会被封装成MotionEvent对象,该对象封装了手势按下、移动、松开等动做 d、Touch事件一般从Activity#dispatchTouchEvent发出,只要没有被消费,会一直按布局层次往下传递,到最底层的View。 e、若是Touch事件传递到的每一个View都不消费事件,那么Touch事件会反向向上传递,最终交由Activity#onTouchEvent处理. f、onInterceptTouchEvent为ViewGroup特有,能够拦截事件. g、Down事件到来时,若是一个View没有消费该事件,那么后续的MOVE/UP事件都不会再给它 68. 说说mvc模式的原理,它在android中的运用。 a、MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分红三个层——模型层、视图层、控制层。 b、Android里MVC模式的使用随处均可以见到。最基本的就是控件对象,xml布局文件,Activity类。以及数据集合,ListView,Adapter。 69. udp链接和TCP的不一样之处,Socket是什么? a、tcp确保数据安全,创建链接时有三次握手过程。面向链接流 b、udp 不关心数据是否达到,是否阻塞。面向无链接 c、画面优先. tcp 流畅优先 udp d、协议只是一个文档约定,Socket是Java语言里对TCP/IP协议的实现 描述下这三次TCP对话的简单过程: 主机A向主机B发出链接请求数据包:“我想给你发数据,能够吗?”,这是第一次对话; 主机B向主机A发送赞成链接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工做)的数据包:“能够,你何时发?”,这是第二次对话; 主机A再发出一个数据包确认主机B的要求同步:“我如今就发,你接着吧!”,这是第三次对话。 三次“对话”的目的是使数据包的发送和接收同步,通过三次“对话”以后,主机A才向主机B正式发送数据。 70. 手写一个单例模式,能不能保证使用时对象的惟一性 a、饿汉式和懒汉式的单例模式代码处处都有,请自行查找学习 b、这两种方法都不能保证使用时对象的惟一性。好比,当对象是可序列化的,保存对象到本地后,每次反序列化都是生成了一个新的对象。 c、最好的实现单例模式的方案为,编写一个包含单个元素的枚举。程序员没法本身new出枚举对象,保证了只能有一个对象。同时枚举的序列化机制也不会在反序列化时建立出新的对象,保证对象的惟一性。 71. 你知道推送的原理吗?调用哪一个方法能够接收消息,传递哪些参数呢? a、传统获取服务器数据使用的是pull模式,是客户端向服务器请求数据。从客户端发起链接请求,获取到服务器数据后就关闭链接。当链接断开后,服务器就会失去客户端的地址,所以没法主动向客户端发送消息。 b、推送(push)是服务主动向客户端发送数据。它的原理是保持一个长链接,当客户端和服务器创建链接后再也不断开,这样服务器随时有新消息均可以发送给客户端。 c、至于如何获取推送消息。因为服务端传来推送消息的时间是不肯定的,这里只能等待推送SDK的回调,好比经过注册监听或者广播接收者。不一样的厂商的推送SDK可能会有不一样的处理方案,以百度推送SDK来讲,是经过广播接收者获取推送数据。

  1. 开发中都使用到哪些框架、平台 EventBus(事件处理) JPush(推送平台) 友盟(统计平台) 有米(优米)(广告平台) 百度地图 bmob(服务器平台、短信验证、邮箱验证、第三方支付) 阿里云OSS(云存储) ShareSDK(分享平台、第三方登陆) Gson(解析json数据框架) imageLoader (图片处理框架) zxing (二维码扫描)
  2. 开发过程当中使用到哪些自定义控件 pull2RefreshListView 下拉刷新 LazyViewPager 只加载当前页 SlidingMenu 侧栏菜单 ToggleButton 滑动的开关
  3. android开发中怎么去调试bug a、logcat b、断点 debug c、从版本控制系统检出代码,查找出错的提交。好比一个月前没有的问题,忽然出现,能够将代码回退到一个月前,使用二分法检查是哪一次提交的代码致使出现问题。
  4. 写10个简单的linux命令 文件管理:ls mv rm cd mkdir 网络管理:ping ifconfig 文件搜索、编辑:find grep vi cat 查看系统资源占用:du df ps top
  5. JNI调用经常使用的两个参数 JNIEnv *env, jobject javaThis
  6. ddms 和traceview的区别. a、 DDMS全称daivilk debug manager system,是Android自带的debug界面 b、TraceView是Android的性能分析工具,是DDMS组成的一部分

1.在应用的主activity的onCreate方法中加入Debug.startMethodTracing("要生成的traceview文件的名字"); 2.一样在主activity的onStop方法中加入Debug.stopMethodTracing(); 3.同时要在AndroidManifest.xml文件中配置权限 3.从新编译,安装,启动服务,测试完成取对应的traceview文件(adb pull /sdcard/xxxx.trace)。 4.直接在命令行输入traceview xxxxtrace,弹出traceview窗口,分析对应的应用便可。 78. 手写算法 a、通常面试考察的都是计算机入门的基本算法,好比排序和查找,而且会要求在纸上手写Java代码或伪代码。 b、排序最基础的是冒泡排序。若是可使用快速排序,能够认为学习能力优秀。 c、查找最基础的算法是有序数组的折半查找。 d、对于复杂的测试,好比让现场写一个自定义控件,能够分析一下实现思路。 79. 项目如何向低版本兼容 a、样式兼容: (1)使用兼容包中的样式,如v7\v4 中的Compat 相关样式。 (2)定义多个不一样value文件夹,不一样版本指定不一样样式。 b、布局兼容: 定义多个不一样layout-verson(verson为版本数字) 的文件夹,不一样版本指定不一样的布局文件。 c、高版本代码兼容方式: (1)尽可能使用兼容包中的API,如getSupportActionBar, getSupportFragmentManager() 等。 (2)使用系统Version 来判断,使低版本系统不能执行高版本代码。同时使用 @TargetApi 来消除eclipse、AS 等工具报错。 80. 介绍一下你的项目架构 架构是程序的骨架,肯定了整体的接口,要求具体的子类实现细节处理。并非非要用到反射、注解等高级技术才能叫架构。 a、界面架构 BaseActivity,BaseFragmen。拆解onCreate过程为initView、initListener、initData b、网络架构 三级网络封装 c、图片、文件、数据库等数据数据管理架构

相关文章
相关标签/搜索