美文网首页
android2019-01-04

android2019-01-04

作者: sindorina | 来源:发表于2019-01-04 10:27 被阅读0次

    1.activity的启动模式有哪些?是什么含义?

    答:在android里,有4种activity的启动模式,分别为:

    “standard” (默认) “singleTop” “singleTask” “singleInstance”

    它们主要有如下不同:

    1. 如何决定所属task

    “standard”和”singleTop”的activity的目标task,和收到的Intent的发送者在同一个task内,除非intent包括参数FLAG_ACTIVITY_NEW_TASK。
    如果提供了FLAG_ACTIVITY_NEW_TASK参数,会启动到别的task里。
    “singleTask”和”singleInstance”总是把activity作为一个task的根元素,他们不会被启动到一个其他task里。

    1. 是否允许多个实例

    “standard”和”singleTop”可以被实例化多次,并且存在于不同的task中,且一个task可以包括一个activity的多个实例;
    “singleTask”和”singleInstance”则限制只生成一个实例,并且是task的根元素。 singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不发送给新的实例。

    1. 是否允许其它activity存在于本task内

    “singleInstance”独占一个task,其它activity不能存在那个task里;如果它启动了一个新的activity,不管新的activity的launch mode 如何,新的activity都将会到别的task里运行(如同加了FLAG_ACTIVITY_NEW_TASK参数)。
    而另外三种模式,则可以和其它activity共存。

    1. 是否每次都生成新实例

    “standard”对于没一个启动Intent都会生成一个activity的新实例;
    “singleTop”的activity如果在task的栈顶的话,则不生成新的该activity的实例,直接使用栈顶的实例,否则,生成该activity的实例。
    比如现在task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent,如果D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。
    如果D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D
    如果这时候给B发Intent的话,不管B的launchmode是”standard” 还是 “singleTop” ,都会生成B的新实例,栈状态变为A-B-C-D-B。
    “singleInstance”是其所在栈的唯一activity,它会每次都被重用。
    “singleTask”如果在栈顶,则接受intent,否则,该intent会被丢弃,但是该task仍会回到前台。
    当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法 如果收到intent生成一个activity实例,那么用户可以通过back键回到上一个状态;如果是已经存在的一个activity来处理这个intent的话,用户不能通过按back键返回到这之前的状态。

    2.activity在屏幕旋转时的生命周期

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

    1. 注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。

    答:首先写一个类要继承BroadcastReceiver
    第一种:在清单文件中声明,添加

    <receive android:name=".IncomingSMSReceiver " >
    <intent-filter>
    <action android:name="android.provider.Telephony.SMS_RECEIVED")
    <intent-filter>
    <receiver>
    

    第二种使用代码进行注册如:

    IntentFilter filter =  new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
    IncomingSMSReceiver receiver = new IncomgSMSReceiver();
    registerReceiver(receiver.filter);
    

    两种注册类型的区别是:

    1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。

    2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

    4.描述一下android的系统架构

    android系统架构分从下往上为linux 内核层、运行库、应用程序框架层、和应用程序层。
    linuxkernel:负责硬件的驱动程序、网络、电源、系统安全以及内存管理等功能。
    libraries和 android runtime: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的设计和运行机制,也就更能够驾驭整个应用层的开发。

    5.IntentService有何优点?

    答:Acitivity的进程,当处理Intent的时候,会产生一个对应的Service; Android的进程处理器现在会尽可能的不kill掉你;非常容易使用

    1. 请介绍下ContentProvider是如何实现数据共享的。

    一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露。Content providers存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。
    要想使应用程序的数据公开化,可通过2种方法:创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Content provider中,前提是有相同数据类型并且有写入Content provider的权限。
    如何通过一套标准及统一的接口获取其他应用程序暴露的数据?
    Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。

    7.AIDL的全称是什么?如何工作?能处理哪些类型的数据?

    答:全称是:Android Interface Define Language
    在Android中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢?显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来却比较麻烦。
    AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.
    AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.
    AIDL的创建方法:
    AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。 由于远程调用的需要, 这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型:

    1. 不需要import声明的简单Java编程语言类型(int,boolean等)
    2. String, CharSequence不需要特殊声明
    3. List, Map和Parcelables类型, 这些类型内所包含的数据成员也只能是简单数据类型, String等其他比支持的类型.

    8.请解释下Android程序运行时权限与文件系统权限的区别。

    答:运行时权限Dalvik( android授权)
    文件系统 linux 内核授权

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

    答:DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。

    10.NDK是什么

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

    相关文章

      网友评论

          本文标题:android2019-01-04

          本文链接:https://www.haomeiwen.com/subject/ehqhrqtx.html