Android--面试题整理(五)

41. Android程序与Java程序的区别?java

Android程序用android sdk开发,java程序用javasdk开发.linux

Android SDK引用了大部分的Java SDK,少数部分被Android SDK抛弃,好比说界面部分,java.awt  swing package除了java.awt.font被引用外,其余都被抛弃,在Android平台开发中不能使用。android

android sdk 添加工具jar httpclient ,pull  openGL  算法

 

将Java 游戏或者j2me程序移植到Android平台的过程当中,编程

Android  SDK 与JavaSDK的区别是很须要注意的地方。浏览器

1.6的 不支持 httpUrlconning 获取 last-modified 信息的处理缓存

simpleDataFormat 安全

 

 

42. Android中Task任务栈的分配。mvc

 

假若有三个Activity A B C,A跳到B,而后B跳到C,如今须要从C跳到A如何传递数据并且使效率最高呢?app

 

首先咱们来看下Task的定义,Google是这样定义Task的:a task is what the user experiences asan "application." It's a group of related activities, arranged in astack. A task is a stack of activities, not a class or an element in themanifest file. 这意思就是说Task其实是一个Activity栈,一般用户感觉的一个Application就是一个Task。从这个定义来看,Task跟Service或者其余Components是没有任何联系的,它只是针对Activity而言的。

Activity有不一样的启动模式, 能够影响到task的分配

Task,简单的说,就是一组以栈的模式汇集在一块儿的Activity组件集合。它们有潜在的先后驱关联,新加入的Activity组件,位于栈顶,并仅有在栈顶的Activity,才会有机会与用户进行交互。而当栈顶的Activity完成使命退出的时候,Task会将其退栈,并让下一个将跑到栈顶的Activity来于用户面对面,直至栈中再无更多Activity,Task结束。

事件

Task栈(粗体为栈顶组件)

点开Email应用,进入收件箱(Activity A)

A

选中一封邮件,点击查看详情(Activity B

AB

点击回复,开始写新邮件(Activity C

ABC

写了几行字,点击选择联系人,进入选择联系人界面(Activity D

ABCD

选择好了联系人,继续写邮件

ABC

写好邮件,发送完成,回到原始邮件

AB

点击返回,回到收件箱

A

退出Email程序

null

 

如上表所示,是一个实例。从用户从进入邮箱开始,到回复完成,退出应用整个过程的Task栈变化。这是一个标准的栈模式,对于大部分的情况,这样的Task模型,足以应付,可是,涉及到实际的性能、开销等问题,就会变得残酷许多。

 

好比,启动一个浏览器,在Android中是一个比较沉重的过程,它须要作不少初始化的工做,而且会有不小的内存开销。但与此同时,用浏览器打开一些内容,又是通常应用都会有的一个需求。设想一下,若是同时有十个运行着的应用(就会对应着是多个Task),都须要启动浏览器,这将是一个多么残酷的场面,十个Task栈都堆积着很雷同的浏览器Activity,

是多么华丽的一种浪费啊。

因而你会有这样一种设想,浏览器Activity,可不能够做为一个单独的Task而存在,无论是来自那个Task的请求,浏览器的Task,都不会归并过去。这样,虽然浏览器Activity自己须要维系的状态更多了,但总体的开销将大大的减小,这种舍小家为你们的行为,仍是很值得歌颂的

standard", "singleTop","singleTask", "singleInstance"

 

standard模式, 是默认的也是标准的Task模式,在没有其余因素的影响下,使用此模式的Activity,会构造一个Activity的实例,加入到调用者的Task栈中去,对于使用频度通常开销通常什么都通常的Activity而言,standard模式无疑是最合适的,由于它逻辑简单条理清晰,因此是默认的选择。

 

而singleTop模式,基本上于standard一致,仅在请求的Activity正好位于栈顶时,有所区别。此时,配置成singleTop的Activity,再也不会构造新的实例加入到Task栈中,而是将新来的Intent发送到栈顶Activity中,栈顶的Activity能够经过重载onNewIntent来处理新的Intent(固然,也能够无视...)。这个模式,下降了位于栈顶时的一些重复开销,更避免了一些奇异的行为(想象一下,若是在栈顶连续几个都是一样的Activity,再一级级退出的时候,这是怎么样的用户体验...),很适合一些会有更新的列表Activity展现。一个活生生的实例是,在Android默认提供的应用中,浏览器(Browser)的书签Activity(BrowserBookmarkPage),就用的是singleTop。

 

singleTask,和singleInstance,则都采起的另辟Task的蹊径。

标志为singleTask的Activity,最多仅有一个实例存在,而且,位于以它为根的Task中。全部对该Activity的请求,都会跳到该Activity的Task中展开进行。singleTask,很象概念中的单件模式,全部的修改都是基于一个实例,这一般用在构形成本很大,但切换成本较小的Activity中。最典型的例子,仍是浏览器应用的主Activity(名为Browser...),它是展现当前tab,当前页面内容的窗口。它的构形成本大,但页面的切换仍是较快的,于singleTask相配,仍是挺天做之合的。

 

singleInstance显得更为极端一些。在大部分时候singleInstance与singleTask彻底一致,惟一的不一样在于,singleInstance的Activity,是它所在栈中仅有的一个Activity,若是涉及到的其余Activity,都移交到其余Task中进行。这使得singleInstance的Activity,像一座孤岛,完全的黑盒,它不关注请求来自何方,也不计较后续由谁执行。在Android默认的各个应用中,不多有这样的Activity,在我我的的工程实践中,曾尝试在有道词典的快速取词Activity中采用过,

是由于我以为快速取词入口足够方便(从notification中点选进入),而且会在各个场合使用,应该作得彻底独立。

 

大的apk 拆成 不少小的apk 

  ●Activity android:taskAffinity=""属性 姻缘关系

1.配置后当启动这个activity时就先去找有没有activity的亲和力属性相同有就加入这个

    activity所在的任务中没有就新开任务

2.affinity起做用须要的条件而者具有一个:

        1.intent包含FLAG_ACTIVITY_NEW_TASK标记

        2.activity元素启用了allowTaskReparenting属性.true

 

43. 在Android中,怎么节省内存的使用,怎么主动回收内存?

   尽可能多使用内部类 提升程序效率  

   Beanprivate public

   回收已经使用的资源, 

  合理的使用缓存

合理设置变量的做用范围  application 对象

//将来的某一段时间执行 

System.gc();

 

 

44. 不一样工程中的方法是否能够相互调用?

  能够,列举aidl访问远程服务的例子.

 

 

45. 在Android中是如何实现判断区分电话的状态,去电,来电、未接来电?

Day8 showAddressService.java

 

46. dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念

Dvm的进程是dalivk虚拟机进程,每一个android程序都运行在本身的进程里面,

每一个android程序系统都会给他分配一个单独的liunx  uid(user id),

每一个dvm都是linux里面的一个进程.因此说这两个进程是一个进程.

 

47. sim卡的EF 文件有何做用

  Sim卡相关的东西,没接触过

  文件规范.

48. 如何判断是否有SD卡?

  配置文件中有sd卡的权限, 经过environment的静态方法,

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

49. 嵌入式操做系统内存管理有哪几种, 各有何特性。

页式,段式,段页,等 …

 

50. 什么是嵌入式实时操做系统, Android 操做系统属于实时操做系统吗?

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

硬实时. 火星探测车. Vxworks

软实时.  调度算法 

 

51. 一条最长的短信息约占多少byte?

中文70(包括标点),英文160,160个字节 这个说法不许确,

要跟手机制式运营商等信息有关.

 

作实验,看源码

ArrayList<String> msgs =sms.divideMessage(message);

        for (String msg : msgs) { 

           sms.sendTextMessage(phoneNumber, null, msg, pi, null);      

}

 

52. Linux中跨进程通讯的几种方式 。

linux编程

# 管道( pipe )管道是一种半双工的通讯方式数据只能单向流动并且只能在具备亲缘关系的进程间使用。进程的亲缘关系一般是指父子进程关系。

# 有名管道 (named pipe) : 有名管道也是半双工的通讯方式,可是它容许无亲缘关系进程间的通讯。

# 信号量( semophore ) : 信号量是一个计数器,能够用来控制多个进程对共享资源的访问。它常做为一种锁机制,防止某进程正在访问共享资源时,其余进程也访问该资源。所以,主要做为进程间以及同一进程内不一样线程之间的同步手段。

# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

# 信号 ( sinal ) : 信号是一种比较复杂的通讯方式,用于通知接收进程某个事件已经发生。

# 共享内存( shared memory ) :共享内存就是映射一段能被其余进程所访问的内存,这段共享内存由一个进程建立,但多个进程均可以访问。共享内存是最快的 IPC 方式,它是针对其余进程间通讯方式运行效率低而专门设计的。它每每与其余通讯机制,如信号两,配合使用,来实现进程间的同步和通讯。

# 套接字( socket ) : 套解口也是一种进程间通讯机制,与其余通讯机制不一样的是,它可用于不一样及其间的进程通讯。

53. 谈谈对Android NDK的理解。

native develop kit   只是一个交叉编译的工具  .so

    1.何时用ndk,   实时性要求高,游戏,图形渲染,  

opencv (人脸识别) , ffmpeg , rmvb  mp5 avi 高清解码. ffmpeg,opencore.

 

2.为何用ndk,ndk的优势 ,缺点,

 

咱们项目中那些地方用到了ndk, c opengl

 

54. 谈谈Android的优势和不足之处。

1、开放性,开源  ophone 阿里云( 彻底兼容android) 乐os

2、挣脱运营商束缚

3、丰富的硬件选择 mtk android 

4、不受任何限制的开发商

5、无缝结合的Google应用

 

缺点也有5处:

1、安全问题、隐私问题 

2、卖手机的不是最大运营商

3、运营商对Android手机仍然有影响

4、山寨化严重

5、过度依赖开发商,缺少标准配置 版本过多 

 

 

55. Android系统中GC什么状况下会出现内存泄露呢?  视频编解码/内存泄露

检测内存泄露   工具 

致使内存泄漏主要的缘由是,先前申请了内存空间而忘记了释放。若是程序中存在对无用对象的引用,那么这些对象就会驻留内存,消耗内存,由于没法让垃圾回收器GC验证这些对象是否再也不须要。若是存在对象的引用,这个对象就被定义为"有效的活动",同时不会被释放。要肯定对象所占内存将被回收,咱们就要务必确认该对象再也不会被使用。典型的作法就是把对象数据成员设为null或者从集合中移除该对象。但当局部变量不须要时,不需明显的设为null,由于一个方法执行完毕时,这些引用会自动被清理。

Java带垃圾回收的机制,为何还会内存泄露呢?

 

Vector v = new Vector(10);    

 for (int i =1; i < 100; i++)      {     

 Object o = new Object();       

v.add(o);     

o = null;     

}//此时,全部的Object对象都没有被释放,由于变量v引用这些对象。 

Java 内存泄露的根本缘由就是 保存了不可能再被访问的变量类型的引用

 

56. Android UI中的View如何刷新。

 

在主线程中  拿到view调用Invalide()方法,查看画画板里面更新imageview的方法

 

在子线程里面能够经过postInvalide()方法;

    iv.invalidate();

      

       new Thread(){

           public void run(){

              iv.postInvalidate();

           }

       }.start();

 

57. 简单描述下Android 数字签名。

Android 数字签名

       在Android系统中,全部安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的做者和在应用程序之间创建信任关系

Android系统要求每个安装进系统的应用程序都是通过数字证书签名的,数字证书的私钥则保存在程序开发者的手中。Android将数字证书用来标识应用程序的做者和在应用程序之间创建信任关系,不是用来决定最终用户能够安装哪些应用程序。

这个数字证书并不须要权威的数字证书签名机构认证(CA),它只是用来让应用程序包自我认证的。

同一个开发者的多个程序尽量使用同一个数字证书,这能够带来如下好处。

(1)有利于程序升级,当新版程序和旧版程序的数字证书相同时,Android系统才会认为这两个程序是同一个程序的不一样版本。若是新版程序和旧版程序的数字证书不相同,则Android系统认为他们是不一样的程序,并产生冲突,会要求新程序更改包名。

 

(2)有利于程序的模块化设计和开发。Android系统容许拥有同一个数字签名的程序运行在一个进程中,Android程序会将他们视为同一个程序。因此开发者能够将本身的程序分模块开发,而用户只须要在须要的时候下载适当的模块。

在签名时,须要考虑数字证书的有效期:

(1)数字证书的有效期要包含程序的预计生命周期,一旦数字证书失效,持有改数字证书的程序将不能正常升级。

(2)若是多个程序使用同一个数字证书,则该数字证书的有效期要包含全部程序的预计生命周期。

(3)Android Market强制要求全部应用程序数字证书的有效期要持续到2033年10月22日之后。

Android数字证书包含如下几个要点:

 (1)全部的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序

 (2)Android程序包使用的数字证书能够是自签名的,不须要一个权威的数字证书机构签名认证

 (3)若是要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。

 (4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。若是程序已经安装在系统中,即便证书过时也不会影响程序的正常功能。

 

 

58. 什么是ANR 如何避免它?

在Android上,若是你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称做应用程序无响应(ANR:Application Not Responding)对话框。用户能够选择让程序继续运行,可是,他们在使用你的应用程序时,并不但愿每次都要处理这个对话框。所以,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。

Activity 5秒  broadcast10

 

耗时的操做 worker thread里面完成,

 handlermessage…AsynsTask , intentservice.等…

 

59. android中的动画有哪几类,它们的特色和区别是什么?

两种,一种是Tween动画、还有一种是Frame动画。

Tween动画,这种实现方式可使视图组件移动、放大、缩小以及产生透明度的变化;

能够经过布局文件,能够经过代码

  1、   控制View的动画

a)  alpha(AlphaAnimation)

渐变透明   

b)  scale(ScaleAnimation)

渐变尺寸伸缩   

c)  translate(TranslateAnimation)

画面转换、位置移动 

d)  rotate(RotateAnimation)

画面转移,旋转动画 

 

2控制一个Layout里面子View的动画效果

a)  layoutAnimation(LayoutAnimationController)

b)  gridAnimation(GridLayoutAnimationController)

另外一种Frame动画,传统的动画方法,经过顺序的播放排列好的图片来实现,相似电影。

 

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

MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分红三个层——模型层、视图层、控制层。

 

Android中界面部分也采用了当前比较流行的MVC框架,在Android中M就是应用程序中二进制的数据,V就是用户的界面。Android的界面直接采用XML文件保存的,界面开发变的很方便。在Android中C也是很简单的,一个Activity能够有多个界面,只须要将视图的ID传递到setContentView(),就指定了以哪一个视图模型显示数据。

 

 

在Android SDK中的数据绑定,也都是采用了与MVC框架相似的方法来显示数据。在控制层上将数据按照视图模型的要求(也就是Android SDK中的Adapter)封装就能够直接在视图模型上显示了,从而实现了数据绑定。好比显示Cursor中全部数据的ListActivity,其视图层就是一个ListView,将数据封装为ListAdapter,并传递给ListView,数据就在ListView中显示。

 

63. 经过点击一个网页上的url 就能够完成程序的自动安装,描述下原理

  Day11 AddJavascriptInterface

new Object{

    callphone();

    installapk();

}

 

 

 

 

64,Service和Activity在同一个线程吗

默认状况同一线程 main主线程 ui线程

 

65,java中的soft reference是个什么东西

 StrongReference 是 Java 的默认引用实现, 它会尽量长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收

 

SoftReference会尽量长的保留引用直到 JVM 内存不足时才会被回收(虚拟机保证), 这一特性使得 SoftReference 很是适合缓存

 

应用详细见豆瓣客户端图片的缓存

相关文章
相关标签/搜索