文档库 最新最全的文档下载
当前位置:文档库 › 安卓面试基础知识总结

安卓面试基础知识总结

安卓面试基础知识总结
安卓面试基础知识总结

1Activity

1.1Activity 的概念

是An droid应用层开发的四大组件之一,主要负责和用户交互部分,有自己的生命周期,在其上可以布置按钮,文本框等各种控件,简单来说就是An droid 的UI部分。

1.2Activity 与View 的区别

1)Activity 是四大组件中唯一一个用来和用户进行交互的组件。可以说Activity 就是an droid的视图层。

2)如果再细化,Activity 相当于视图层中的控制层,是用来控制和管理View

的,真正用来显示和处理事件的实际上是View。

3)每个Activity 内部都有一个Window对象,Window对象包含了一个

DecorView(实际上就是FrameLayout),我们通过setContentView 给

Activity 设置显示的View实际上都是加到了DecorView中。

1.3Activity 生命周期

1.3.1生命周期主干

1.3.2其他中转方法

1.4 Activity 启动模式

1.4.1

四种启动模式

sta ndard

默认模式,可以不用写配置。在这个模式下,都会默认 创建一个新的实例。因此,在这种模式下,可以有多个相 同的实例,也允许多个相同 Activity 叠加。

sin gleTop

可以有多个实例,但是不允许多个相同Activity 叠加。 即,如果Activity 在栈顶的时候,启动相同的 Activity , 不会创建新的实例,而会调用其 onNewIntent 方法。

Activity l^urehed

Activity shul down

1.4.2

配置样例

1.5 Activity 启动方法

直接启动Activity 2)在一个 Activity

带请求码启动

Activity

1.6请求码与响应码

1)在一个 Activity 中调用 startActivity() 方法。

,不带请求码。

中调用 startActivityForResult() 方

2BroadcastReceiver

2.1概念

BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。

2.2应用场景

在An droid系统中,广播体现在方方面面:

eg:

1.当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务

的功能;

2.当锁屏或者点亮屏幕时就会产生一条广播,接收这条广播就可以实现一些暂

停或者开启一些耗电进程的功能。

3.当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提

示和保存数据等操作;

4.当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时

告知用户及时保存进度;

2.3注册

2.3.1静态注册

2.3.1.1概念

静态注册是在AndroidManifest.xml 文件中配置的

2.3.2动态注册

2.3.2.1概念

动态注册需要在代码中动态的指定广播地址并注册

2.3.2.2需要注意的事项

RegisterReceiver 是android.content.ContextWrapper 类中的方法,

Activity 和Service都继承了ContextWrapper,所以可以直接调用。在实际应用中,我们在Activity 或Service 中注册了一个BroadcastReceiver ,当这个Activity 或Service 被销毁时如果没有解除注册,系统会报一个异常,提示我们是否忘记解除注册了。所以,需要在特定的地方执行解除注册操作:生命周期的onDestroy() 。

有部分广播接受者,涉及到用户的敏感内容,需要在权限文件中声明。如开机完成的广播,用户电量变化的广播,用户网络状态发生改变的广播

2.3.3 生命周期

1.广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,

onReceive() 方法结束之后销毁

2. 广播接收者中不要做一些耗时的工作,否则会弹出Application NoResponse 错

误对话框

3. 最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后

进程就成为了空进程,很容易被系统杀掉

4. 耗时的较长的工作最好放在服务中完成

3Service

3.1概念

服务是看不到界面的,,就是一个没有界面的Activity, 并且长期在后台运行的一个组件.。

3.2为什么用服务?

进程优先级, 回收时是从5~1, 从低到高

Foreground process 前台进程

Visible process 可视进程

Service process 服务进程

Background process 后台进程

Empty process 空进程

回收的优先级: 先回收空进程, 一个一个回收的, 当内存够用时, 不再回收空进程. 如果空进程回收完毕后, 内存还是不够用时, 继续向上一个一个的回收后台进程. 依次类推.

当系统内存不够用时, 需要回收服务进程时, 当系统内存又够用时, 会重新启动服务. 当用户去手动的把服务关闭时, 服务不会再重启了

3.3作用

由于ANR对Activity 和BroadcastReceiver 响应时间的限制(Activity 对

事件响应不超过5秒,BroadcastReceiver执行不超过10秒),使得在其中都不适

合执行较耗时操作,这样像网络、数据库、复杂计算这类耗时操作的执行就需要一个组件来承担。Service 作为Android 四大组件之一,其功能之一就是耗时操作的执行,主要功能如下:

a.执行需要长时间运行的操作,这个操作不与用户进行交互,如网络下载、

大文件I/O 、复杂计算、监听手机状态。

b.应用内或应用间数据通信,Android 每个应用程序都在自己的dalvik 虚拟机中运行,一个应用是不允许访问其他应用的内存信息的,为此Android 引入了Content Provider 在不同应用间共享数据,BroadcastReceiver 广播信息给不同应用程序,但Content Provider 更多用于数据的共享,BroadcastReceiver 广播

的信息会被所有应用接收较耗费系统资源,对于两个应用间动态的进行交互还需要通过Service 来完成。

3.4启动方式

3.4.1 直接启动

Activity 开启完服务后就不管服务了. Activity 和服务没有关系. startService

开启的服务, 只有stopService 可以关闭

3.4.2 绑定启动

绑定服务, 生命周期方法会执行: onUnbind -> onDestory 服务销毁了.

在activity 中调用service 中的方法.

步骤:

调用bindService 方法绑定服务

1.在Activity 中定义一个连接桥的内部类,会在bindService方法传递给

service.

2.在service 服务中onBind 方法中返回一个IBinder 接口对象.

3.在service类中定义一个IBinder的内部实现类,在onBind方法返回.

4.当onBinder 方法返回完对象后, activity 中连接桥里的

onServiceConnected 会被调用, 其中形参IBinder service 就是service

类中onBind 返回的对象.

5. activity 得到了service 中的内部类对象, 点击按钮是调用内部类中的

forwardBuyTicket 方法, 此方法会转调服务中buyTicket 方法.

3.5生命周期

Service 的生命周期 (适用于2.1 及以上)

1.被startService 的

无论是否有任何活动绑定到该Service ,都在后台运行。

onCreate( 若需要) -> onStart(int id, Bundle args). 多次startService ,则onStart 调用多次,但不会创建多个Service 实例,只需要一次stop 。该Service 一直后台运行,直到stopService 或者自己的stopSelf() 或者资源不足由平台结束。

2.被bindService 的

调用bindService 绑定,连接建立服务一直运行。未被startService 只是BindService ,则onCreate() 执行,onStart(int,Bund ,le) 不被调用;这种情况下绑定被解除,平台就可以清除该Service( 连接销毁后,会导致解除,解除

后就会销毁) 。

3.被启动又被绑定

类似startService 的生命周期,onCreate onStart 都会调用。

4. 停止服务时

stopService 时显式onDestroy() 。或不再有绑定( 没有启动时) 时隐式调用。有bind 情况下stopService() 不起作用。

s tarfio-d by

So- MCW Q

dCiT曰血也0

F

onRe^tndO

onOwBlFOyl)

T

4ContentProvider

4.1Co nten tProvider

数据库在An droid当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据。

不能将数据库设为WORLD_READAB每个数据库都只能创建它的包访问,这意味着只有由创建数据库的进程可访问它。如果需要在进程间传递数据,

则可以使用AIDL/Binder或创建一个ContentProvider,但是不能跨越进程/包边界直接来使用数据库。

一个Content Provider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此Content Provider 的各种数据类型。

也就是说,一个程序可以通过实现一个Content Provider的抽象接口将自己的数据暴露出去。

外界根本看不到,也不用看到这个应用暴露的数据在应用当中是如何存储的,或者是用数据库存储还是用文件存储,还是通过网上获得,这些一切都不重

要,

重要的是外界可以通过这一套标准及统一的接口和程序里的数据打交道,可以读取程序的数据,也可以删除程序的数据,

当然,中间也会涉及一些权限的问题。下边列举一些较常见的接口,这些接口如下所示。

query (Uri uri, Strin g[] projecti on, String select ion, Strin

g[]

相关文档