2024年4月11日发(作者:)

Java

知识点包括:接口与抽象的使用及区别,多线程,

socket

基础,集合 类,

也有个别公司考察定义,很无语.

C/C++

知识点包括:指针的移动,排序算法,链表,有时还会有二叉树的 遍历

或图的遍历.

1. Android

手机操作系统的四层架构?

Applications Application

Framework Android RunTime Libraries Liunx Kernel

架构框架以此从上到下:

1. Applications

(应用程序(应用层))

Android

会同一系列核心应用程序包一起发布,该应用程序包 包括

email

客户端

,SMS

短消息程序,日历,地图,浏览器,联系人管 理程序等.所有的应

用程序都是使用

JAVA

语言编写的.

ation FrameWork

(应用程序扩展层(框架))

由于

Android

的手机操作系统是,基于

Liunx 2.6

系统之上封装而 成.所以

开发人员可也

以直接访问核心程序所使用的

API

框架,该核心应用程序的

API

框 架设计简

化了组件的重用,任何一个核心应用程序(模块)都暴露出它 的功能作用,并且

其他应用程序也都可以使用该核心应用程序(模块) 的功能(不过的遵守该核

心应用程序框架的安全性限制).同样,该应用 程序的重用机制也使用户方便使

用应程序的相关组件.

API

框架隐藏的核心应用程序是一系列的应用程序的服务和系统

应用,其中包括如下:

(Android

手机中的

View

是最基本的一个

UI

类)

丰富而又可扩展的视图(手机界面所显示的组件

(Activity

上所显示 的))

组件,可以用

来构建应用程序如:(视图

)Views,

网格

(grids),

文本框

(text boxes),

(button),

置图片区

(imageview),

文本编辑区

(edittext),

文本显示区

(textview

),

3. Android RunTime Libraries (Android

系统运行库);

4. Liunx Kernel (Android

系统最底层核心系统

Liunx)

2. Android dvm

的进程和

Linux

的进程,应用程序的进程是否为同一 个概

念?

DVM

dalivk

的虚拟机.每一个

Android

应用程序都在它自己的 进程

中运行,都拥有一个独立的

Dalvik

虚拟机实例.而每一个

DVM

都是在

Linux

中的一个进程,所以说可以认为是同一个概念.

3. SIM

卡的

EF

文件有何作用?

SIM

卡的文件系统有自己规范,主要是为了和手机通讯,

SIM

卡本 身可以

有自己的操作系统,

EF

就是作存储并和手机通讯用的.

4.

一条最长的短信息约占多少

byte?

中文

70(

包括标点),英文

160,160

字节.

5. Android

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

两种.一种是

Tween

动画.还有一种是

Frame

动画.

Tween

动画,这种实现方式可以使视图组件移动.放大.缩小以及产 生 透明

度的变化;另一种

Frame

动画,传统的

动画方法,通过顺序的播放排列好的图片来实现,类似电影.

6.

什么是嵌入式实时操作系统,

Android

操作系统属于实时操作系 统吗?

嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并 以足够快

的速度予以处理,其处理的结果又能在规定的时间之内来控 制生产过程或对处理

系统作出快速响应,并控制所有实时任务协调一 致运行的嵌入式操作系统.主要

用于工业控制,军事设备,航空航天等 领域对系统的响应时间有苛刻的要求,

这就需要使用实时系统.又可分 为软实时和硬实时两种,而

Android

是基于

linux

内核的,因此属于软 实时.

7. Handler

机制的原理?

Andriod

提供了

Handler

Looper

来满足线程间的通

Handler

先进先出原则

.Looper

类用来管理特定线程内对象之间的 消息交

(Message Exchange).

1) Looper:

一个线程可以产生一个

Looper

对象,由它来管理此线程里 的

Message Queue(

消息队列).

2) Handler:

你可以构造

Handler

对象来与

Looper

沟通,以便

push

新 消

息到

Message Queue

里;或者接收

Looper

Message Queue

取出) 所送来

的消息.

3) Message Queue

(消息队列):用来存放线程放入的消息.

4)

线程

:UI thread

通常就是

main thread,

Android

启动程序时会替 它建

立一个

Message Queue.

&嵌入式操作系统内存管理有哪几种,各有何特性?页式,段式,段页, 用到了

MMU,

虚拟空间等技术

9.

说说

mvc

模式的原理,它在

android

中的运用

MVC(Model_view_contraller)^^

模型—视图—控制器

MVC

应 用程

序总是由这三个部

分组成

.Event(

事件)导致

Controller

改变

Model

View,

或者同时改 变两者.

只要

Controller

改变了

Models

的数据或者属性,所有依赖 的

View

都会自

动更新.类似的,只要

Controller

改变了

View,View

会 从潜在的

Model

获取数据来刷新自己.

10. Activity

的生命周期,两个

Activity

之间跳转时必然会执行的是那 几个

方法?

onCreate() //

activity

生命周期开始时被调用.

onRestoreInstanceState() //onCreate

完成后被调用,用来恢复

UI

状态.

onRestart() //

activity

从停止状态重新启动时调用.

onStart() //

activity

对用户即将可见的时候调用.

onResume() //

activity

与用户交互的时候,重绘屏幕.

onSaveInstanceState() //activity

即将移出栈顶保留

UI

状态时调 用此

方法.

onPause()//

当系统要启动一个其他的

activity

时调用(其他的

activity

显示之前,这个方法被用来提交那些持久数据的改变.停止动 画.和其他占用

CPU

资源的东西.由于下一个

activity

在这个方法返 回之前不会

resumed,

以实现这个方法时代码执行要尽可能快.

onStop() //

用户不再可见时调用

onDestroy

〃在

activity

被销毁前所调用的最后一个方法,当进程 终止

时会出现这种情况

1.

完整生命周期:即一个

activity

从出现到消失,对应的周期方 法是

onCreate

o nDestroy

2.

可见生命周期:从

onStart(

onStop()

方法,在这个周期中,用 户

可以看见

Activity,

但不一定能够与之交互,这两个方法可以随着状 态的变化被

执行多次.

3.

前景生命周期:从

onResume()

onPause()

方法,在这个周期

中,

Activity

处在其它

Activity

之前,即在

Activity

栈的最顶端,负责与用 户

进行交互,伴随着状态的变化,这两个方法可以被执行多次

11.

两个

Activity

之间跳转时必然会执行的是哪几个方法.

1

.启动一个

Activity

启动一个新的

Activity

需调用

StartActivity(Intent )

函数.参数

Intent

一个

Intent

对象,

若要在两个

Activity

之间进行跳转我们还得借助

Intent

类中另的 外一个函

数.

public Intent setClass(Context packageContext,Classcls )

其返

回值为一个

Intent

对象(即你要跳转到得

Activity

Intent

对象)

2

.从一个

Activity

获取另外一个

Activity

中的数据结果

例如:你在某个

app

中点击了按键跳转到了另外一个

Activity

(此处 我暂称为

Activity)

中,在此

Activity

中你让用户选择联系人列表中 的联系人,而在此

Activity

结束后需要在上层

Activity(

此处我暂称为 父

Activity)

中需显示子

Activity

中返回的联系人名字.

要想做到上述功能,我们需做一下三件事

(a)

在父

Activity

中调用

Start Activity F orResult(Intent ,int );

(b)

在父

Activity

中实现

OnActivityResult(int requestCode, int

resultCode, Intent Date)

参数分析:

requestCode:

此参数传个

Start Activity F orResult

为了 确

定是谁请求的.

resultCode:

此参数是

SetReuslt(Intent Date)

的返回值为

Intent

对象.

Date :Intent

对象返回给调用者.

(c)

在子

Activity

快要退出时调用

SetReuslt(Intent Date)

函数用于 回调

Activity

中的

OnActivityResult(int requestCode, int resultCode, Intent Date)

函数.

12.

横竖屏切换时候

Activity

的生命周期.

1.

不设置

Activity

android:configChanges

时,切屏会重新调用 各

个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2.

设置

Activity

android:configChanges=''orientation

"时,切屏

还是会重新调用各个生命周期,切横.竖屏时只会执行一次

3

设 置

Activity

android: configChanges='' orientation |key boardHidden''

时,切 屏不

会 重新调用各个生命周期,只会执行

onConfigurationChanged

方法

13.

如何将一个

Activity

设置成窗口的样式.

1.

在你的

文件中可以新建一如下的

style:

name="

e

ctivity"

parent= " android: style/ " >

为我们定义的窗口背景,这个不是必须的

name=" android: windowBackground ">@

drawable/float_box

如果窗口要添加窗口背景,可以在

drawable

中新建一个叫

float_

的文件,内容可以如下(自定义):

xmlns:android= "

/apk/res/android

" >

android: right= " 1 Odp " android :bottom= " 1 Odp " />

2

.在

中在你需要显示为窗口的

activity

中添 加如

果属性:

android :theme= "@ style/ctivity

"即可

如果说您觉得新建

float_

文件的方式麻烦或者 只想

Test

—下,那么可以直接添加您对应需要展示为

Dialog style

Activity

android: theme

属 性 值 为

android :theme='' @ android: sty le/''.

14.

如何退出

Activity?

如何安全退出已调用多个

Activity

Application?

对于单一

Activity

的应用来说,退出很简单,直接

finish()

即可.当然,

也可以用

killProcess()

()

方法.

15.

如果后台的

Activity

由于某原因被系统回收了,如何在被系统回收 之前保

存当前状态?

onSaveInstanceState()

当你的程序中某一个

Activity A

在运行时,主动或被动地运行另 一个新

Activity B,

这个时候

A

会执行

onSaveInstaiiceState().B

完成 以后又会来

A,

这个时候就有两种情况:一是

A

被回收,二是

A

没有 被回收,被回收的

A

就要重新调用

onCreate()

方法,不同于直接启动的 是这回

onCreate()

里是带

上了参数

savedlnstanceState

而没被收回 的就直接执行

onResume(),

跳过

onCreate()T.

16.

据?

两个

Activity

之间怎么传递数

邮递员

Intent

17.

怎么让在启动一个

Activity

是就启动一个

service?

IntentService

18.

同一个程序,但不同的

Activity

是否可以放在不同的

Task

任务栈 中?

task

就好像是能包含很多

activity

的栈.默认情况下,一个

activity

启动

另外一个

activity

时,两个

activity

是放在同一个

task

栈 中的,第二个

activity

压入第一个

activity

所在的

task

栈.当用户按下 返回键时,第二个

activity

从栈中弹出,第一个

activity

又在当前屏幕显 示.这样,从用户角度来

看,这两个

activity

就好像是属于同一个应用程 序的,即使第二个

activity

属于另外一个应用程序的.当然,这是指默 认情况下.

task

栈包含的是

activity

的对象.如果一个

activity

有多个 实例在运行,那么栈中保存的是每个实例的实

体.栈中的

activity

不会 重新排列,只有弹出和压入操作.一个

task

中的所有

activity

都以整体 的形式移动.整个

task

可以被移到前台或后台.打个比方,当

前的

task

包含

4

activity-

当前

activity

下面有

3

activity.

当用户按下

HOME

键返回到程序启动器

(application launcher)

后,选择了一个 新的

应用程序(事实上是一个新的

task)

,当前的

task

就被转移到后 台,新的

task

中的根

activity

将被显示在屏幕上.过了一段时间,用户按 返回键回到了程

序启动器界面,选择了之前运行的程序(之前的

task).

那个

task,

仍然包含着

4

activity.

当用户再次按下返回键时,屏幕不 会显示之前留下的那个

activity

(之前的

task

的根

activity)

,而显示 当前

activity

task

栈中移出后栈顶

的那个

activity.

刚刚描述的行 为是默认的

activity

task

的行为.有很多方法

能够改变这种行 为

.activity

task

之间的联系,以及

task

中的

activity

的行

为可以通 过

intent

中的标记以及在

manifest

中的〈

activity>

元素的属性控

制. 其中,主要的

Intent

标记有:

FLAG_ACTIVITY_NEW_TASK

FLAG ACTIVITY CLEAR TOP

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

FLAG_ACTIVITY_SINGLE_TOP

主要的<

activity

>属性有:

taskAffinity launchMode

allowT askReparenting

clearT askOnLaunch alwaysRetainT askState

finishOnT askLaunch

默认情况下,一个应用程序中的所有

activity

都有一个

affinity-

这 让它

们属性同一个

task.

然而,每个

activity

可以通过<玄“

2

呵>中的

taskAffinity

属性设置单独的

affinity.

不同应用程序中的

activity

可以 共享同

一个

affinity,

同一个应用程序中的不同

activity

也可以设置成 不同的

ty

属性决定了:启动

activity

Intent

对象需包 含

FLAG_ACTIVITY_NEW_TASK

标记

‘activity

allowTaskReparenting

被认为是设置成

true.

FLAG_ACTIVITY_NEW_TASK

标记

当传递给

startActivity()

Intent

对象包含

FLAG_ACTIVITY_NEW_TASK

标记时,系统会为需要启动的

activity

寻找与当前

activity

不同的

task.

如果要启动的

activity

affinity

属性与当

前所有的

task

affinity

属性都不相同,系统会新建 一个带那个

affinity

性的

task,

并将要启动的

activity

压到新建的

task

栈中;否则将

activity

压入

那个

affinity

属性相同的栈中.

allowTaskReparenting

属性

如果一个

activity

allowTaskReparenting

属性为

true,

那么它可以 从一个

task(TASKl)

移到另外一个有相同

affinity

task(TASK2)

(TASK2

带到

前台时).

如果一个

.apk

文件从用户角度来看包含了多个“应用程序”,你可能需 要对那

activity

赋不同的

affinity

值.

运行模式

activity

launchMode

属性可以有四种值:

“standard"

(默认)

"singleTop" “singleTask”

u

singlelnstance

u

19

.什么是

Service

以及描述下它的生命周期.

Android Service

是运行在后台的代码,不能与用户交互,可以运行 在自

己的进程,也可以运行在其他应用程序进程的上下文里.需要通过 某一个

Activity

或者其他

Context

对象来调用,

ervice()

rvice().

如果在

Service

执行耗时的操作需要启动 一个新线程

来执行.

Android Service

只继承了

onCreate(),onStart(),onDestroy()

三个 方

法,当我们第一次启动

Service

时,先后调用了

onCreate(),onStart()

这两个

方法,当停止

Service

时,则执行

onDestroy()

方法,这里需要注意 的是,如果

Service

已经启动了,当我们再次启

Service

时,不会在执行

onCreate()

方法,

而是直接执行

onStart()

方法.

启动一个

Service

的过程如下:

ervice() |->onCreate()-

>onStart()->Servicerunning

其中

onCreate()

可以进行 一些服务的初始化

工作

,onStart()

则启动服务.

停止一个

Service

的过程如下:

rvice()

|->onDestroy() ->Service stop

20.

什么是

IntentService?

有何优点?

优点:

Acitivity

的进程,当处理

Intent

的时候,会产生一个对应的

Service

Android

的进程处理器现在会尽可能的不

kill

掉你.非常容易使用 日历中

IntentService

的应用

21.

请描述一下

Intent

Intent Filter.

Intent

Android

中被翻译为“意图",熟语来讲就是目的,他们是 三

种应用程序基本组件一

activity,service

broadcast receiver

之间 互相激活

的手段.在调用

Intent

名称时使用

ComponentName

也就是 类的全名时为显

示调用.例:

setComponent("Activity ") setClass("

Activity ")

setClassName("Activity")

这种方式一般用于应

用程序的内部调用,因为你不一定会知道别人写的类的全名.那我们怎

么调用呢?有显就有隐嘛.我们来看看隐式

Intent

怎么用?

首先我们先配置我们的

Activity

Intent Filter

android:name="_CURRENT" />

>这样在调用的时候指定

Intent

action,

系统就是自动 的去对

比是哪个

intent-filter

符合我们的

Activity,

找到后就会启动

Activity.

一个

intent filter

IntentFilter

类的实例,但是它一般不出现在代码 中,而

是出现在

android Manifest

文件中,以

的形式.(有 一个例外

broadcast receiver

intent filter

是使用

erReceiver()

来动态设定的,其

intent filter

也是在代码 中创

建的.)

一个

filter

action, data, category

等字段.一个隐式

intent

为 了 能被

某个

intent filter

接受,必须通过

3

个测试.一个

intent

为了被某个组 件接

受,则必须通过它所有的

intent filter

中的一个.

22.1ntent

传递数据时,可以传递哪些类型数据?

Intent

传递方式和参数类型:

1. Extra:String[].quence[].Par

celable[].[].[].[].boolean[].short[].Str

[].[].[].

2. Data: URI

23.

请描述一下

Broadcast Receiver.

Broadcast Receiver

用来接收并处理广播.可以接收系统的广播 例如:

电量不足.来电来信等.程序也可以播放广播

.Broadcast Receiver

可以通过多

种方式通知用户:启动

activity.

使用

NotificationManager.

开启背景灯.振动

设备.播放声音等,最典型的是在状态栏显示一个图 标,这样用户就可以点它打

开看通知内容.

通常我们的某个应用或系统本身在某些事件(电池电量不足. 来电来短

信)来临时会广播一个

Intent

出去,我们可以利用注册一个

Broadcast

Receiver

来监听到这些

Intent

并获取

Intent

中的数据.

24.

manifest

和代码中如何注册和使用

BroadcastReceiver.

android:name="_RECEIVED

"/>

25.

请介绍下

Android

的数据存储方式.

Android

中的数据存储方式有以下五种:

1 .SharedPreferences:

用来存储

"key-value paires"

格式的数据,它

是一个轻量级的键值存储机制,只可以存储基本数据类型.

2.

文件存储:通过

FilelnputStream

FileOutputStream

对文件进 行

操作.在

Android

中,文件是一个应用程序私有的,一个应用无法读 写其他应用

程序的文件.

数据库存储:

Android

提供的一个标准数据库,支持

SQL

语句.

4.

网络:通过网络来存储和获得数据.

tProvider:

是所有应用程序之间数据存储和检索的一个 桥梁,

它的作用就是使得各个应用程序之间实现数据共享.它是一个特 殊的存储数据的

类型,它提供了 一套标准的接口用来获取数据.操作数 据.系统也提供了音频.

视频.图像和个人信息等几个常用的

Content Providers.

如果你想公开自己的私

有数据,可以创建自己的

Content Provider

类,或者当你对这些数据拥有控制.

写入的权限时讲这些数据 添加到

Content Provider

中实现共享.外部访问通过

ContentResolver

去访问并操作这些被暴露的数据.组织数据主要包括:存储数

据,读取 数据,以数据库的方式暴露数据.数据的存储需要根据设计的需求,选

择合适的存储结构,首选数据库,当然也可以选择本地其他文件,甚至 可以是

网络上的数据.数据的读取,以数据库的方式暴露数据这就要求, 无论数据是如

何存储的,数据最后必须以数据的方式访问.

26

.请介绍下

Android

中常用的五种布局.

最常用的布局方式为

veLayout.F rameLay ayout AbsoluteL

out.

其中

LinearLayout

RelativeL

out

是最常用的方 式,他们可以

通过在

xml

配置文件或者代码中进行布局.

1. FrameLayout

最简单的布局方式,放置的控件都只能罗列到左上 角,控件

会有重叠,不能进行复杂的布局.

2. LinearLayou

可以通过

orientation

属性设置线性排列的方向是垂 直

(vertical)®

是纵向

(horizontal).

每行或每列只有一个元素,可以 进行复杂

的布局.

3. AbsoluteLayout

可以让子元素指定准确的

x/y

坐标值,并显示在屏 幕

上.

AbsoluteLayout

没有页边框,允许元素之间互相重叠(尽管 不推荐).

他是绝对坐标,所以在实际中不提倡使用.

4. RelativeLayout

允许子元素指定他们相对于其它元素或父元素的 位置(通

ID

指定).因此,你可以以右对齐,或上下,或置于屏幕 中央的形式来排

列两个元素.元素按顺序排列,因此如果第一个元 素在屏幕的中央,那么相对

于这个元素的其它元素将以屏幕中央的 相对位置来排列.这个是相对于

AbsoluteLayout

的,采用的相对 坐标,所以在实际中比较常用.

5. TableLayout

将子元素的位置分配到行或列中.一个

TableL

out

由许多

TableRow

组成,每个

TableRow

都会定义一个

row .TableL

out

容器不会显示

row .column

cell

的边框线.每 个

row

拥有

0

个或多个的

cell

;和

html

中的

table

差不多.在实 际中也经常

使用.有的时候我们也会用到

GridView,

就像我们手 机屏幕上摆放的各个图

标应该就是用

GridView

排版的.

Padding

是文字相对于边框,而

Margin

是边框相对于父窗体.

LinearLayout TableLayout FrameLayout AbsoluteLayout

RelativeLayout

27.

如果后台的

Activity

由于某原因被系统回收了,如何在被系统回

收之前保存当前状态?在”暂停

onPause”

状态将数据保存.

2

&如何判断是否有

SD

卡?

在程序中访问

SDCard,

你需要申请访问

SDCard

的权限.

中加入访问

SDCard

的权限如下:

SDCard

中创建与删除文件权限->

android:name="_UNMOUNT_FILE

SYSTEMS"/

SDCard

写入数据权限->

android:name="_EXTERNAL_STOR

AGE'7>

ernalStorageState().equals(

.MOUNTED)

ernalStorageState()

方法用于获取

SDCard

的状 态,

如果手机装有

SDCard,

并且可以进行读写,那么方法返回的状态等 于

_MOUNTED.

29.

什么是嵌入式实时操作系统,

Android

操作系统属于实时操作系 统吗?

嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并 以足够快

的速度予以处理,其处理的结果又能在规定的时间之内来控 制生产过程或对处理

系统作出快速响应,并控制所有实时任务协调一 致运行的嵌入式操作系统.主要

用于工业控制,军事设备,航空航天等 领域对系统的响应时间有苛刻的要求,

这就需要使用实时系统.又可分 为软实时和硬实时两种,而

Android

是基于

linux

内核的,因此属于软 实时.

30. Linux

中跨进程通信的几种方式.

1.

管道(

pipe )

:管道是一种半双工的通信方式,数据只能单向流动, 而且只

能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父 子进程关系.