android 面试题

下载地址   

     CSDN下载地址:

          点击下载

1.常用的存储方式有哪些?

(五种,说出哪五种,五种存储方式什么情况下用。)注意sharepreferes对象支持读取不支持写入,写入引用Editor

SQLite

SQLite是一个轻量级的数据库,支持基本SQL语法,是常被采用的一种数据存储方式。Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的API。

SharedPreference

除SQLite数据库外,另一种常用的数据存储方式,其本质就是一个xml文件,常用于存储较简单的参数设置。

File

即常说的文件(I/O)存储方法,常用语存储大数量的数据,但是缺点是更新数据将是一件困难的事情。

ContentProvider:

Android 系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,但是其又是必不可少的一种存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。每个ContentProvider都会对外提供一个公共的URI(包装成Uri对 象),如果应用程序有数据需要共享时,就需要使用ContentProvider为这些数据定义一个URI,然后其他的应用程序就通过 Content Provider传入这个URI来对数据进行操作。

网络存储:

从网络读取数据和写入数据。 Android提供了通过网络来实现数据的存储和获取的方法。

 我们可以调用WebService返回的数据或是解析HTTP协议实现网络数据交互。

2.安卓中动画有几类,他们的特点和区别? 

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

3.handler机制原理

Handler主要用于线程间的通信。

一个Handler允许发送和处理Message和Runable对象,UI主线程会自动分配一个Looper(消息轮询器),每个Looper中封装着MessageQueue(消息队列),遵循先进先出原则。Looper负责不断的从自己的消息队列里取出队头的任务或消息执行。一般是在子线程执行完耗时操作之后,通过Handler的sendMessage或post方法将Message和Runable对象传递给MessageQueue,而且在这些对象离开MessageQueue时,Handler负责执行他们(用到handleMessage方法,主要执行刷新UI的代码)。 
其中Message类就是定义了一个信息,这个信息中包含一个描述符和任意的数据对象,这个信息被用来传递给Handler.Message对象提供额外的两个int域和一个Object域。

4.除了handler和子线程,还有一个处理线程的是什么,主要方法是什么?

AsynTask,doInbackGround+onPostExecute

doInBackground() 这个方法运行在后台线程中,主要负责执行那些很耗时的操作,如访问网络。该方法必须重写。

onPostExecute(Result) 这个方法运行于UI主线程,在doInBackground(Params…)方法执行后调用,该方法用于接收后台任务执行后返回的结果,刷新UI显示

5.tcp和udp区别.

TCP---传输控制协议,提供的是面向连接、可靠的字节流服务,传输数据前经过“三次握手”建立连接,保证数据传输的可靠性,但效率比较低。一般用于对于数据传输安全性较高的场合。

UDP---用户数据报协议,是一个简单的面向数据报的运输层协议,面向无连接。UDP不提供可靠性,数据传输可能发生错序,丢包,但效率较高。一般用于对于实时性要求较高的场合。

6.线程之间的通信方式(如何避免ANR)

(1). AsyncTask,其中doInBackground()和onPostExecute(Result)两个方法非常重要

doInBackground() 这个方法运行在后台线程中,主要负责执行那些很耗时的操作,如访问网络。该方法必须重写。

onPostExecute(Result) 这个方法运行于UI主线程,在doInBackground(Params…)方法执行后调用,该方法用于接收后台任务执行后返回的结果,刷新UI显示。

(2.)子线程 + handler

在子线程中执行完耗时操作需要刷新UI时,通过handler.sendMessage()发消息给主线程, 然后在主线程Handler中的handleMessage()方法中执行刷新UI操作

7.activity的生命周期

在系统中的Activity被一个Activity栈所管理。当一个新的Activity启动时,将被放置到栈顶,成为运行中的Activity,前一个Activity保留在栈中,不再放到前台,直到新的Activity退出为止。  

Activity有四种本质区别的状态: 1)在屏幕的前台(Activity栈顶),叫做活动状态或者运行状态(active or running) 

2)如果一个Activity失去焦点,但是依然可见(一个新的非全屏的Activity 或者一个透明的Activity 被放置在栈顶),叫做暂停状态(Paused)。一个暂停状态的Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被杀掉。 

3)如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被杀掉。 

4)如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除,Android系统采用两种方式进行删除,要么要求该Activity结束,要么直接杀掉它的进程。当该Activity再次显示给用户时,它必须重新开始和重置前面的状态。  

Activity提供了7个生命周期方法: 

onCreate(),onStart(),onResume(),onPause(),onStop(),onDestory(),onRestart()。在这七个生命周期方法中有三个关键的循环。其实官方给的那张图画得很明白,但估计很少人能有耐心去揣摩。那就换种方式展现。看图吧: 1)以下该图呈现了一个Activity完整的生命周期,从onCreate(Bundle)开始到onDestroy()结束。Activity在onCreate()设置所有的“全局”状态,在 onDestory()释放所有的资源。 

首先我们运行程序,这是打开MainActivity依次调用onCreate->onStart->onResume,这时MainActivity在栈顶,与我们交互的Activity都在栈顶。然后我按下返回键,则会依次调用onPause->onStop->onDestory。这属于一个完整的生命周期。

8.ArrayList和LinkedList区别?

存数据,ArrayList数组存储数据,索引值以下标来搜索,查询比较方,删除增加比较麻烦,但是linkedList以链表式存储数据,对于增删比较方便。

9.安卓内存的优化?*

1)静态变量引起内存泄露

在代码优化的过程中,我们需要对代码中的静态变量特别留意。静态变量是类相关的变量,它的生命周期是从这个类被声明,到这个类彻底被垃圾回收器回收才会被销毁。所以,一般情况下,静态变量从所在的类被使用开始就要一直占用着内存空间,直到 程序退出。如果不注意,静态变量引用了占用大量内存的资源,造成垃圾回收器无法对内存进行回收,就可能造成内存的浪费

2)使用Application的Context

在Android中,Application Context的生命周期和应用的生命周期一样长,而不是取决于某个Activity的生命周期。如果想保持一个长期生命的对象,并且这个对象需要一个Context,就可以使用Application对象。可以通过调用Context.getApplicationContext()方法或者Activity.getApplication()方法来获得Application对象。

3)及时关闭资源

Cursor是Android查询数据后得到的一个管理数据集合的类。正常情况下,如 果我们没有关闭它,系统会在回收它时进行关闭,但是这样的效率特别低。如果查询得到的数据量较小时还好,如果Cursor的数据量非常大,特别是如果里面 有Blob信息时,就可能出现内存问题。所以一定要及时关闭Cursor。

4)使用Bitmap及时调用recycle()    // 把 重复循环的方法设置 为null,释放内存

前面的章节讲过,在不使用Bitmap对象时,需要调用recycle()释放内存,然后将它设置为null。虽然调用recycle()并不能保证立即释放占用的内存,但是可以加速Bitmap的内存的释放。

在代码优化的过程中,如果发现某个Activity用到了Bitmap对象,却没有显式的调用recycle()释放内存,则需要分析代码逻辑,增加相关代码,在不再使用Bitmap以后调用recycle()释放内存。

    5)对Adapter进行优化

下面以构造ListView的BaseAdapter为例说明如何对Adapter进行优化。

@软引用和弱引用。  

如果一个对象只具有软引用,那么如果内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。软引用可以和一个引用队 列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。

如果一个对象只具有弱引用,那么在垃圾回收器线程扫描的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。弱 引用也可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

弱引用与软引用的根本区别在于:只具有弱引用的对象拥有更短暂的生命周期,可能随时被回收。而只具有软引用的对象只有当内存不够的时候才被回收,在内存足够的时候,通常不被回收。

9.UI优化

在Android应用开发过程中,屏幕上控件的布局代码和程序的逻辑代码通常是分开的。界面的布局代码是放在一个独立的xml文件中的,这个文件里面是树型组织的,控制着页面的布局。通常,在这个页面中会用到很多控件,控件会用到很多的资源。Android系统本身有很多的资源,包括各种各样的字符串、图片、动画、样式和布局等等,这些都可以在应用程序中直接使用。这样做的好处很多,既可以减少内存的使用,又可以减少部分工作量,也可以缩减程序安装包的大小。

 

10.framgment生命周期?

oncreate,onstart,onrestart,onstop,onresume,ondestroy,onpause,onAttach,onCreateView,onDettach,onDestroyView;(和activity的生命周期比较,会更好)

 MyFragment onAttach() 粘贴到activity上
MyFragment onCreate() fragment创建
MyFragment onCreateView() fragment创建自己的视图

MainActivity onCreate()
MyFragment onActivityCreated() 可以处理fragment数据的初始化

MainActivityonStart()
 MyFragmentonStart()

MainActivityonResume()
MyFragment onResume()

按后退键
MyFragment onPause()
MainActivity onPause()

 MyFragment onStop()
 MainActivityonStop()

MyFragment onDestoryView()销毁掉自己的视图
MyFragment onDestory()
MyFragment onDetach() 解除和activity的关系

MainActivityonDestory()

11·图片异步加载怎么做?

可定义图片异步加载工具类,核心方式实现思路如下:

1.先从内存缓存(Map<String,SoftReference<Bitmap>>中获取图片显示

2.获取不到的话从本地SD卡里获取并显示

3.都获取不到的话通过子线程从网络加载图片并保存到内存及SD卡中并通过handler显示

12·service和Thread区别?

1).Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。 

2).Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上

13·内存泄露如何解决?

http://wenku.baidu.com/view/03dc4b46b307e87100f69604.html

1)、   数据库的cursor没有关闭 

2)、 构造adapter没有使用缓存contentview 

   衍生的listview优化问题:减少创建View的对象,充分使用contentview,可以使用静态类来处理优化getView的过程 3、Bitmap对象不使用时采用recycle()释放内存 4、Activity中的对象生命周期大于Activity

)Bitmap对象不使用recycle()释放内存

)Activity中的对象生命周期大于Activity;

内存泄露大多数都是由于相同的错误导致的,即:对Context拥有较长时间的引用。

避免Context相关的内存泄露,记住以下事情: 

   不要保留对Context-Activity长时间的引用(对Activity的引用的时候,必须确保拥有和Activity一样的生命周期) 

   尝试使用Context-Application来替代Context-Activity 

   如果你不想控制内部类的生命周期,应避免在Activity中使用非静态的内部类,而应该使用静态的内部类,并在其中创建一个对Activity的弱引用。这种情况的解决办法是使用一个静态的内部类,其中拥有对外部类的WeakReference,如同ViewRoot和它的Winner类那样 

   GC(垃圾回收)不能解决内存泄露问题 

14·MVC的使用?

mvc是model,view,controller的缩写,mvc包含三个部分: 

  l模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。 

  l视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。 

  l控制器(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里面处理,当然对业务计算等操作也是必须放在的该层的。 

15·常用的设计模式

单例设计模式

       所谓单例设计模式简单说就是无论程序如何运行,采用单例设计模式的类(Singleton类)永远只会有一个实例化对象产生。具体实现步骤如下:

      (1)将采用单例设计模式的类的构造方法私有化(采用private修饰)。

      (2)在其内部产生该类的实例化对象,并将其封装成private static类型。

      (3)定义一个静态方法返回该类的实例。

工厂设计模式

       程序在接口和子类之间加入了一个过渡端,通过此过渡端可以动态取得实现了共同接口的子类实例化对象

代理设计模式

       指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其他相关业务的处理。比如生活中的通过代理访问网络,客户通过网络代理连接网络(具体业务),由代理服务器完成用户权限和访问限制等与上网相关的其他操作(相关业务)。

观察者设计模式

       所谓观察者模式,举个例子现在许多购房者都密切观察者房价的变化,当房价变化时,所有购房者都能观察到,以上的购房者属于观察者,这便是观察者模式。

      java中可以借助Observable类和Observer接口轻松实现以上功能。当然此种模式的实现也不仅仅局限于采用这两个类。

适配器模式

        如果一个类要实现一个具有很多抽象方法的接口,但是本身只需要实现接口中的部分方法便可以达成目的,所以此时就需要一个中间的过渡类,但此过渡类又不希望直接使用,所以将此类定义为抽象类最为合适,再让以后的子类直接继承该抽象类便可选择性的覆写所需要的方法,而此抽象类便是适配器类。

 

16·面向对象的特征?

封装

封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。

封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

继承

面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

多态

多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

实现多态,有二种方式,覆盖,重载。

覆盖,是指子类重新定义父类的虚函数的做法。

重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

 

17·程序结束的时候,如何处理Activity的?*

记录打开的Activity:(http://zdpeng.iteye.com/blog/1576055

每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。 

18·配置文件中存放什么?

四大组件,意图,权限,第三方key,版本号等

19·Final ,finally,finalized,区别;

final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不

可继承。

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此

方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

 

20·NDK是什么?

NDK 是 Native DevelopmentKit 的简称。它是一个工具集,集成了 Android 的交叉编译环境,并提供了一套比较方便的 Makefile ,可以帮助开发者快速开发 C 或是 C++ 的动态库,并自动的将 so 和java 程序打包成 apk ,在 Android 上运行。Android 上,应用程序的开发,大部分基于 Java 语言来实现。要使用 c 或是 c++ 的程序或库,就需要使用 NDK 来实现。 

21百度地图和谷歌地图的优缺点?

优势:

1一打开百度地图页面,显示的就是目前所在城市地图,谷歌地图不然。

2百度地图的界面,百度地图很多都是在显眼位置用文字做提示,一目了然,谷歌界面有点炫,很多用图标来表示,但是用起来相对复杂,不熟悉的用户需要确定这个图标是否是所需要选择的。

而百度地图搜索框下就直接有“公交”“驾车”的选项,界面简洁直接很多,谷歌地图需要点击获取路线,再点击小图标来选择“公交”这些选项,而且图标不够引人注目,使用起来相对复杂些,试想一个很少用网络地图的人分别使用二者地图,那个更方便呢?应该是百度,大多数用户通过地图是查询位置-这个地方在哪,周围有什么地物,查询路线-从一个方到另一个地方如何到达,用百度地图,这些问题很容易解决,而用谷歌地图得摆弄一会儿。

3百度地图的查询路线更好,首先还是界面更简洁直接,然后是数据的问题,先不管为他们提供数据的公司如何,刚刚特意同时查了下,同样地起点和终点, 百度地图给出了5条路线,谷歌地图给出的是4条路线,而且百度地图路线的选择时可以选择“较快捷”“少换乘”“少步行”三种方式,更方便。打车费用也直接显示出来,而且个人体会10元内的打车费用基本正确。

4百度地图有个视野内搜索功能,可以很方便地查找到目标位置,谷歌地图没有。这个很重要。

5一个重要界面布局问题,百度地图是地图视野在左,而谷歌地图是地图视野在右,我们现在时喜欢从左到右看东西啊,这点百度地图更符合用户习惯。(当然也可能是我常用百度地图,所以这么觉得)

 PS:刚在知乎上有朋友说到——因“左图右列表”强调的是“地图”,反之强调的是“搜索”;我们发现用户在经过这么些年的教育后,“不在乎”地图在哪边,相对其它体验,这一点影响用户选择服务的权重并不高。

6百度地图已经和都市圈合作推出了部分城市如北京、上海、深圳、广州的三维地图,谷歌地图没有。

7百度地图地图视野上方有个截图功能,可以直接拉框截图,谷歌地图没有。 

8以北京实时路况信息为例,直接输入北京查询,百度地图显示的是主城区的实时路况,而谷歌显示的区域很大,包括了密云、廊坊市了,但是实时路况信息还是显示的主城区,显示路况的彩色条就全挤在一起了,设计得不如百度好。

8使用百度的占大多数,经常可以听到“百度一下啊”的话语。随之带来百度地图的使用率也相对较高。

9百度地图的地图百宝箱、房产、天气等信息。

劣势:

1如果需要从网络地图上获取数据的话,谷歌地图完胜,而且还有谷歌地球在一旁辅助,如虎添翼,从网上各种各样的谷歌地图相关工具软件就可以看出。

2路线查询时输入地点名称却有多个符合条件时,会给出一个下拉菜单给予选择,同一地点谷歌地图提供的数据精确到街道,而百度地图精确到区。

3谷歌地图可以将侧边栏隐藏起来,看到更大的地图视野,而百度地图是点击全屏来显示更大的视野,两种切换方式比起来谷歌的更舒服。

4谷歌地图有个分享链接功能,而且还提供“粘贴 HTML 以便嵌入到网站”这一功能,百度没有。

5界面布局百度地图更简洁,但是色彩搭配上和画面感上谷歌地图更好。 

6谷歌的品牌形象占优。

22·安卓的系统架构

http://wenku.baidu.com/view/3ef50eddd15abe23482f4d7e.html

android系统架构分从下往上为linux 内核层、运行库、应用程序框架层、和应用程序层 linuxkernel:负责硬件的驱动程序、网络、电源、系统安全以及内存管理等功能。  

  libraries和 androidruntime:libraries:即c/c++函数库部分,大多数都是开放源代码的函数库,例如webkit,该函数库负责 android网页浏览器的运行,例如标准的c函数库libc、openssl、sqlite等,当然也包括支持游戏开发2dsgl和 3dopengles,在多媒体方面有mediaframework框架来支持各种影音和图形文件的播放与显示,例如mpeg4、h.264、mp3、 aac、amr、jpg和png等众多的多媒体文件格式。android的runtime负责解释和执行生成的dalvik格式的字节码。  

  applicationframework(应用软件架构),java应用程序开发人员主要是使用该层封装好的api进行快速开发。  

  applications:该层是java的应用程序层,android内置的googlemaps、e-mail、即时通信工具、浏览器、mp3播放器等处于该层,java开发人员开发的程序也处于该层,而且和内置的应用程序具有平等的位置,可以调用内置的应用程序,也可以替换内置的应用程序。  

  上面的四个层次,下层为上层服务,上层需要下层的支持,调用下层的服务,这种严格分层的方式带来的极大的稳定性、灵活性和可扩展性,使得不同层的开发人员可以按照规范专心特定层的开发。  

  android应用程序使用框架的api并在框架下运行,这就带来了程序开发的高度一致性,另一方面也告诉我们,要想写出优质高效的程序就必须对整个 applicationframework进行非常深入的理解。精通applicationframework,你就可以真正的理解android的设计和运行机制,也就更能够驾驭整个应用层的开发。

 

23.listView优化

1)、convertView复用,对convetView进行判空,当convertView不为空时重复使用,为空则初始化,从而减少了很多不必要的View的创建

2)定义一个ViewHolder,封装Listview Item条目中所有的组件,将convetView的tag设置为ViewHolder,不为空时通过ViewHolder的属性获取对应组件即可

3)、当ListView加载数据量较大可以采用分页加载和图片异步加载

24·安卓上安装了多个浏览器,能否指定页面访问;

通过直接发送URI把参数带过去,或者通过Manifest里的intentfilter的data属性

25·简述音乐播放的方式与区别?

1):MediaPlayer:主要用于播放音频,可以播放视频,但是一般不用其进行视频播放

   2):SoundPool: 主要用于播放一些短促的声音片段,主要优势是cpu资源占有量低,反应延迟小。

26·工作中如何利用线程池的?】

Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

27·onTouch和onTouchEvent区别?

1. onTouch方法:
onTouch方法是View的 OnTouchListener接口中定义的方法。
当一个View绑定了OnTouchLister后,当有touch事件触发时,就会调用onTouch方法。
(当把手放到View上后,onTouch方法被一遍一遍地被调用)
2.onTouchEvent方法:
onTouchEvent方法是override 的Activity的方法。
重新了Activity的onTouchEvent方法后,当屏幕有touch事件时,此方法就会别调用。
 

 28·JSON的结构?

json是一种轻量级的数据交换格式,

json简单说就是对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构

1、对象:对象表示为“{}”扩起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。

2、数组:数组在json中是中括号“[]”扩起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种

经过对象、数组2种结构就可以组合成复杂的数据结构了。

29·SIM卡的EF文件有何作用?

  SIM卡的文件系统有自己的规范,主要是为了和手机通讯,SIM本身可以有自己的操作系统,EF就是作  存储并和手机通讯用的。

30.最长的短信多长,多少个字节?

70个汉字,140个字节

31·&和&&的区别

一个位运算符,一个是逻辑运算符

32·Java的基本特征

封装

封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。

封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

继承

面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

多态

多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

实现多态,有二种方式,覆盖,重载。

覆盖,是指子类重新定义父类的虚函数的做法

重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

 

33·注册广播的方式

android中,不同进程之间传递信息要用到广播,可以有两种方式来实现。 
第一种方式:在Manifest.xml中注册广播,是一种比较推荐的方法,因为它不需要手动注销广播(如果广播未注销,程序退出时可能会出错)。 
具体实现在Manifest的application中添加: 
<receiver android:name=".mEvtReceiver">
 
<intent-filter>
 
<action android:name="android.intent.action.BOOT_COMPLETED" />
 
</intent-filter>
 
</receiver>
 
上面两个android:name分别是广播名和广播的动作(这里的动作是表示系统启动完成),如果要自己发送一个广播,在代码中为: 
Intent i = new Intent("android.intent.action.BOOT_COMPLETED");
 
sendBroadcast(i);
 
这样,广播就发出去了,然后是接收。 
接收可以新建一个类,继承至BroadcastReceiver,也可以建一个BroadcastReceiver的实例,然后得写onReceive方法,实现如下: 
protected BroadcastReceiver mEvtReceiver = new BroadcastReceiver() {
 
@Override
 
public void onReceive(Context context, Intent intent) {
 
String action = intent.getAction();
 
if (action.equals("android.intent.action.BOOT_COMPLETED")) {
 
//Do something
 
}
 
}
 
};
 

第二种方式,直接在代码中实现,但需要手动注册注销,实现如下: 
IntentFilter filter = new IntentFilter();
 
filter.addAction("android.intent.action.BOOT_COMPLETED");
 
registerReceiver(mEvtReceiver, filter); //
这时注册了一个recevier,名为mEvtReceiver,然后同样用上面的方法以重写onReceiver, 
最后在程序的onDestroy中要注销广播,实现如下: 
@Override
 
public void onDestroy() {
 
super.onDestroy();
 
unregisterReceiver(mPlayerEvtReceiver);
 
}
 
Android
系统中的广播是广泛用于应用程序之间通信的一种手段,它类似于事件处理机制,不同的地方就是广播的处理是系统级别的事件处理过程(一般事件处理是控件级别的)。在此过程中仍然是离不开Intent对象,理解广播事件的处理过程,灵活运用广播处理机制,在关键之处往往能实现特别的效果, 
在Android 中如果要发送一个广播必须使用sendBroadCast向系统发送对其感兴趣的广播接收器中。 
使用广播必须要有一个intent 对象必设置其action动作对象 
使用广播必须在配置文件中显式的指明该广播对象 
每次接收广播都会重新生成一个接收广播的对象 
在BroadCast 尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity或者 Service去处理 

34·异步和同步的区别?

同步提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 

(顺序执行处理事件)

异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

      (可同时执行多个事件的并发)

35·Afinal和XUtils的区别?

Xutils是基于Afinal

xUtils 包含了很多实用的android工具。

xUtils 源于Afinal框架,对Afinal进行了适当的精简,和一些适度的扩展和重构。

xUtils 具有Afinal的一些特性如:无需考虑bitmap在android中加载的时候oom的问题和快速滑动的时候图片加载位置错位等问题;简洁,约定大于配置...

 //  oom==内存溢出  ( 释放内存 bitmap )

// 对XUtils的理解: Dbutils 、ViewUtils、HttpUtils、BitmapUtils

DbUtils模块:android中的orm框架,一行代码就可以进行增删改查。

ViewUtils模块:android中的ioc框架,完全注解方式就可以进行UI绑定和事件绑定。

HttpUtils模块:支持同步,异步方式的请求,支持大文件上传;支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD请求,支持multipart上传设置subtype如related。

BitmapUtils模块:加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出 现的图片错位等现象;内存管理使用lru算法,更好的管理bitmap内存;可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等...

// Android 中ANR异常的处理方法 :( 意思是: 应用程序没有响应 ) 

有两种情况会报ANR:  自己添加的

1.主线程在5秒内没有响应输入事件(事件处理/UI线程)

2.广播在10秒内没有完成返回( BroadcastReceiver )

下面是导致android中出现ANR异常的的情况:

1.在主线程内进行网络操作

2.在主线程内进行一些缓慢的磁盘操作(例如执行没有优化的SQL查询)

处理的逻辑是:

1.New一个新的线程,进行数据请求

2.获取数据后,调用handler.sendmessage方法

3.在handler的handle()方法中更新UI

// Android 如何指定浏览器访问 指定页面?

指定action 及 uri 就可以访问制定好的 浏览器了

1>简而言之: 一个程序至少有一个进程,一个进程至少有一个线程

2>线程的划分尺度小于进程,使的多线程程序的并发性高

3>进程在执行的过程中拥有独立的内存单元,而多个线程共享内存,从而提高了程序的运行效率

4>每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

5>多线程的意义在于一个应用程序中,有多个执行部分可以同时执行, 但是操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理及分配资源,这就是进程和线程的重要区别

36·ContentProvider的URI的配置?

清单文件之指定URI或者代码里面指定URI,contentProvider通过URI访问数据

37·AIDL的全称是什么,如何工作

AIDL的英文全称是Android Interface DefineLanguage

当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>

为什么要指定调用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(newInten("net.blogjava.mobile.aidlservice.RemoteService"),serviceConnection, Context.BIND_AUTO_CREATE);

      ServiceConnection的onServiceConnected(ComponentName name, IBinderservice)方法中的service参数就是A工程中MyService类中继承了RemoteService.stub类的内部类的对象。

 Android采用RPC的方式来实现(remote procedure call)远程通信,并且Android通过接口定义语言AIDL来生成两个进程之间互相访问的代码。例如,你在Activity里的代码需要访问Service中的一个方法,那么就可以通过这种方法来实现了。

   创建一个AIDL文件(参见代码)

   实现AIDL文件生成的Java接口(参见代码)

   将你的接口暴露给客户端

   客户端调用

38·屏幕适配?

ه最好可以通过权重(layout_weight)的方式来分配每个组件的大小,也可以通过具体的像素(dip)来确定大小。
尽量使用Relativelayout  。
已知应用支持平台设备的分辨率,可以提供多个layout_320*480  ...
drawable-hdpi,drawable-mdpi,drawable-ldpi分别代表分辨率为480*800,360*480,240*360, 放置图片大小相差1.5倍
最后还需要在AndroidManifest.xml里添加下面一段,没有这一段自适应就不能实现:
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
  android:anyDensity = "true"/>
在</application>标签和</manifest> 标签之间添加上面那段代码。即可。
备注:三者的解析度不一样,就像你把电脑的分辨率调低,图片会变大一样,反之分辨率高,图片缩小
还可以通过.9.png实现图片的自适应

 

// 应用升级(版本号升级 ) 或软件升级,数据库就会跟着升级

应用升级==版本号升级  == 同时数据库也会 跟着升级

软件升级 == 同时数据库也会跟着升级

39·版本更新?数据库的更新?跨版本?

版本:

在清单文件更改版本号,上传更新的应用到平台,利用平台的更新提醒用户是否更新新版本。

数据库更新:

先更改版本号,在onupgress方法内判断版本号是否一致,不一致则更新数据库。

40·安卓自定义组件?

Android自定义组件有三种实现思路:

1) 继承某个现有组件,在其基础上添加额外功能,如继承Gallery实现CoverFlow效果

      2)复合型组件定义:继承某个Layout,实现复合组件自定义,如TextView和EditText组合实现登录注册组件

      3)继承View,实现onDraw()方法,实现自己绘制组件,如翻页效果组件

41.listview分页加载的步骤

通常实现分页加载有两种方式,一种是在ListView底部设置一个按钮,用户点

击即加载。另一种是当用户滑动到底部时自动加载。

           在ListView底部设置一个按钮,用户点击即加载实现思路:

           // 加上底部View,注意要放在setAdapter方法前

     ListView.addFooterView(moreView);

     bt.setOnClickListener(new OnClickListener() {

      @Override

      public voidonClick(View v) {

     pg.setVisibility(View.VISIBLE);// 将进度条可见

     bt.setVisibility(View.GONE);// 按钮不可见

     handler.postDelayed(new Runnable() {

      @Override

      public void run() {

      loadMoreDate();// 加载更多数据

     bt.setVisibility(View.VISIBLE);

     pg.setVisibility(View.GONE);

     mSimpleAdapter.notifyDataSetChanged();// 通知listView刷新数据

      }

      }, 2000);

      }

      });

           当用户滑动到底部时自动加载实现思路: 实现OnScrollListener 接口重写

onScrollStateChanged 和onScroll方法,使用onscroll方法实现”滑动“后处理检查是否还有新的记录,如果有,添加记录到adapter, adapter调用 notifyDataSetChanged 更新数据;如果没有记录了,则不再加载数据。使用onScrollStateChanged可以检测是否滚到最后一行且停止滚动然后执行加载.

42.移动互联数据的交换格式

移动互联数据交互格式有XML和JSON

1.JSON和XML的数据可读性基本相同

2.JSON和XML同样拥有丰富的解析手段

3.JSON相对于XML来讲,数据的体积小

4.JSON与JavaScript的交互更加方便

5.JSON对数据的描述性比XML较差

6.JSON的速度要远远快于XML

43.xmpp的底层是怎样实现的?

socket,双广播,连接广播和通知光爆

44.Activity的启动模式(四种)

StandardsingleTopsingleTasksingleInstance

standard

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值