Android开发面试经——5.常见面试官提问

 

Android开发面试经——5.常见面试官提问Android题① - 移动互联的寻梦之旅 - 博客频道 - CSDN.NET

来源网址: http://blog.csdn.net/finddreams/article/details/44514011

 

关注finddreams博客: http://blog.csdn.net/finddreams/article/details/44513579

一般的面试流程是笔试完就接着是面试了,面试时技术经理会问你一些你工作中遇到的Android方面的问题,谈谈你所做的项目,和在项目中所扮演的角色。今天我就给大家整理一些,面试中常见的面试官提的一些问题?

1.要做一个尽可能流畅的ListView,你平时在工作中如何进行优化的?

①Item布局,层级越少越好,使用hierarchyview工具查看优化。 ②复用convertView ③使用ViewHolder ④item中有图片时,异步加载 ⑤快速滑动时,不加载图片 ⑥item中有图片时,应对图片进行适当压缩 ⑦实现数据的分页加载

2.对于Android 的安全问题,你知道多少

①错误导出组件 ② 参数校验不严 ③WebView引入各种安全问题,webview中的js注入 ④不混淆、不防二次打包 ⑤明文存储关键信息 ⑦ 错误使用HTTPS ⑧山寨加密方法 ⑨滥用权限、内存泄露、使用debug签名

3. 如何缩减APK包大小?

代码 保持良好的编程习惯,不要重复或者不用的代码,谨慎添加libs,移除使用不到的libs。 使用proguard混淆代码,它会对不用的代码做优化,并且混淆后也能够减少安装包的大小。 native code的部分,大多数情况下只需要支持armabi与x86的架构即可。如果非必须,可以考虑拿掉x86的部分。 资源 使用Lint工具查找没有使用到的资源。去除不使用的图片,String,XML等等。 assets目录下的资源请确保没有用不上的文件。 生成APK的时候,aapt工具本身会对png做优化,但是在此之前还可以使用其他工具如tinypng对图片进行进一步的压缩预处理。 jpeg还是png,根据需要做选择,在某些时候jpeg可以减少图片的体积。 对于9.png的图片,可拉伸区域尽量切小,另外可以通过使用9.png拉伸达到大图效果的时候尽量不要使用整张大图。 策略 有选择性的提供hdpi,xhdpi,xxhdpi的图片资源。建议优先提供xhdpi的图片,对于mdpi,ldpi与xxxhdpi根据需要提供有差异的部分即可。 尽可能的重用已有的图片资源。例如对称的图片,只需要提供一张,另外一张图片可以通过代码旋转的方式实现。 能用代码绘制实现的功能,尽量不要使用大量的图片。例如减少使用多张图片组成animate-list的AnimationDrawable,这种方式提供了多张图片很占空间。

4.Android与服务器交互的方式中的对称加密和非对称加密是什么?

对称加密,就是加密和解密数据都是使用同一个key,这方面的算法有DES。 非对称加密,加密和解密是使用不同的key。发送数据之前要先和服务端约定生成公钥和私钥,使用公钥加密的数据可以用私钥解密,反之。这方面的算法有RSA。ssh 和 ssl都是典型的非对称加密。

5.设备横竖屏切换的时候,接下来会发生什么?

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次 3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

6.Android启动Service的两种方式是什么? 它们的适用情况是什么?

如果后台服务开始后基本可以独立运行的话,可以用startService。音乐播放器就可以这样用。它们会一直运行直到你调用 stopSelf或者stopService。你可以通过发送Intent或者接收Intent来与正在运行的后台服务通信,但大部分时间,你只是启动服务并让它独立运行。如果你需要与后台服务通过一个持续的连接来比较频繁地通信,建议使用bind()。比如你需要定位服务不停地把更新后的地理位置传给UI。Binder比Intent开发起来复杂一些,但如果真的需要,你也只能使用它。 startService:生命周期与调用者不同。启动后若调用者未调用stopService而直接退出,Service仍会运行 bindService:生命周期与调用者绑定,调用者一旦退出,Service就会调用unBind->onDestroy

7.谈谈你对Android中Context的理解?

Context:包含上下文信息(外部值) 的一个参数. Android 中的 Context 分三种,Application Context ,Activity Context ,Service Context. 它描述的是一个应用程序环境的信息,通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent信息等

8.Service的onCreate回调在UI线程中吗?

Service生命周期的各个回调和其他的应用组件一样,是跑在主线程中,会影响到你的UI操作或者阻塞主线程中的其他事情

9.请介绍下AsyncTask的内部实现,适用的场景是?

AsyncTask内部也是Handler机制来完成的,只不过Android提供了执行框架来提供线程池来执行相应地任务,因为线程池的大小问题,所以AsyncTask只应该用来执行耗时时间较短的任务,比如HTTP请求,大规模的下载和数据库的更改不适用于AsyncTask,因为会导致线程池堵塞,没有线程来执行其他的任务,导致的情形是会发生AsyncTask根本执行不了的问题。

10.谈谈你对binder机制的理解?

binder是一种IPC机制,进程间通讯的一种工具. Java层可以利用aidl工具来实现相应的接口.

11.Android中进程间通信有哪些实现方式?

Intent,Binder(AIDL),Messenger,BroadcastReceiver

12.介绍下实现一个自定义view的基本流程

1、自定义View的属性 编写attr.xml文件 2、在layout布局文件中引用,同时引用命名空间 3、在View的构造方法中获得我们自定义的属性 ,在自定义控件中进行读取(构造方法拿到attr.xml文件值) 4、重写onMesure 5、重写onDraw

13.Android中touch事件的传递机制是怎样的?

1.Touch事件传递的相关API有dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent 2.Touch事件相关的类有View、ViewGroup、Activity 3.Touch事件会被封装成MotionEvent对象,该对象封装了手势按下、移动、松开等动作 4.Touch事件通常从Activity#dispatchTouchEvent发出,只要没有被消费,会一直往下传递,到最底层的View。 5.如果Touch事件传递到的每个View都不消费事件,那么Touch事件会反向向上传递,最终交由Activity#onTouchEvent处理. 6.onInterceptTouchEvent为ViewGroup特有,可以拦截事件. 7.Down事件到来时,如果一个View没有消费该事件,那么后续的MOVE/UP事件都不会再给它

14.Android多线程的实现方式有哪些?

Thread & AsyncTask Thread 可以与Loop 和 Handler 共用建立消息处理队列 AsyncTask 可以作为线程池并行处理多任务

15.Android开发中何时使用多进程?使用多进程的好处是什么?

要想知道如何使用多进程,先要知道Android里的多进程概念。一般情况下,一个应用程序就是一个进程,这个进程名称就是应用程序包名。我们知道进程是系统分配资源和调度的基本单位,所以每个进程都有自己独立的资源和内存空间,别的进程是不能任意访问其他进程的内存和资源的。 那如何让自己的应用拥有多个进程? 很简单,我们的四大组件在AndroidManifest文件中注册的时候,有个属性是android:process,1.这里可以指定组件的所处的进程。默认就是应用的主进程。指定为别的进程之后,系统在启动这个组件的时候,就先创建(如果还没创建的话)这个进程,然后再创建该组件。你可以重载Application类的onCreate方法,打印出它的进程名称,就可以清楚的看见了。再设置android:process属性时候,有个地方需要注意:如果是android:process=”:deamon”,以:开头的名字,则表示这是一个应用程序的私有进程,否则它是一个全局进程。私有进程的进程名称是会在冒号前自动加上包名,而全局进程则不会。一般我们都是有私有进程,很少使用全局进程。他们的具体区别不知道有没有谁能补充一下。

2.使用多进程显而易见的好处就是分担主进程的内存压力。我们的应用越做越大,内存越来越多,将一些独立的组件放到不同的进程,它就不占用主进程的内存空间了。当然还有其他好处,有心人会发现Android后台进程里有很多应用是多个进程的,因为它们要常驻后台,特别是即时通讯或者社交应用,不过现在多进程已经被用烂了。典型用法是在启动一个不可见的轻量级私有进程,在后台收发消息,或者做一些耗时的事情,或者开机启动这个进程,然后做监听等。还有就是防止主进程被杀守护进程,守护进程和主进程之间相互监视,有一方被杀就重新启动它。应该还有还有其他好处,这里就不多说了。

3.坏处的话,多占用了系统的空间,大家都这么用的话系统内存很容易占满而导致卡顿。消耗用户的电量。应用程序架构会变复杂,应为要处理多进程之间的通信。这里又是另外一个问题了。

16.ANR是什么?怎样避免和解决ANR?

ANR:Application Not Responding,即应用无响应 ANR一般有三种类型: 1:KeyDispatchTimeout(5 seconds) –主要类型 按键或触摸事件在特定时间内无响应

2:BroadcastTimeout(10 seconds)

BroadcastReceiver在特定时间内无法处理完成

3:ServiceTimeout(20 seconds) –小概率类型

Service在特定的时间内无法处理完成

超时的原因一般有两种:

(1)当前的事件没有机会得到处理(UI线程正在处理前一个事件没有及时完成或者looper被某种原因阻塞住) (2)当前的事件正在处理,但没有及时完成

UI线程尽量只做跟UI相关的工作,耗时的工作(数据库操作,I/O,连接网络或者其他可能阻碍UI线程的操作)放入单独的线程处理,尽量用Handler来处理UI thread和thread之间的交互。

UI线程主要包括如下:

Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick() AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel() Mainthread handler: handleMessage(), post(runnable r) other

17.Android下解决滑动冲突的常见思路是什么?

相关的滑动组件 重写onInterceptTouchEvent,然后判断根据xy值,来决定是否要拦截当前操作

18.如何把一个应用设置为系统应用?

成为系统应用,首先要在 对应设备的 Android 源码 SDK 下编译,编译好之后: 此 Android 设备是 Debug 版本,并且已经 root,直接将此 apk 用 adb 工具 push 到 system/app 或 system/priv-app 下即可。 如果非 root 设备,需要编译后重新烧写设备镜像即可。

有些权限(如 WRITE_SECURE_SETTINGS ),是不开放给第三方应用的,只能在对应设备源码中编译然后作为系统 app 使用。

19、Android内存泄露研究

Android内存泄漏指的是进程中某些对象(垃圾对象)已经没有使用价值了,但是它们却可以直接或间接地引用到gc roots导致无法被GC回收。无用的对象占据着内存空间,使得实际可使用内存变小,形象地说法就是内存泄漏了。 场景 类的静态变量持有大数据对象 静态变量长期维持到大数据对象的引用,阻止垃圾回收。 非静态内部类的静态实例 非静态内部类会维持一个到外部类实例的引用,如果非静态内部类的实例是静态的,就会间接长期维持着外部类的引用,阻止被回收掉。 资源对象未关闭 资源性对象如Cursor、File、Socket,应该在使用后及时关闭。未在finally中关闭,会导致异常情况下资源对象未被释放的隐患。 注册对象未反注册 未反注册会导致观察者列表里维持着对象的引用,阻止垃圾回收。 Handler临时性内存泄露 Handler通过发送Message与主线程交互,Message发出之后是存储在MessageQueue中的,有些Message也不是马上就被处理的。在Message中存在一个 target,是Handler的一个引用,如果Message在Queue中存在的时间越长,就会导致Handler无法被回收。如果Handler是非静态的,则会导致Activity或者Service不会被回收。 由于AsyncTask内部也是Handler机制,同样存在内存泄漏的风险。 此种内存泄露,一般是临时性的。

20.内存泄露检测有什么好方法?

检测: 1、DDMS Heap发现内存泄露 dataObject totalSize的大小,是否稳定在一个范围内,如果操作程序,不断增加,说明内存泄露 2、使用Heap Tool进行内存快照前后对比 BlankActivity手动触发GC进行前后对比,对象是否被及时回收

定位:

1、MAT插件打开.hprof具体定位内存泄露: 查看histogram项,选中某一个对象,查看它的GC引用链,因为存在GC引用链的,说明无法回收 2、AndroidStudio的Allocation Tracker: 观测到期间的内存分配,哪些对象被创建,什么时候创建,从而准确定位

 

 

Android开发面试经——4.常见Android进阶笔试题(更新中...) - 移动互联的寻梦之旅 - 博客频道 - CSDN.NET

来源网址: http://blog.csdn.net/finddreams/article/details/44301359

 

关注finddreams博客:http://blog.csdn.net/finddreams/article/details/44301359

上一篇文章我们已经了解了Android笔试的一些基础题目,

[《Android开发面试经——2.常见Android基础笔试题》 ] (http://blog.csdn.net/finddreams/article/details/44219231) 笔试完,就是面试官问你问题了,相比笔试,面试我们往往会有些许紧张,因为不知道面试官会问什么奇怪的问题,要是问的问题刚好不懂,这时就更加头皮发麻了。为了能在面试提问中取得一个满意的表现,我特别整理了一下常见的面试官提的技术问题: Android开发面试经——5.常见面试官提问Android题① Android开发面试经——6.常见面试官提问Android题②(更新中…)

但是做为一个有经验的开发者,仅仅知道基础题还是不够的,你的简历上说有两年以上工作经验的话,那面试官肯定会问一些深入性的问题,看你能否回答的出。所以为了找一个更好的工作,我们还需要去了解一下Android进阶的笔试题目:

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

ANR:Application Not Responding。 在 Android 中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当出现下列情况时,Android 就会显示 ANR 对话框了: ①.用户对应用程序的操作(如输入事件,按键、触摸屏事件)在5秒内无响应 ②. 广播接受器(BroadcastReceiver)在10秒内仍未执行完毕 Android 应用程序完全运行在一个独立的线程中(例如 main)。这就意味着,任何在主 线程中运行的,需要消耗大量时间的操作都会引发 ANR。因为此时,你的应用程序已经没有机会去响应输入事件和意向广播(Intentbroadcast)。 避免方法:Activity 应该在它的关键生命周期方法(如 onCreate()和 onResume())里尽可能少的去做创建操作, 潜在的耗时操作。例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者异步方式)来完成。 主线程应该为子线程提供一个 Handler,以便完成时能够提交给主线程。

2.Handler机制原理?

andriod 提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。 Looper 类用来管理特定线程内对象之间的消息交换 (MessageExchange)。 1)Looper: 一个线程可以产生一个 Looper 对象,由它来管理此线程里的 MessageQueue(消息队列)。 2)Handler: 你可以构造 Handler 对象来与 Looper 沟通,以便 push 新消息到 MessageQueue 里;或者接收 Looper 从 MessageQueue 取出)所送来的消息。 3) Message Queue(消息队列 ): 用来存放线程放入的消息。 4)线程: UI thread 通常就是 main thread, 而 Android 启动程序时会替它建立一个 MessageQueue。

3.请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。

简单的说,Handler获取当前线程中的 looper对象,looper 用来从存放 Message 的 MessageQueue中取出 Message,再有 Handler 进行 Message 的分发和处理. Message Queue(消息队列): 用来存放通过 Handler 发布的消息, 通常附属于某一个创建它的线程,可以通过 Looper.myQueue()得到当前线程的消息队列 Handler:可以发布或者处理一个消息或者操作一个 Runnable,通过 Handler发布消息, 消息将只会发送到与它关联的消息队列,然也只能处理该消息队列中的消息 Looper:是 Handler 和消息队列之间通讯桥梁,程序组件首先通过 Handler 把消息传递给 Looper,Looper 把消息放入队列。Looper 也把消息队列里的消息广播给所有的 Handler:Handler 接受到消息后调用 handleMessage进行处理 Message:消息的类型,在 Handler 类中的 handleMessage 方法中得到单个的消息进行处理 在单线程模型下, 为了线程通信问题, Android 设计了一个 Message Queue(消息队列), 线程间可以通过该 Message Queue 并结合 Handler 和 Looper 组件进行信息交换。 下面将对它 们进行分别介绍: 1. Message Message 消息,理解为线程间交流的信息,处理数据后台线程需要更新 UI ,则发送Message 内含一些数据给 UI 线程。 2. Handler Handler处理者,是 Message 的主要处理者,负责 Message 的发送,Message 内容的执行处理。后台线程就是通过传进来的 Handler对象引用来 sendMessage(Message)。 而使用 Handler,需要 implement 该类的 handleMessage(Message)方法,它是处理这些 Message 的操作内容,例如 Update UI 。通常需要子类化 Handler 来实现 handleMessage方法。 3. Message Queue Message Queue 消息队列,用来存放通过 Handler 发布的消息,按照先进先出执行。每个 message queue 都会有一个对应的 Handler。Handler 会向 messagequeue 通过两种方法发送消息:sendMessage 或 post。这两种消息都会插在 message queue 队尾并 按先进先出执行。但通过这两种方法发送的消息执行的方式略有不同:通过 sendMessage发送的是一个 message 对象,会被 Handler 的 handleMessage()函数处理;而通过 post 方法发送的是一个 runnable 对象,则会自己执行。 4. Looper Looper 是每条线程里的 Message Queue 的管家。Android 没有 Global 的MessageQueue,而 Android 会自动替主线程(UI 线程)建立 Message Queue,但在子线程里并没有建立 Message Queue。 所以调用 Looper.getMainLooper()得到的主线程的 Looper 不为 NULL,但调用 Looper.myLooper()得到当前线程的 Looper 就有可能为 NULL。

4.Android 中线程与线程,进程与进程之间如何通信

1、一个 Android 程序开始运行时,会单独启动一个 Process。 默认情况下,所有这个程序中的 Activity 或者 Service 都会跑在这个 Process。 默认情况下,一个 Android 程序也只有一个 Process,但一个 Process 下却可以有许多个 Thread。 2、一个 Android 程序开始运行时,就有一个主线程 MainThread 被创建。该线程主要负责 UI 界面的显示、更新和控件交互,所以又叫 UI Thread。 一个 Android 程序创建之初,一个 Process 呈现的是单线程模型–即 Main Thread, 所有的任务都在一个线程中运行。所以,Main Thread 所调用的每一个函数,其耗时应该 越短越好。而对于比较费时的工作,应该设法交给子线程去做,以避免阻塞主线程(主线程被阻塞,会导致程序假死 现象) 。 3、Android 单线程模型:Android UI 操作并不是线程安全的并且这些操作必须在 UI 线程中执行。如果在子线程中直接修改 UI,会导致异常。 4.Android 的 的 IPC ( 进程间通信 ) 机制 IPC 是内部进程通信的简称, 是共享 ” 命名管道 ” 的资源。Android 中的 IPC机制是为了让 Activity 和 Service之间可以随时的进行交互,故在 Android 中该机制,只适用于 Activity 和 Service之间的通信,类似于远程方法调用,类似于 C/S 模式的访问。通过定义 AIDL 接口文件来定义 IPC 接口。Servier 端实现 IPC接口,Client 端调用 IPC接口本地代理。

5.Android应用程序框架

6.View, surfaceView, GLSurfaceView的区别

View 是最基础的,必须在 UI 主线程内更新画面,速度较慢。 SurfaceView 是 view 的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比 view 快 GLSurfaceView 是 SurfaceView 的子类,opengl 专用的。 区别:SurfaceView是从View基类中派生出来的显示类,直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及Camera摄像头一般均使用SurfaceView SurfaceView和View最本质的区别在于,surfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主线程中更新画面。 那么在UI的主线程中更新画面 可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。 当使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题,就是事件同步。比如你触屏了一下,你需要surfaceView中thread处理,一般就需要有一个event queue的设计来保存touch event,这会稍稍复杂一点,因为涉及到线程同步。

7. AIDL的全称是什么?如何工作?

AIDL 全称 Android Interface Definition Language(Android 接口描述语言)是一种接口描述语言 ; 编译器可以通过 aidl文件生成一段代码, 通过预先定义的接口达到两个进程内 部通信进程跨界对象访问的目的.AIDL 的 IPC 的机制和 COM 或 CORBA 类似 , 是基于接口的, 但它是轻量级的。 它使用代理类在客户端和实现层间传递值 . 如果要使用 AIDL, 需要完成2件事情 : 1. 引入AIDL的相关类 .; 2. 调用 aidl产生的 class.理论上 , 参数可以传递基本数据类型和String, 还有就是Bundle的派生类 当A进程要去调用B进程中的service时,并实现通信,我们通常都是通过AIDL来操作的 。 A工程: 首先我们在net.blogjava.mobile.aidlservice包中创建一个RemoteService.aidl文件,在里面我们自定义一个接口,含有方法get。ADT插件会在gen目录下自动生成一个RemoteService.java文件,该类中含有一个名为RemoteService.stub的内部类,该内部类中含有aidl文件接口的get方法。 说明一:aidl文件的位置不固定,可以任意 然后定义自己的MyService类,在MyService类中自定义一个内部类去继承RemoteService.stub这个内部类,实现get方法。在onBind方法中返回这个内部类的对象,系统会自动将这个对象封装成IBinder对象,传递给他的调用者。 其次需要在AndroidManifest.xml文件中配置MyService类,代码如下:

<!-- 注册服务 -->

<service android:name=".MyService">

<intent-filter>

<!-- 指定调用AIDL服务的ID -->

<action android:name="net.blogjava.mobile.aidlservice.RemoteService" />

</intent-filter>

</service>

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

为什么要指定调用AIDL服务的ID,就是要告诉外界MyService这个类能够被别的进程访问,只要别的进程知道这个ID,正是有了这个ID,B工程才能找到A工程实现通信。

说明:AIDL并不需要权限 B工程: 首先我们要将A工程中生成的RemoteService.java文件拷贝到B工程中,在bindService方法中绑定aidl服务 绑定AIDL服务就是将RemoteService的ID作为intent的action参数。 说明:如果我们单独将RemoteService.aidl文件放在一个包里,那个在我们将gen目录下的该包拷贝到B工程中。如果我们将RemoteService.aidl文件和我们的其他类存放在一起,那么我们在B工程中就要建立相应的包,以保证RmoteService.java文件的报名正确,我们不能修改RemoteService.java文件 bindService(new Inten(“net.blogjava.mobile.aidlservice.RemoteService”), serviceConnection, Context.BIND_AUTO_CREATE); ServiceConnection的onServiceConnected(ComponentName name, IBinder service)方法中的service参数就是A工程中MyService类中继承了RemoteService.stub类的内部类的对象。

8.关于AndroidOOM,以及如何避免?

Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M。因此我们所能利用的内存空间是有限的。如果我们的内存占用超过了一定的水平就会出现OutOfMemory的错误。 ①.为什么会出现内存不够用的情况呢?我想原因主要有两个:由于我们程序的失误,长期保持某些资源(如Context)的引用,造成内存泄露,资源造成得不到释放。保存了多个耗用内存过大的对象(如Bitmap),造成内存超出限制。 ② .如何避免优化? 1、应该尽量避免static成员变量引用资源耗费过多的实例,比如Context。Context尽量使用Application Context,因为Application的Context的生命周期比较长,引用它不会出现内存泄露的问题。使用WeakReference代替强引用。比如可以使用WeakReference mContextRef; 2、线程也是造成内存泄露的一个重要的源头。线程产生内存泄露的主要原因在于线程生命周期的不可控。将线程的内部类,改为静态内部类。3、Bitmap问题:可以说出现OutOfMemory问题的绝大多数人,都是因为Bitmap的问题。因为Bitmap占用的内存实在是太多了,它是一个“超级大胖子”,特别是分辨率大的图片,如果要显示多张那问题就更显著了。 如何解决Bitmap带给我们的内存问题? 及时的销毁。  虽然,系统能够确认Bitmap分配的内存最终会被销毁,但是由于它占用的内存过多,所以很可能会超过java堆的限制。因此,在用完Bitmap时,要及时的recycle掉。recycle并不能确定立即就会将Bitmap释放掉,但是会给虚拟机一个暗示:“该图片可以释放了”。设置一定的采样率。  有时候,我们要显示的区域很小,没有必要将整个图片都加载出来,而只需要记载一个缩小过的图片,这时候可以设置一定的采样率,那么就可以大大减小占用的内存。如下面的代码: BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一。 4、巧妙的运用软引用(SoftRefrence)  有些时候,我们使用Bitmap后没有保留对它的引用,因此就无法调用Recycle函数。这时候巧妙的运用软引用,可以使Bitmap在内存快不足时得到有效的释放 5、及时释放Cursor; 6、尽量使用9path图片。Adapter要使用convertView复用等等;

9. AsyncTask 的介绍

在开发 Android 移动客户端的时候往往要使用多线程来进行操作, 我们通常会将耗时的操作放在单独的线程执行, 避免其占用主线程而给用户带来不好的用户体验。 但是在子线程中无法 去操作主线程(UI 线程) ,在子线程中操作 UI 线程会出现错误。因此 android 提供了一个类 Handler 来在子线程中来更新 UI 线程,用发消息的机制更新 UI 界面,呈现给用户。 这样就解决了子线程更新 UI 的问题。但是费时的任务操作总会启动一些匿名的子线程,太多的子线程给系统带来巨大的负担,随之带来一些性能问题。因此 android 提供了一个工具类AsyncTask,顾名思义异步执行任务。这个 AsyncTask 生来就是处理一些后台的比较耗时的任务,给用户带来良好用户体验的,从编程的语法上显得优雅了许多,不再需要子线程和Handler就可以完成异步操作并且刷新用户界面。

10.说说mvc模式的原理,它在android中的运用

答:android的官方建议应用程序的开发采用mvc模式。何谓mvc?  mvc是model,view,controller的缩写,mvc包含三个部分:   l、模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。   2、视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。   3、控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,想用用户出发的相关事件,交给m处理。  android鼓励弱耦合和组件的重用,在android中mvc的具体体现如下: 1)视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如何你对android了解的比较的多了话,就一定 可以想到在android中也可以使用javascript+html等的方式作为view层,当然这里需要进行java和javascript之间的通 信,幸运的是,android提供了它们之间非常方便的通信实现。  2)控制层(controller):android的控制层的重 任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理, 这样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。  3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。    11.根据自己的理解描述下Android数字签名。 答:(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序 (2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证 (3)如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。 (4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能

12. 谈谈对 Android NDK 的理解

NDK 全称:Native Development Kit。 1、NDK 是一系列工具的集合。 * NDK 提供了一系列的工具,帮助开发者快速开发 C(或 C++)的动态库,并能自动将 so 和 java 应用 一起打包成 apk。这些工具对开发者的帮助是巨大的。 * NDK 集成了交叉编译器,并提供了相应的 mk 文件隔离 CPU、平台、ABI 等差异,开发人员只需要简单修改 mk 文件(指出“哪些文件需要编译”、“编译特性要求”等) ,就可以创建出 so。 * NDK 可以自动地将 so 和 Java 应用一起打包,极大地减轻了开发人员的打包工作。 2、NDK 提供了一份稳定、功能有限的 API 头文件声明。 Google 明确声明该 API 是稳定的,在后续所有版本中都稳定支持当前发布的 API。从该版本的 NDK 中看出,这些 API 支持的功能非常有限, 包含有:C 标准库(libc) 、标准数学库(libm) 、压缩库(libz) 、Log 库(liblog) 。

13.ViewStub的应用

在开发应用程序的时候,经常会遇到这样的情况,会在运行时动态根据条件来决定显示哪个View或某个布局。那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在代码中动态的更改它的可见性。这样的做法的优点是逻辑简单而且控制起来比较灵活。但是它的缺点就是,耗费资源。虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。也就是说,会耗费内存等资源。 推荐的做法是使用android.view.ViewStub,ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件。可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub所向的布局就会被Inflate和实例化,然后ViewStub的布局属性都会传给它所指向的布局。这样,就可以使用ViewStub来方便的在运行时,要还是不要显示某个布局。 但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。 首先来说说ViewStub的一些特点: 1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。 2. ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。 基于以上的特点,那么可以考虑使用ViewStub的情况有: 1. 在程序的运行期间,某个布局在Inflate后,就不会有变化,除非重新启动。 因为ViewStub只能Inflate一次,之后会被置空,所以无法指望后面接着使用ViewStub来控制布局。所以当需要在运行时不止一次的显示和隐藏某个布局,那么ViewStub是做不到的。这时就只能使用View的可见性来控制了。 2. 想要控制显示与隐藏的是一个布局文件,而非某个View。 因为设置给ViewStub的只能是某个布局文件的Id,所以无法让它来控制某个View。 所以,如果想要控制某个View(如Button或TextView)的显示与隐藏,或者想要在运行时不断的显示与隐藏某个布局或View,只能使用View的可见性来控制。

 

 

Android开发面试经——3.常见Java基础笔试题 - 移动互联的寻梦之旅 - 博客频道 - CSDN.NET

来源网址: http://blog.csdn.net/finddreams/article/details/44403041

 

关注finddreams博客:http://blog.csdn.net/finddreams/article/details/44403041

因为Androd使用Java语言来编程的,所以我们做Android开发全面的掌握Java基础是必须的。在面试的过程中,我们发现很多公司发的笔试题有很多知识点都是Java的,搞安卓久了,Java基础的一些知识点也都快忘了,今天就让我们来一起复习一些Java基础,希望能在面试中用到;

1、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被”屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

2、String和StringBuffer,StringBuilder的区别

String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) String的长度是不可变的,StringBuffer,StringBuilder的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法。

3、说出ArrayList,Vector, LinkedList的存储性能和特性

ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

4.字符串“abcde”通过写一个函数不让调用第三方的字符串,实现一个字符串倒序,比如字符串“abcde”变成“edcba”

String src = “abcde”; String dst = new StringBuffer(src).reverse().toString();

5、Collection 和 Collections的区别。

Collection是集合类的上级接口,继承与他的接口主要有Set 和List. Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

6、final, finally, finalize的区别。

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

7、sleep() 和 wait() 有什么区别?

1.这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。 2.最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。 3.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用 4. Sleep需要捕获异常,而wait不需要

8、同步和异步有何异同,在什么情况下分别使用他们?举例说明。

如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。

9,抽象类与接口的区别(abstract与interface的区别)

abstract可以修饰抽象方法,而一个类只要有一个抽象方法,就必须用abstract定义该类,即抽象类。 用interface修饰的类,里面的方法都是抽象方法,因此在定义接口的时候,可以直接不加那些修饰,系统会默认的添上去。接口里面的字段都是公有常量,即public static final修饰的字段。

10、线程中wait,join,sleep,yield, notify,notifyall,synchronized,区别及联系

1).sleep()方法 在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”。不推荐使用。sleep()使当前线程进入阻塞状态,在指定时间内不会执行。 2).wait()方法 在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。 唤醒当前对象锁的等待线程使用notify或notifyAll方法,waite() 和notify()必须在synchronized函数或synchronized block中进行调用。 yield方法暂停当前正在执行的线程对象。yield()只是使当前线程重新回到可执行状态,所以执行 3)yield()的线程有可能在进入到可执行状态后马上又被执行。yield()只能使同优先级或更高优先级的线程有执行的机会。 4).join方法 等待该线程终止。等待调用join方法的线程结束,再继续执行。如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测。

11、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?

接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。

12、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

13、是否可以继承String类?

String类是final类故不可以继承。

14、java switch支持的数据类型:

java支持的数据类型有五种 他们分别是: byte、char、short、int、枚举 以上是JDK1.6以前的版本。JDK1.7时,又增加了String,所以相对于JDK1.7而言就是六种了

15、什么是单例模式,请写出一个来:

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 一般Singleton模式通常有几种种形式: 第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。

public class Singleton {

private Singleton(){}

 

//注意这是private 只供内部调用

private static Singleton instance = new Singleton();

//这里提供了一个供外部访问本class的静态方法,可以直接访问

public static Singleton getInstance() {

return instance;

}

}

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

第二种形式:

 

public class Singleton {

 

private static Singleton instance = null;

 

public static synchronized Singleton getInstance() {

//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次

//使用时生成实例,提高了效率!

if (instance==null)

instance=new Singleton();

return instance; }

}

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

其他形式:

定义一个类,它的构造函数为private的,所有方法为static的。 一般认为第一种形式要更加安全些

16、Java常用的设计模式?说明工厂模式。

Java中的23种设计模式: Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式), Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式), Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式), Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式), Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式), Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式), Observer(观察者模式), State(状态模式), Strategy(策略模式), Template Method(模板方法模式), Chain Of Responsibleity(责任链模式) 工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例, 通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。 首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件 生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。

 

 

Android开发面试经——2.常见Android基础笔试题 - 移动互联的寻梦之旅 - 博客频道 - CSDN.NET

来源网址: http://blog.csdn.net/finddreams/article/details/44219231

 

关注finddreams博客: http://blog.csdn.net/finddreams/article/details/44219231

正值跳槽的热季,整理一下Android面试中最常考的笔试题,为下次找工作时做好充分准备,这是Android的基础部分:

1、Android四大组件是什么?作用以及应用场景?

Android 的四大组件分别是是Activity,Service,BroadcastReceiver和ContentProvider;

Activity:

从字面上理解,Activity是活动的意思。一个Activity通常展现为一个可视化的用户界面,是Android程序与用户交互的窗口,也是Android组件中最基本也是最复杂的一个组件。从视觉效果来看,一个Activity占据当前的窗口,响应所有窗口事件,具备有控件,菜单等界面元素。从内部逻辑来看,Activity需要为了保持各个界面状态,需要做很多持久化的事情,还需要妥善管理生命周期,和一些转跳逻辑。

Service

服务是运行在后台的一个组件,从某从意义上说,服务就像一个没有界面的Activity。它们在很多Android的概念方面比较接近,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的事件,定义好需要接受的Intent提供同步和异步的接口。

BroadcastReceiver

广播接收者,不执行任何任务,广播是一种广泛运用的在应用程序之间传输信息的机制 。而 BroadcastReceiver 是对发送出来的广播进行过滤接收并响应的一类组件。Broadcast Receiver 不包含任何用户界面。然而它们可以启动一个Activity以响应接受到的信息,或者通过NotificationManager通知用户。可以通过多种方式使用户知道有新的通知产生:闪动背景灯、震动设备、发出声音等等。通常程序会在状态栏上放置一个持久的图标,用户可以打开这个图标并读取通知信息。在Android中还有一个很重要的概念就是Intent,如果说Intent是一个对动作和行为的抽象描述,负责组件之间程序之间进行消息传递。那么Broadcast Receiver组件就提供了一种把Intent作为一个消息广播出去,由所有对其感兴趣的程序对其作出反应的机制。

Content Provider

即内容提供者,作为应用程序之间唯一的共享数据的途径,Content Provider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数据。 对应用而言,也可以将底层数据封装成ContentProvider,这样可以有效的屏蔽底层操作的细节,并且使程序保持良好的扩展性和开放性。Android提供了一些主要数据类型的Contentprovider,比如音频、视频、图片和私人通讯录等。可在android.provider包下面找到一些android提供的Contentprovider。可以获得这些Contentprovider,查询它们包含的数据,当然前提是已获得适当的读取权限。如果我们想公开自己应用程序的数据,可以创建自己的 Content provider 的接口。

2、android中的动画有哪几类,它们的特点和区别是什么?

两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。

3、后台的activity被系统回收怎么办?如何在被系统回收之前保存当前状态?

当一个Activity被pause或者stop的时候,这个Activity的对象实际上还是保存在内存中,因此这个Activity中的信息(成员和状态信息)还可以重新获取到.

如果系统为了整理内存而销毁了Activity对象时,系统没法简单的原封不动地恢复先前的Activity对象及其状态信息. Activity中提供了一个方法:onSavedInstanceState(Bundle obj).当系统销毁一个Activity时,会将Activity的状态信息已键值对形式存放在bundle对象中. 第一次启动Activity时,这个bundle对象是空的,null.如果Activity被系统销毁了,然后用户要回退回去看的话,系统会调用这个Activity的onCreate方法,并把bundle对象传递过去.

4. 请描述一下Activity 生命周期。

5. 如何将一个Activity设置成窗口的样式。 在AndroidManifest.xml 中定义Activity的地方一句话android:theme=”@android:style/Theme.Dialog”或android:theme=”@android:style/Theme.Translucent”就变成半透明的

6.注册广播有几种方式,有何优缺点?

有两种,一种是代码动态注册: //生成广播处理 smsBroadCastReceiver = new SmsBroadCastReceiver(); //实例化过滤器并设置要过滤的广播

IntentFilter intentFilter = new IntentFilter(“android.provider.Telephony.SMS_RECEIVED”);

//注册广播

BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver, intentFilter); 一种是在AndroidManifest.xml中配置广播

<!--广播注册-->

<receiver android:name=".SmsBroadCastReceiver">

<intent-filter android:priority="20">

<action android:name="android.provider.Telephony.SMS_RECEIVED"/>

</intent-filter>

</receiver>

1

2

3

4

5

6

两种注册类型的区别是:

1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期 2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。 注册的方法有两种,一种是静态注册,一种是动态注册。 动态注册优点: 在 Android 的广播机制中, 动态注册的优先级是要高于静态注册优先级的 , 因此在必要的情况下,我们是需要动态注册广播接收器的。 静态注册优点:动态注册广播接收器还有一个特点,就是当用来注册的 Activity 关掉后 ,广播也就失效了。同时反映了静态注册的一个优势,就是无需担忧广播接收器是否被关闭 , 只要设备是开启状态,广播接收器就是打开着的。

7.IntentService有何优点?

普通的service ,默认运行在ui main 主线程 这是带有异步处理的service类, 异步处理的方法 OnHandleIntent() OnHandleIntent() 处理耗时的操作 Android的进程处理器现在会尽可能的不kill掉你

8.横竖屏切换时候activity的生命周期?

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次   2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次   3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法    9、如何将SQLite数据库(dictionary.db文件)与apk文件一起发布? 如何将打开res raw目录中的数据库文件?   解答:以将dictionary.db文件复制到res raw目录中 ,在Android中不能直接打开res raw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res raw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite ;    10.AndroidManifest.xml文件中主要包含哪些信息 说明应用程序的java 包,该包名是应用程序的唯一标识; 描述应用程序的组件:该应用程序由哪些activity,service,broadcast receiver和content provider组成; 声明应用程序所必须具备的权限,用以访问受保护的部分API,以及与其他应用程序的交互; 声明应用程序所需要的Android API的最低版本级别,比如1.0,1.1,1.5; manifest:根节点,描述了 package 中所有的内容。 uses-permission:请求你的 package 正常运作所需赋予的安全许可。 permission: 声明了安全许可来限制哪些程序能你 package 中的组件和功能。 instrumentation:声明了用来测试此 package 或其他 package 指令组件的代码。 application:包含 package 中 application 级别组件声明的根节点。 activity:Activity 是用来与用户交互的主要工具。 receiver:IntentReceiver 能使的 application 获得数据的改变或者发生的操作,即使它当 前不在运行。 service:Service 是能在后台运行任意时间的组件。 provider:ContentProvider 是用来管理持久化数据并发布给其他应用程序使用的组件。

11.Android数据储存方式

一.SharedPreferences方式:它是 Android提供的用来存储一些简单配置信息的一种机制,采用了 XML 格式将数据存储到设备中。只能在同一个包内使用,不能在不同的包之间使用。 二.文件存储方式 /data/data/包名/files 内存里面 / context.openFileInput(name) 默认是私有的访问权限 三.SQLite数据库方式:SQLite 是 Android 所带的一个标准的数据库, 它支持 SQL语句,它是一个轻量级的嵌入式数据库。 四.内容提供器(Content provider)方式:主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此 Content Provider 的各种数据类型。 五. 网络存储方式: 通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储 在网络空间中的数据信息。

12.Android中常见五种布局介绍

FrameLayout(帧布局): 从屏幕的左上角开始布局,叠加显示, 实际应用 播放器的暂停按钮. LinearLayout (线性布局):可分为垂直布局,水平布局; AbsoluteLayout(绝对布局):用X,Y坐标来指定元素的位置; RelativeLayout(相对布局): 相对布局可以理解为某一个元素为参照物,来定位的布局方式。 TableLayout(表格布局):表格布局类似Html里面的Table。每一个TableLayout里面有表格行TableRow,TableRow里面可以具体定义每一个元素,设定他的对齐方式 android:gravity=”” 。 每一个布局都有自己适合的方式,另外,这五个布局元素可以相互嵌套应用,做出美观的界面。

13.Activity的四种启动模式?,activity与task的启动方式有哪些,她们的含义具体说明

standard: 标准模式,一调用 startActivity()方法就会产生一个新的实例。 singleTop: 如果已经有一个实例位于 Activity 栈的顶部时, 就不产生新的实例, 而只是调用Activity 中的 newInstance()方法。如果不位于栈顶,会产生一个新的实例。 singleTask: 会在一个新的 task 中产生这个实例,以后每次调用都会使用这个,不会去产生 新的实例了。 singleInstance: 这个跟 singleTask 基本上是一样, 只有一个区别: 在这个模式下的 Activity实例所处的 task 中,只能有这个 activity实例,不能有其他的实例。

14.Android 中的长度单位详解

如果设置表示长度 、 高度等属性时可以使用 dp 或 sp。但如果设置字体,需要使用 sp。dp 是与密度无关,sp 除了与密度无关外,还与 scale 无关。如果屏幕密度为160,这时 dp 和 sp 和 px 是一样 的。1dp=1sp=1px, 也就是说,如果使用 dp 和 sp,系统会根据屏幕密度的变化自动进行转换 px :表示屏幕实际的象素 in:表示英寸,是屏幕的物理尺寸。每英寸等于2.54 厘米。

15.android 析 中有哪几种解析 l xml 的类, , , , 官方推荐哪种?以及它们的原 理和区别

DOM 解析 优点: 1.XML 树在内存中完整存储,因此可以直接修改其数据和结构. 2.可以通过该解析器随时访问 XML 树中的任何一个节点. 3.DOM 解析器的 API 在使用上也相对比较简单. 缺点:如果 XML 文档体积比较大时,将文档读入内存是非常消耗系统资源的 Ø SAX 解析 优点: SAX 对内存的要求比较低,因为它让开发人员自己来决定所要处理的标签.特别是当开发人 员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现. 缺点: 用 SAX 方式进行 XML 解析时,需要顺序执行,所以很难访问到同一文档中的不同数据.此外,在基于该方式的解析编码过程也相对复杂 Ø Xmlpull 解析(官方推荐使用) android SDK 提供了 xmlpull api,xmlpull 和 sax 类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序.因为是基于流的处理,因此 xmlpull 和 sax 都比较节 约内存资源,不会象 dom 那样要把所有节点以对橡树的形式展现在内存中.xmlpull 比 sax 更 简明,而且不需要扫描完整个流.

16.ListView 的 优化方案

(1),如果自定义适配器,那么在 getView 方法中要考虑方法传进来的参数 contentView 是否 为 null,如果为 null 就创建 contentView 并返回,如果不为 null 则直接使用。在这个方法中,尽可能少创建 view。 (2),给 contentView 设置 tag(setTag()),传入一个 viewHolder 对象,用于缓存要显示的数 据,可以达到图像数据异步加载的效果 (3),如果 listview 需要显示的 item 很多,就要考虑分页加载。比如一共要显示100条或者更多的时候,我们可以考虑先加载20条,等用户拉到列表底部的时候,再去加载接下来的20 条。 (4) 快速滑动时不加载图片 (5) 如果自定义的item中有图片,需要处理图片(减少图片所占内存) 1.对图片进行边界压缩 2.用option类来保存图片大小 3.避免图片的实时缩放,最好预先缩放到视图大小 (6)尽量避免在listview适配器中使用线程,因为线程是产生内存泄露的主要原因在于线程的生命周期不可控。

17.Android中intent的作用

在一个 Android 应用中,主要是由一些组件组成(Activity,Service,ContentProvider,etc.) 在这些组件之间的通讯中,由 Intent 协助完成。 Intent 负责对应用中一次操作的动作、动作涉及数据、附加数据 进行描述,Android 则根据此 Intent 的描述,负责找到对应的组件,将 Intent 传递给调用的组件,并完成组件的调用。Intent 在这里起着实现调用者与被调用者之间的解耦作用。 有两种方式,一种是显示匹配,一种是隐示匹配; 显示:明确的指定要跳转的Activity,或者Service等; 隐示:隐式匹配,首先要匹配 Intent 的几项值:Action,Category, Data/Type,Component如果填写了 Componet 就是这就形成了显示匹配。 1.如果你填写了 Action, 如果有一个程序的 Manifest.xml 中的某一个 Activity 的 IntentFilter 段中定义了包含了相同的 Action 那么这个 Intent 就与这个目标 Action 匹配, 如果这个 Filter段中没有定义 Type,Category,那么这个 Activity 就匹配了。但是如果手机中有两个以上的程序匹配,那么就会弹出一个对话可框来提示说明。 2,data/type,你可以用 Uri 来做为 data,比如 Uri uri = Uri.parse(http://www.google.com ); Intent i = new Intent(Intent.ACTION_VIEW,uri);手机的 Intent 分发过程中,会根据 http://www.google.com 的 scheme 判断出数据类型 type手机的 Brower 则能匹配它,在 Brower 的 Manifest.xml 中的 IntenFilter中首先有ACTION_VIEW Action,也能处理 http:的 type; 3,至于分类 Category,一般不要去在 Intent 中设置它,如果你写 Intent 的接收者,就在Manifest.xml 的 Activity 的 IntentFilter 中包含 android.category.DEFAULT,这样所有不设置Category(Intent.addCategory(String c);)的 Intent 都会与这个 Category 匹配。 4,extras(附加信息) ,是其它所有附加信息的集合。使用 extras 可以为组件提供扩展信息 ,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在 extras里,传给电子邮件发送组件。

18.如何退出 Activity ?如何安全退出?

对于单一 Activity 的应用来说,退出很简单,直接 finish()即可。 当然,也可以用 killProcess()和 System.exit()这样的方法。 为了编程方便,最好定义一个 Activity 基类,处理这些共通问题。 1、记录打开的 Activity: 每打开一个 Activity,就记录下来。在需要退出时,关闭每一个 Activity 即可。 2、发送特定广播: 在需要结束应用时,发送一个特定的广播,每个 Activity 收到广播后,关闭即可。

 

 

Android开发面试经——1.常见人事面试问题 - 移动互联的寻梦之旅 - 博客频道 - CSDN.NET

来源网址: http://blog.csdn.net/finddreams/article/details/44199779

 

      做为程序员,我们都是有梦想的人,有时候当我们不满足现状,想要进一步提升自己的能力,拓展自己的视野时,跳槽可能是一个我们终将面对的选择。可是我们的工作是成天和电脑打交道,造成我们的人际交往,交流能力不是很强,在面试上我们往往要准备的很充分,才能获得一份心仪的好工作,接下来我给大家整理一下面试中常见的一些问题,包括人事面试和笔试题,今天就来说说人事面试:

1、请你自我介绍一下你自己?

回答提示:一般人回答这个问题过于平常,只说姓名、年龄、爱好、工作经验,这些在简历上都有。其实,企业最希望知道的是求职者能否胜任工作,包括:最强的技能、最深入研究的知识领域、个性中最积极的部分、做过的最成功的事,主要的成就等,这些都可以和学习无关,也可以和学习有关,但要突出积极的个性和做事的能力,说得合情合理企业才会相信。

2、你对加班的看法?

回答提示:事实上做为一枚程序猿,加班熬夜是我们的标配,比较少的公司会有不加班的现象,因为你不知道什么时候你的程序就是那么不听话的崩溃了,这时你就得第一时间去处理好bug,紧急的修复并上线。

回答样本:如果是工作需要我会义不容辞加班,我现在单身,没有任何家庭负担,可以全身心的投入工作。但同时,我也会提高工作效率,减少不必要的加班。

3、你觉得你个性上最大的优点是什么?

回答提示:沉着冷静、条理清楚、立场坚定、顽强向上、乐于助人和关心他人、适应能力和幽默感、乐观和友爱。

4、说说你最大的缺点?

回答提示:这个问题企业问的概率很大,通常不希望听到直接回答的缺点是什么等,如果求职者说自己小心眼、爱忌妒人、非常懒、脾气大、工作效率低,企业肯定不会录用你。绝对不要自作聪明地回答“我最大的缺点是过于追求完美”,有的人以为这样回答会显得自己比较出色,但事实上,他已经岌岌可危了。业喜欢求职者从自己的优点说起,中间加一些小缺点,最后再把问题转回到优点上,突出优点的部分,企业喜欢聪明的求职者。

5、你对薪资的要求?

回答提示:如果你对薪酬的要求太低,那显然贬低自己的能力;如果你对薪酬的要求太高,那又会显得你分量过重,公司受用不起。一些雇主通常都事先对求聘的职位定下开支预算,因而他们第一次提出的价钱往往是他们所能给予的最高价钱,他们问你只不过想证实一下这笔钱是否足以引起你对该工作的兴趣。如果你自己必须说出具体数目,请不要说一个宽泛的范围,那样你将只能得到最低限度的数字。最好给出一个具体的数字,这样表明你已经对当今的人才市场作了调查,知道像自己这样学历的雇员有什么样的价值。

回答样本一:我对工资没有硬性要求,我相信贵公司在处理我的问题上会友善合理。我注重的是找对工作机会,所以只要条件公平,我则不会计较太多。

回答样本二:我受过系统的软件编程的训练,不需要进行大量的培训,而且我本人也对编程特别感兴趣。因此,我希望公司能根据我的情况和市场标准的水平,给我合理的薪水。

实战面试谈薪水

在面试时和公司谈薪资,有几点是要注意的:

•不要在一面、二面、三面等等过程中主动打探薪水、福利等,一般这会给对方留下比较差的印象,认为你只在乎钱。

•在确认公司准备聘用你之前不要谈钱,因为只有公司决定聘用你的时候,才是合适的时机。 •不要先开口谈钱,如果公司决定聘用你,那他们肯定会在做出决定后和你谈薪水。 •确定谁是要和你谈薪水的那个人,有时是 HR ,有时是副总、总监之类的,你无需询问,也会有机会知道的。如果是 HR 来和你谈薪水,她们多半是从技术线拿到了一个范围,然后会先压低了来和你谈,要做好心理准备,适当坚持一个比 HR 提出的更高的薪水。如果是技术线上的领导直接和你谈,我想你先要对面试的过程有个总结,了解这个人对你的印象,他是对你有强烈的兴趣,还是觉得你差强人意。如果是后者,你坚持高于对方给出的薪水,很可能没戏。无论哪种,你都要对这个职位表示出足够的兴趣来,同时也要表明你在意的不是薪水本身,而是薪水是否能与你的能力、你可以对公司带来的价值相匹配。 •被问及期望的薪水这类问题时,不要说具体的数字,如果一定要说,说一个范围。 •不要透露你现在的薪水,因为公司往往会根据你现在的薪水来给你定价。 •如果实在躲不过,一定要说现在的薪水,切忌撒圆不了的谎,虚报一大截子并不是明智的做法。 HR 们远比你想象的有能力,她们很可能和你之前所在公司的 HR 或某些人认识,能在做背景调查时问到你的薪水。 •如果对方拿你现在的薪水说事儿(碰巧你现在薪水较低),你应该表明你现在的薪水与能力严重错位,是不合理的,体现不了你的价值 不管你了解了多少谈判技巧,摆平自己的心态很重要。有一部分程序员觉得谈薪资谈来谈去怪不好意思怪伤感情的,其实不必,就跟你在商场买衣服一样,争取到合理的价位是人之常情,而且如果你不情不愿地进到了公司,时候发现被压低了工资,会产生非常消极的影响,不管对自己还是对公司,所以呢,你肯进入公司之前谈个明白,是对双方负责任的体现,因此你就不必担心这个过程会有多大的不良影响。

6、在三到五年的时间内,你的职业规划?

回答提示:这是每一个应聘者都不希望被问到的问题,但是几乎每个人都会被问到,比较多的答案是“管理者”。但是近几年来,许多公司都已经建立了专门的技术途径。这些工作地位往往被称作“顾问”、“参议技师”或“高级软件工程师”等等。当然,说出其他一些你感兴趣的职位也是可以的,比如产品销售部经理,生产部经理等一些与你的专业有相关背景的工作。要知道,考官总是喜欢有进取心的应聘者,此时如果说“不知道”,或许就会使你丧失一个好机会。最普通的回答应该是“我准备在技术领域有所作为”或“我希望能按照公司的管理思路发展”。

7、你还有什么问题要问吗?

回答提示:企业的这个问题看上去可有可无,其实很关键,企业不喜欢说“没问题”的人,因为其很注重员工的个性和创新能力。企业不喜欢求职者问个人福利之类的问题,如果有人这样问:贵公司对新入公司的员工有没有什么培训项目,我可以参加吗?或者说贵公司的晋升机制是什么样的?企业将很欢迎,因为体现出你对学习的热情和对公司的忠诚度以及你的上

8、谈谈你对跳槽的看法?

回答提示:①正常的“跳槽”能促进人才合理流动,应该支持。②频繁的跳槽对单位和个人双方都不利,应该反对。进心。

9、为什么要离职?

回答提示:回答这个问题时一定要小心,就算在前一个工作受到再大的委屈,对公司有多少的怨言,都千万不要表现出来,尤其要避免对公司本身主管的批评,避免面试官的负面情绪及印象。建议此时最好的回答方式是将问题归咎在自己身上,例如觉得工作没有学习发展的空间,自己想在面试工作的相关产业中多加学习,或是前一份工作与自己的生涯规划不合等等,回答的答案最好是积极正面的。

回答样本:我希望能获得一份更好的工作,如果机会来临,我会抓住。我觉得目前的工作,已经达到顶峰,即沒有升迁机会。

10、你对于我们公司了解多少?

回答提示:在去公司面试前上网查一下该公司主营业务。如回答:贵公司有意改变策略,加强与国外大厂的OEM合作,自有品牌的部分则透过海外经销商。

11、请说出你选择这份工作的动机?

回答提示:这是想知道面试者对这份工作的热忱及理解度,并筛选因一时兴起而来应试的人,如果是无经验者,可以强调“就算职种不同,也希望有机会发挥之前的经验”。

12、你最擅长的技术方向是什么?

回答提示:说和你要应聘的职位相关的课程,表现一下自己的热诚没有什么坏处。

13、喜欢这份工作的哪一点?

回答提示:相信其实大家心中一定都有答案了吧!每个人的价值观不同,自然评断的标准也会不同,但是,在回答面试官这个问题时可不能太直接就把自己心理的话说出来,尤其是薪资方面的问题,不过一些无伤大雅的回答是不错的考虑,如交通方便,工作性质及内容颇能符合自己的兴趣等等都是不错的答案,不过如果这时自己能仔细思考出这份工作的与众不同之处,相信在面试上会大大加分。

14、你为什么愿意到我们公司来工作?

回答提示:对于这个问题,你要格外小心,如果你已经对该单位作了研究,你可以回答一些详细的原因,像“公司本身的高技术开发环境很吸引我。”、“我同公司出生在同样的时代,我希望能够进入一家与我共同成长的公司。”、“你们公司一直都稳定发展,在近几年来在市场上很有竞争力。”、“我认为贵公司能够给我提供一个与众不同的发展道路。”这都显示出你已经做了一些调查,也说明你对自己的未来有了较为具体的远景规划。

15、在完成某项工作时,你认为领导要求的方式不是最好的,自己还有更好的方法,你应该怎么做?

回答提示:①.原则上我会尊重和服从领导的工作安排;同时私底下找机会以请教的口吻,婉转地表达自己的想法,看看领导是否能改变想法。②如果领导没有采纳我的建议,我也同样会按领导的要求认真地去完成这项工作。③.还有一种情况,假如领导要求的方式违背原则,我会坚决提出反对意见,如领导仍固执己见,我会毫不犹豫地再向上级领导反映。

16、如何安排自己的时间?会不会排斥加班?

回答提示:基本上,如果上班工作有效率,工作量合理的话,应该不太需要加班。可是我也知道有时候很难避免加班,加上现在工作都采用责任制,所以我会调配自己的时间,全力配合。

分析:虽然不会有人心甘情愿的加班,但依旧要表现出高配合度的诚意。

17、何时可以到职?

回答提示:大多数企业会关心就职时间,最好是回答“如果被录用的话,到职日可按公司规定上班”,但如果还未辞去上一个工作、上班时间又太近,似乎有些强人所难,因为交接至少要一个月的时间,应进一步说明原因,录取公司应该会通融的。

18、想过创业吗?

回答提示:这个问题可以显示你的冲劲,但如果你的回答是“有”的话,千万小心,下一个问题可能就是:那么为什么你不这样做呢?

19、怎样看待学历和能力?

回答提示:学历我想只要是大学专科的学历,就表明觉得我具备了根本的学习能力。剩下的,你是学士也好,还是博士也好,对于这一点的讨论,不是看你学了多少知识,而是看你在这个领域上发挥了什么,也就是所说的能力问题。一个人工作能力的高低直接决定其职场命运,而学历的高低只是进入一个企业的敲门砖,如果贵公司把学历卡在博士上,我就无法进入贵公司,当然这不一定只是我个人的损失,如果一个专科生都能完成的工作,您又何必非要招聘一位博士生呢?

常见的人事面试问题就整理到这里,这些都是面试中常问到的问题,只要看一遍就可以了,想想面试的时候该怎么措辞才恰当,虽然我们不是很擅长交际,但是我们的学习能力是很强的,做编程的,那智商,你懂得!

 

 

Android开发面试经——6.常见面试官提问Android题②(更新中...) - 移动互联的寻梦之旅 - 博客频道 - CSDN.NET

来源网址: http://blog.csdn.net/finddreams/article/details/44560061

 

关注finddreams博客:http://blog.csdn.net/finddreams/article/details/44560061

1.HttpURLConnection和HttpClient他们各自的优缺点是什么? HttpUrlConnection 在 2.3 以前的版本是有 bug 的,所以之前的版本推荐使用 HttpClient,但是 google 现在已经不维护 HttpClient 了,5.1里面已经把 HttpClient 标过期。另外 HttpURLConnection 支持gzip压缩等,推荐首选它。 在 Froyo(2.2) 之前,HttpURLConnection 有个重大 Bug,调用 close() 函数会影响连接池,导致连接复用失效,所以在 Froyo 之前使用 HttpURLConnection 需要关闭 keepAlive。 另外在 Gingerbread(2.3) HttpURLConnection 默认开启了 gzip 压缩,提高了 HTTPS 的性能,Ice Cream Sandwich(4.0) HttpURLConnection 支持了请求结果缓存。 再加上 HttpURLConnection 本身 API 相对简单,所以对 Android 来说,在 2.3 之后建议使用 HttpURLConnection,之前建议使用 AndroidHttpClient。

2.Android开发中XML解析方式的比较 ,及优缺点?

DOM,SAX,Pull解析。 SAX解析器的优点是解析速度快,占用内存少;

DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源,不适合移动端;

PULL解析器的运行方式和SAX类似,都是基于事件的模式,PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。

3.请问平时开发过程中,你是如何做到多分辨率适配的?

1.根据不同分辨率建立不同的布局文件 2.根据分辨率不同建立不同分辨率的资源图片 3.在程序启动时,获取当前屏幕的分辨率和密度,在代码中进行适配 4.为不同分辨率的写不同的dimen文件。 5.其实还有就是多使用fragement

4. 谈谈你在工作中是怎样解决一个bug的?

1.看Log日志 2.Log解决不了就断点调试 3.如果debug不行 4.就在异常代码的附近Log.e(“error”,”1”);,2,3,4,5,6,7,8,9 每隔一行一个Log输出,看结果 5.找到问题,自行找思路。如果是技术瓶颈,就google之

5.声明ViewHolder内部类时,为什么建议使用static关键字?

其实这个是考静态内部类和非静态内部类的主要区别之一。非静态内部类会隐式持有外部类的引用,就像大家经常将自定义的adapter在Activity类里,然后在adapter类里面是可以随意调用外部activity的方法的。当你将内部类定义为static时,你就调用不了外部类的实例方法了,因为这时候静态内部类是不持有外部类的引用的。声明ViewHolder静态内部类,可以将ViewHolder和外部类解引用。大家会说一般ViewHolder都很简单,不定义为static也没事吧。确实如此,但是如果你将它定义为static的,说明你懂这些含义。万一有一天你在这个ViewHolder加入一些复杂逻辑,做了一些耗时工作,那么如果ViewHolder是非静态内部类的话,就很容易出现内存泄露。如果是静态的话,你就不能直接引用外部类,迫使你关注如何避免相互引用。 所以将 ViewHolder内部类 定义为静态的,是一种好习惯. 非静态内部类隐式持有外部类的强引用,只是可能会导致内存泄露,而一般情况下在使用viewhodler是不会导致内存泄露的,加static是一个比较好的习惯

6.如何在不失真的条件下显示一张超高清的图片或者长图?

1、通过计算BitmapFactory.Options 对象的inSamleSize 值 等比的压缩图片 。 2、使用WebView来加载该图片; 3、使用MapView或者TileView来显示图片(类似地图的机制);

7. Android中有哪些方法实现定时和延时任务?它们的适用场景是什么?

倒计时类 用CountDownTimer

延迟类

CountDownTimer,可巧妙的将countDownInterval设成和millisInFuture一样,这样就只会调用一次onTick和一次onFinish handler.sendMessageDelayed,可参考CountDownTimer的内部实现,简化一下,个人比较推荐这个 TimerTask,代码写起来比较乱 Thread.sleep,感觉这种不太好 使用Handler方法postDelay(runnable, delayTime)

定时类

参照延迟类的,自己计算好要延迟多少时间 handler.sendMessageAtTime AlarmManager,适用于定时比较长远的时间,例如闹铃

8.谈谈你对StrongReference、WeakReference和SoftReference的认识

强引用(StrongReference):就是在代码中普遍存在的,类似Object obj = new Object()这类的引用,只要强引用还存在,GC永远不会回收掉被引用的对象。 软引用(SoftReference):用来描述一些还有用但非必须的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常时,将会把这些对象列入回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。在JDK 1.2之后,提供了SoftReference类来实习软引用。

弱引用(WeakReference):也是用来描述非必须对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到了下一次GC发生之前。当GC工作时,无论当时内存是否足够,都会回收只被弱引用关联的对象。在JDK 1.2之后,提供了WeakReference类来实现弱引用。

虚引用(PhantomReference):这个引用po主没有提到,不过也可以顺带了解一下。虚引用也称幽灵引用或者幻影引用,它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用的唯一目的就是在这个对象被GC回收是收到一个系统通知。在JDK 1.2之后提供了PhantomReference类来实现虚引用。

9.你应用中的网络层是怎么设计的?

1. android-async-http. 封装了下常用的方法,get post 上传 下载 ,所有的请求我都是用的同步请求. 具体的用法一般都是和业务逻辑在一起,而我的业务逻辑是用异步去处理的. 关于网络请求结果的缓存,我是单独处理的.并没有放在网络层.

2.在HttpUrlConnection基础上封装, 包括请求成功, 失败, 请求中, 网络问题等封装, 利用广播与UI交互

3.直接使用xUtils,afinal,okHttp,Volley等开源第三方框架;

Bitmap是android中经常使用的一个类,它代表了一个图片资源。

Bitmap消耗内存很严重,如果不注意优化代码,经常会出现OOM问题,优化方式通常有这么几种: 1. 使用缓存; 2. 压缩图片; 3. 及时回收;

10.谈谈你对Bitmap的理解, 什么时候应该手动调用bitmap.recycle()?

至于什么时候需要手动调用recycle,这就看具体场景了,原则是当我们不再使用Bitmao时,需要回收之。另外,我们需要注意,2.3之前Bitmap对象与像素数据是分开存放的,Bitmap对象存在java Heap中而像素数据存放在Native Memory中,这时很有必要调用recycle回收内存。但是2.3之后,Bitmap对象和像素数据都是存在Heap中,GC可以回收其内存。

11.ViewPager中加载Fragment的优化问题?如何做到微信那样切换界面时的延时加载?

利用fragment中的setUserVisibleHint这个方法可以来做到.

private boolean hasLoadedOnce = false; // your boolean field

 

@Override

public void setUserVisibleHint(boolean isVisibleToUser) {

super.setUserVisibleHint(isVisibleToUser);

 

if (this.isVisible()) {

// we check that the fragment is becoming visible

if (isVisibleToUser && !hasLoadedOnce) {

//do something

}

}

}

}

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

12什么是aar?aar和jar有什么区别?

“aar”包是 Android 的类库项目的二进制发行包。

文件扩展名是.aar,maven 项目类型应该也是aar,但文件本身是带有以下各项的 zip 文件:

/AndroidManifest.xml (mandatory)

/classes.jar (mandatory) /res/ (mandatory) /R.txt (mandatory) /assets/ (optional) /libs/*.jar (optional) /jni//*.so (optional) /proguard.txt (optional) /lint.jar (optional) 这些条目是直接位于 zip 文件根目录的。 其中R.txt 文件是aapt带参数–output-text-symbols的输出结果。

jar打包不能包含资源文件,比如一些drawable文件、xml资源文件之类的,aar可以。

13.如何加密Url防止被黑?

加密到JNI里面还是会通过抓包工具抓取到.最后的方式就是进行HTTPS证书双向加密验证

14.Android fragment和activity的区别

你可以理解Fragment是一种特殊的View,负责一个模块或者一个特殊部分的展示。 大部分Fragment是依托于Activity存在的,由Activity的FragmentManager来管理 Fragment可以解决多Activity的问题,即将3.0之前的频繁Activity跳转改成一个Activity内Fragment的切换。 Fragment可以解决碎片化的问题。 fragment是android3.0新增的 fragment可以重用 fragment必须嵌套在activity中使用,它的生命周期受activity的影响。

15.Service和广播 BroadcastReceivre会不会出现ANR?

Service,广播 会出现ANR 服务, 广播都是主线程中, 既然是主线程 当然会anr 所以耗时操作还是必须另起线程 通俗的说超时时间:Activity 5秒, Broadcast 10秒, Server 20秒

16.你在平时开发中会使用到哪些设计模式,能谈谈这些设计模式的使用场景吗?

平时用的比较多有单例模式(在内存中仅实例化一个对象时使用),适配器模式(典型的就是ListView和GridView的适配器),建造者模式(AlertDialog.Builder),观察者模式可能比较隐蔽,在Android源码中BaseAdapater的NotifyDataSetChanged的实现(?) 单例:DownloadManager

 

转载于:https://my.oschina.net/u/2288454/blog/1922806

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值