Android面试知识(4)

来源:互联网 发布:德惠农业科技网络书屋 编辑:程序博客网 时间:2024/06/09 20:00

30、简要解释一下Activity、 Intent 、Intent Filter、Service、BroadcastReceiver。

一个activity呈现了一个用户可以操作的可视化用户界面。所有程序的流程都运行在Activity之中,Activity具有自己的生命周期(由系统控制生命周期,程序无法改变,可以用onSaveInstanceState保存其状态)。

Intent用于启动Activity, Service, 以及BroadcastReceiver三种组件, 同时还是组件之间通信的重要媒介。
- Intent为组件的启动提供了一致的编程模型. 无论想要组件是Activity, Service, 还是BroadcastReceiver, 都可以使用Intent封装启动的意图.
- 在某些时候, 应用程序只是想启动具有某种特征的组件, 并不想和某个特定的组件耦合. 使用Intent可以方便的达到这种高层次解耦的目的.

Intent属性的设置,包括:
- Action,也就是要执行的动作;
- Data,也就是执行动作要操作的数据,Android中采用指向数据的一个URI来表示,对于不同的动作,其URI数据的类型是不同的(可以设置type属性指定特定类型数据),如ACTION_EDIT指定Data为文件URI,打电话为tel:URI,访问网络为http:URI,而由content provider提供的数据则为content: URIs;
- type(数据类型),显式指定Intent的数据类型(MIME),一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导;
- category(类别),被执行动作的附加信息,比如LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个;
- component(组件),指定Intent的的目标组件的类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件;
- extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息;

IntentFilter类表示Intent过滤器, 大部分情况下, 每一个component都会定义一个或多个IntentFilter, 用于表明其可处理的Intent。一般来说, component的IntentFilter应该在AndroidManifest.xml文件中定义,定义的方法:在, , 元素中增加一个或多个子元素。

Service是一个没有用户界面的在后台运行执行耗时操作的应用组件。其他应用组件能够启动Service,并且当用户切换到另外的应用场景,Service将持续在后台运行。另外,一个组件能够绑定到一个service与之交互(IPC机制。

BroadcastReceiver是“广播接收者”的意思,它是Android四大基本组件之一,这种组件本质上是一种全局的监听器,用于监听系统全局的广播消息。它可以接收来自系统和应用的的广播。

当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若 匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要 实现onReceive()方法。

注册BroadcastReceiver有两种方式:
- 一种方式是,静态的在AndroidManifest.xml中用标签生命注册,并在标签内用标签设置过滤器。
- 另一种方式是,动态的在代码中先定义并设置好一个 IntentFilter对象,然后在需要注册的地方调Context.registerReceiver()方法,如果取消时就调用Context.unregisterReceiver()方法。

31、IntentService有何优点?

Service不是一个进程,它和应用程序在同一个进程中,Service也不是一个线程,它运行在应用程序的主线程中。IntentService继承自Service。
IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程。

32、横竖屏切换时候activity的生命周期?

  • 设置 android:configChanges=”orientation” 和不设置这个属性,生命周期表现为重新创建activity
  • 设置 android:configChanges=”orientation|keyboardHidden”,在2.3上表现为不重新创建activity4.0如下
    a)、android:targetSdkVersion<=”12”,生命周期表现为不重新创建activity
    b)、android:targetSdkVersion>”12”,表现为重新创建activity

  • 设置android:configChanges=”orientation|keyboardHidden|screenSize”,在2.3和4.0上都表现为不重新创建

33、如何将SQLite数据库(dictionary.db文件)与apk文件一起发布?

可以将dictionary.db文件复制到Eclipse Android工程中的res/raw目录中。所有在res /raw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。

34、如何打开res aw目录中的数据库文件?

在Android中不能直接打开res aw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res aw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。

实现:

private SQLiteDatabase openDatabase(){    try{        // 获得dictionary.db文件的绝对路径        String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME; File dir = new File(DATABASE_PATH);        // 如果/sdcard/dictionary目录中存在,创建这个目录        if (!dir.exists())            dir.mkdir();        // 如果在/sdcard/dictionary目录中不存在        // dictionary.db文件,则从res\raw目录中复制这个文件到        // SD卡的目录(/sdcard/dictionary)        if (!(new File(databaseFilename)).exists()){            // 获得封装dictionary.db文件的InputStream对象            InputStream is = getResources().openRawResource(R.raw.dictionary);             FileOutputStream fos = new FileOutputStream(databaseFilename);            byte[] buffer = new byte[8192];            int count = 0;            // 开始复制dictionary.db文件            while ((count = is.read(buffer)) > 0){                fos.write(buffer, 0, count);            }            fos.close();            is.close();        }        // 打开/sdcard/dictionary目录中的dictionary.db文件        SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFilename, null);        return database;        }    catch (Exception e){    }    return null;}
private final String DATABASE_PATH = android.os.Environment.getExternalStorageDirectory().getAbsolutePath()+ "/dictionary";private final String DATABASE_FILENAME = "dictionary.db";

35、Android引入广播机制的用意?

a:从MVC的角度考虑(应用程序内) ,是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一种补充关系,引入广播机制可以方便几大组件的信息和数据交互。
b:程序间互通消息(例如在自己的应用程序内监听系统来电);
c:效率上(参考UDP的广播协议在局域网的方便性); d:设计模式上(反转控制的一种应用,类似监听者模式)。

36、sim卡的EF文件有何作用

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

SIM (Subscriber Identity Module:用户识别模块) 卡是一种智能卡, ISO7816中对智能卡作了基本的定义. SIM卡提供给用户的是它的移动性和便携性.

SIM卡的硬件组成:
CPU: SIM卡中的CPU和电脑中CPU一样负责整个SIM卡的控制, 运算和操作;
ROM: 是SIM卡中存放整个片内操作系统的地方;
EPPROM: 相当于SIM卡中的硬盘,存放着整个文件系统和任何需要应用程序读写的信息;
RAM: 和计算机RAM的一样,也是用来存放计算过程中的临时数据。

37、嵌入式操作系统内存管理有哪几种,各有何特性?

  • 虚拟内存管理机制:使系统既可以运行体积比物理内存还要大的应用程序,也可以实现“按需调页”策略,既满足了程序的运行速度,又节约了物理内存空间。由于不同进程有自己单独的进程空间,它还十分有效的提高了系统可靠性和安全性。
  • 非虚拟内存管理机制:对内存的访问是直接的,它对地址的访问不需要经过MMU,而是直接送到地址线上输出,实时性高。
  • 页式存储管理:逻辑地址有页号和业内地址两部分组成,但作业仍然使用连续的逻辑地址,可把它看作是一维的(线性的)地址结构。用户没有分页的概念,操作系统把作业信息装入主存时才按照块长进行分页。
  • 段式存储管理:逻辑地址有段号和段内地址两部分组成。支持用户的分段,每段内的逻辑地址是连续的,而段与段之间的逻辑地址是不连续的。采用了二维的地址结构。

38、什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?

嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。

特点:实时性、可裁剪性、高可靠性、易移植性。

Android操作系统用的内核是linux,而linux内核不属于实时操作系统范畴。 所以Android不是实时操作系统。

39、一条最长的短信息约占多少byte?

手机短信的长度是由编码决定的,根据国际标准,每条短信最多发送1120位

如果发送纯英文字符,由于英文ASCII采用单字节的7位编码,所以1120位的限额可以传送1120 ÷ 7 = 160个byte。

一旦传送的字符中包含中文、日文、韩文等双字节字符,不论中文还是西文,不论全角还是半角,都必须采用2个字节的8位编码,因此1120 ÷ 8 ÷ 2 = 70个byte,即最多传送70个字。

40、Handler机制的原理

andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。

1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里,或者接收Looper从Message Queue取出)所送来的消息。
3)Message Queue(消息队列):用来存放线程放入的消息。
4)线程:UI Thread 通常就是Main Thread,而Android启动程序时会替它建立一个MessageQueue。

41、说说MVC模式的原理,它在android中的运用

MVC(Model view contraller)表示模型、视图、控制器。即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。

模型(Model):就是业务流程/状态的处理以及业务规则的制定。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC最主要的核心。

视图(View):代表用户交互界面。

控制(Controller):可以理解为从用户接收请求,将模型与视图匹配在一起,共同完成用户的请求。它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理。

模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。

image
- View 传送指令到 Controller
- Controller 完成业务逻辑后,要求 Model 改变状态
- Model 将新的数据发送到 View,用户得到反馈

Android中MVC的运用:
- View:自定义View或ViewGroup,负责将用户的请求通知Controller,并根据model更新界面;
- Controller:Activity或者Fragment,接收用户请求并更新model;
- Model:数据模型,负责数据处理相关的逻辑,封装应用程序状态,响应状态查询,通知View改变,对应Android中的datebase、SharePreference、ContentProvider等。

42、DDMS和TraceView的区别?

DDMS(Dalvik Debug Monitor Service),是安卓开发环境中的Dalvik虚拟机调试监控服务,是一个程序执行查看器,在里面可以看见线程和堆栈等信息。

Traceview是安卓平台配备的性能分析的工具,可以通过图形化让了解要跟踪的程序的性能,并且能具体到方法(Method)。

TraceView使用:在Manifest中加入sd卡写权限,在java代码中 onCreate里面面添加Debug.startMethodTracing(),在onStop面添加Debug.stopMethodTracing()。运行一遍后会在sd卡目录下生成一个trace文件,导出到电脑再用TraceView执行可查看程序的性能。

43、java中如何引用本地语言?

可以用JNI(Java Native Interface)接口。

44、谈谈Android的IPC(进程间通信)机制?

IPC即进程间通信(Interprocess Communication),Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中,该机制只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口的本地代理。

45、NDK是什么?

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

1 0
原创粉丝点击