Android采访开发——2.通用Android基础笔试题

注意finddreams博客: http://blog.csdn.net/finddreams/article/details/44219231
正值跳槽的热季。整理一下Android面试中最常考的笔试题。为下次找工作时做好充分准备。这是Android的基础部分:

1、Android四大组件是什么?作用以及应用场景?
Android 的四大组件各自是是Activity,Service,BroadcastReceiver和ContentProvider;

Activity:
从字面上理解,Activity是活动的意思。一个Activity通常展现为一个可视化的用户界面。是Android程序与用户交互的窗体,也是Android组件中最基本也是最复杂的一个组件。从视觉效果来看,一个Activity占领当前的窗体,响应全部窗体事件。具备有控件,菜单等界面元素。从内部逻辑来看,Activity须要为了保持各个界面状态,须要做非常多持久化的事情,还须要妥善管理生命周期。和一些转跳逻辑。

Service
服务是运行在后台的一个组件。从某从意义上说,服务就像一个没有界面的Activity。

它们在非常多Android的概念方面比較接近。封装有一个完整的功能逻辑实现,接受上层指令,完毕相关的事件,定义好须要接受的Intent提供同步和异步的接口。

BroadcastReceiver
广播接收者,不运行不论什么任务,广播是一种广泛运用的在应用程序之间传输信息的机制 。而 BroadcastReceiver 是对发送出来的广播进行过滤接收并响应的一类组件。Broadcast Receiver 不包括不论什么用户界面。

然而它们能够启动一个Activity以响应接受到的信息,或者通过NotificationManager通知用户。

能够通过多种方式使用户知道有新的通知产生:闪动背景灯、震动设备、发出声音等等。

通常程序会在状态栏上放置一个持久的图标,用户能够打开这个图标并读取通知信息。

在Android中另一个非常重要的概念就是Intent,假设说Intent是一个对动作和行为的抽象描写叙述,负责组件之间程序之间进行消息传递。那么Broadcast Receiver组件就提供了一种把Intent作为一个消息广播出去,由全部对其感兴趣的程序对其作出反应的机制。

Content Provider
即内容提供者。作为应用程序之间唯一的共享数据的途径,Content Provider 基本的功能就是存储并检索数据以及向其它应用程序提供訪问数据。


相应用而言,也能够将底层数据封装成ContentProvider。这样能够有效的屏蔽底层操作的细节。并且使程序保持良好的扩展性和开放性。

Android提供了一些主要数据类型的Contentprovider,比方音频、视频、图片和私人通讯录等。

可在android.provider包以下找到一些android提供的Contentprovider。

能够获得这些Contentprovider。查询它们包括的数据,当然前提是已获得适当的读取权限。假设我们想公开自己应用程序的数据,能够创建自己的 Content provider 的接口。

2、android中的动画有哪几类,它们的特点和差别是什么?
两种,一种是Tween动画、另一种是Frame动画。Tween动画,这样的实现方式能够使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法。通过顺序的播放排列好的图片来实现,相似电影。

3、后台的activity被系统回收怎么办?怎样在被系统回收之前保存当前状态?

当一个Activity被pause或者stop的时候,这个Activity的对象实际上还是保存在内存中,因此这个Activity中的信息(成员和状态信息)还能够又一次获取到.
假设系统为了整理内存而销毁了Activity对象时,系统没法简单的原封不动地恢复先前的Activity对象及其状态信息.
Activity中提供了一个方法:onSavedInstanceState(Bundle obj).当系统销毁一个Activity时,会将Activity的状态信息已键值对形式存放在bundle对象中.
第一次启动Activity时,这个bundle对象是空的,null.假设Activity被系统销毁了,然后用户要回退回去看的话,系统会调用这个Activity的onCreate方法,并把bundle对象传递过去.

4. 请描写叙述一下Activity 生命周期。


这里写图片描写叙述
5. 怎样将一个Activity设置成窗体的样式。


在AndroidManifest.xml 中定义Activity的地方一句话android:theme=”@android:style/Theme.Dialog”或android:theme=”@android:style/Theme.Translucent”就变成半透明的

6.注冊广播有几种方式,有何优缺点?
有两种,一种是代码动态注冊:
//生成广播处理
smsBroadCastReceiver = new SmsBroadCastReceiver();
//实例化过滤器并设置要过滤的广播

IntentFilter intentFilter = new IntentFilter(“android.provider.Telephony.SMS_RECEIVED”);

//注冊广播
BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver, intentFilter);
一种是在AndroidManifest.xml中配置广播

 <!--广播注冊-->  
        <receiver android:name=".SmsBroadCastReceiver">  
            <intent-filter android:priority="20">  
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>  
            </intent-filter>  
        </receiver>  

两种注冊类型的差别是:
1)第一种不是常驻型广播。也就是说广播尾随程序的生命周期
2)另外一种是常驻型,也就是说当应用程序关闭后,假设有信息广播来,程序也会被系统调用自己主动运行。
注冊的方法有两种。一种是静态注冊,一种是动态注冊。


动态注冊长处: 在 Android 的广播机制中, 动态注冊的优先级是要高于静态注冊优先级的 。 因此在必要的情况下,我们是须要动态注冊广播接收器的。


静态注冊长处:动态注冊广播接收器另一个特点。就是当用来注冊的 Activity 关掉后 ,广播也就失效了。同一时候反映了静态注冊的一个优势,就是无需担忧广播接收器是否被关闭 , 仅仅要设备是开启状态。广播接收器就是打开着的。

7.IntentService有何长处?
普通的service ,默认运行在ui main 主线程
这是带有异步处理的service类,
异步处理的方法 OnHandleIntent()
OnHandleIntent() 处理耗时的操作
Android的进程处理器如今会尽可能的不kill掉你

8.横竖屏切换时候activity的生命周期?
1、不设置Activity的android:configChanges时,切屏会又一次调用各个生命周期,切横屏时会运行一次。切竖屏时会运行两次
  2、设置Activity的android:configChanges=”orientation”时。切屏还是会又一次调用各个生命周期。切横、竖屏时仅仅会运行一次
  3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会又一次调用各个生命周期,仅仅会运行onConfigurationChanged方法
  
9、怎样将SQLite数据库(dictionary.db文件)与apk文件一起公布? 怎样将打开res raw文件夹中的数据库文件?
  解答:以将dictionary.db文件拷贝到res raw文件夹中 。在Android中不能直接打开res raw文件夹中的数据库文件,而须要在程序第一次启动时将该文件拷贝到手机内存或SD卡的某个文件夹中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res raw文件夹中资源的 InputStream对象,然后将该InputStream对象中的数据写入其它的文件夹中相应文件里。在Android SDK中能够使用SQLiteDatabase.openOrCreateDatabase方法来打开随意文件夹中的SQLite ;
  
10.AndroidManifest.xml文件里主要包括哪些信息
说明应用程序的java 包。该包名是应用程序的唯一标识。
描写叙述应用程序的组件:该应用程序由哪些activity,service,broadcast receiver和content provider组成;
声明应用程序所必须具备的权限。用以訪问受保护的部分API,以及与其它应用程序的交互;
声明应用程序所须要的Android API的最低版本号级别。比方1.0,1.1,1.5;
manifest:根节点,描写叙述了 package 中全部的内容。
uses-permission:请求你的 package 正常运作所需赋予的安全许可。
permission: 声明了安全许可来限制哪些程序能你 package 中的组件和功能。
instrumentation:声明了用来測试此 package 或其它 package 指令组件的代码。


application:包括 package 中 application 级别组件声明的根节点。
activity:Activity 是用来与用户交互的主要工具。
receiver:IntentReceiver 能使的 application 获得数据的改变或者发生的操作,即使它当 前不在运行。
service:Service 是能在后台运行随意时间的组件。
provider:ContentProvider 是用来管理持久化数据并公布给其它应用程序使用的组件。

11.Android数据储存方式
一.SharedPreferences方式:它是 Android提供的用来存储一些简单配置信息的一种机制,採用了 XML 格式将数据存储到设备中。仅仅能在同一个包内使用。不能在不同的包之间使用。


二.文件存储方式 /data/data/包名/files 内存里面
/ context.openFileInput(name) 默认是私有的訪问权限
三.SQLite数据库方式:SQLite 是 Android 所带的一个标准的数据库, 它支持 SQL语句,它是一个轻量级的嵌入式数据库。


四.内容提供器(Content provider)方式:主要用于应用程序之间进行数据交换。从而能够让其它的应用保存或读取此 Content Provider 的各种数据类型。
五. 网络存储方式: 通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储 在网络空间中的数据信息。

12.Android中常见五种布局介绍
FrameLayout(帧布局): 从屏幕的左上角開始布局,叠加显示, 实际应用 播放器的暂停button.
LinearLayout (线性布局):可分为垂直布局。水平布局。
AbsoluteLayout(绝对布局):用X,Y坐标来指定元素的位置;
RelativeLayout(相对布局): 相对布局能够理解为某一个元素为參照物,来定位的布局方式。


TableLayout(表格布局):表格布局相似Html里面的Table。每个TableLayout里面有表格行TableRow。TableRow里面能够详细定义每个元素,设定他的对齐方式 android:gravity=”” 。
每个布局都有自己适合的方式,另外,这五个布局元素能够相互嵌套应用,做出美观的界面。

13.Activity的四种启动模式?,activity与task的启动方式有哪些,她们的含义详细说明
standard: 标准模式,一调用 startActivity()方法就会产生一个新的实例。
singleTop: 假设已经有一个实例位于 Activity 栈的顶部时, 就不产生新的实例。 而仅仅是调用Activity 中的 newInstance()方法。

假设不位于栈顶,会产生一个新的实例。


singleTask: 会在一个新的 task 中产生这个实例,以后每次调用都会使用这个,不会去产生 新的实例了。


singleInstance: 这个跟 singleTask 基本上是一样, 仅仅有一个差别: 在这个模式下的 Activity实例所处的 task 中,仅仅能有这个 activity实例,不能有其它的实例。

14.Android 中的长度单位详细解释
假设设置表示长度 、 高度等属性时能够使用 dp 或 sp。但假设设置字体,须要使用 sp。dp 是与密度无关,sp 除了与密度无关外,还与 scale 无关。

假设屏幕密度为160,这时 dp 和 sp 和 px 是一样
的。1dp=1sp=1px,
也就是说,假设使用 dp 和 sp,系统会依据屏幕密度的变化自己主动进行转换
px :表示屏幕实际的象素
in:表示英寸,是屏幕的物理尺寸。

每英寸等于2.54 厘米。

15.android 析 中有哪几种解析 l xml 的类, , , , 官方推荐哪种?以及它们的原 理和差别
DOM 解析
长处:
1.XML 树在内存中完整存储,因此能够直接改动其数据和结构.
2.能够通过该解析器随时訪问 XML 树中的不论什么一个节点.
3.DOM 解析器的 API 在使用上也相对照较简单.
缺点:假设 XML 文档体积比較大时,将文档读入内存是非常消耗系统资源的
Ø SAX 解析
长处:
SAX 对内存的要求比較低,由于它让开发人员自己来决定所要处理的标签.特别是当开发人 员仅仅须要处理文档中所包括的部分数据时,SAX 这样的扩展能力得到了更好的体现.
缺点:
用 SAX 方式进行 XML 解析时,须要顺序运行,所以非常难訪问到同一文档中的不同数据.此外,在基于该方式的解析编码过程也相对复杂
Ø Xmlpull 解析(官方推荐使用)
android SDK 提供了 xmlpull api,xmlpull 和 sax 相似,是基于流(stream)操作文件,然后依据节点事件回调开发人员编写的处理程序.由于是基于流的处理,因此 xmlpull 和 sax 都比較节
约内存资源,不会象 dom 那样要把全部节点以对橡树的形式展如今内存中.xmlpull 比 sax 更 简明,并且不须要扫描完整个流.

16.ListView 的 优化方案
(1),假设自己定义适配器。那么在 getView 方法中要考虑方法传进来的參数 contentView 是否 为 null,假设为 null 就创建 contentView 并返回,假设不为 null 则直接使用。

在这种方法中,尽可能少创建 view。


(2)。给 contentView 设置 tag(setTag()),传入一个 viewHolder 对象,用于缓存要显示的数 据,能够达到图像数据异步载入的效果
(3),假设 listview 须要显示的 item 非常多,就要考虑分页载入。比方一共要显示100条或者很多其它的时候。我们能够考虑先载入20条。等用户拉到列表底部的时候,再去载入接下来的20 条。
(4) 高速滑动时不载入图片
(5) 假设自己定义的item中有图片,须要处理图片(降低图片所占内存)
1.对图片进行边界压缩 2.用option类来保存图片大小 3.避免图片的实时缩放,最好预先缩放到视图大小
(6)尽量避免在listview适配器中使用线程。由于线程是产生内存泄露的主要原因在于线程的生命周期不可控。

17.Android中intent的作用
在一个 Android 应用中,主要是由一些组件组成(Activity,Service,ContentProvider,etc.) 在这些组件之间的通讯中。由 Intent 协助完毕。
Intent 负责相应用中一次操作的动作、动作涉及数据、附加数据
进行描写叙述,Android 则依据此 Intent 的描写叙述。负责找到相应的组件。将 Intent 传递给调用的组件,并完毕组件的调用。

Intent 在这里起着实现调用者与被调用者之间的解耦作用。
有两种方式,一种是显示匹配,一种是隐示匹配。
显示:明白的指定要跳转的Activity,或者Service等。
隐示:隐式匹配。首先要匹配 Intent 的几项值:Action,Category, Data/Type,Component假设填写了 Componet 就是这就形成了显示匹配。


1.假设你填写了 Action, 假设有一个程序的 Manifest.xml 中的某一个 Activity 的 IntentFilter 段中定义了包括了同样的 Action 那么这个 Intent 就与这个目标 Action 匹配, 假设这个 Filter段中未定义 Type,Category,那么这个 Activity 就匹配了。可是假设手机中有两个以上的程序匹配,那么就会弹出一个对话可框来提示说明。
2,data/type,你能够用 Uri 来做为 data,比方 Uri uri = Uri.parse(http://www.google.com );
Intent i = new Intent(Intent.ACTION_VIEW,uri);手机的 Intent 分发过程中,会依据 http://www.google.com 的 scheme 推断出数据类型 type手机的 Brower 则能匹配它,在 Brower 的 Manifest.xml 中的 IntenFilter中首先有ACTION_VIEW Action,也能处理 http:的 type;
3,至于分类 Category。一般不要去在 Intent 中设置它,假设你写 Intent 的接收者,就在Manifest.xml 的 Activity 的 IntentFilter 中包括 android.category.DEFAULT,这样全部不设置Category(Intent.addCategory(String c);)的 Intent 都会与这个 Category 匹配。
4,extras(附加信息) ,是其它全部附加信息的集合。使用 extras 能够为组件提供扩展信息 ,比方,假设要运行“发送电子邮件”这个动作,能够将电子邮件的标题、正文等保存在 extras里,传给电子邮件发送组件。

18.怎样退出 Activity ?怎样安全退出?
对于单一 Activity 的应用来说,退出非常easy,直接 finish()就可以。
当然。也能够用 killProcess()和 System.exit()这样的方法。
为了编程方便,最好定义一个 Activity 基类。处理这些共通问题。
1、记录打开的 Activity:
每打开一个 Activity,就记录下来。在须要退出时,关闭每个 Activity 就可以。


2、发送特定广播:
在须要结束应用时,发送一个特定的广播,每个 Activity 收到广播后。关闭就可以。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

原文地址:https://www.cnblogs.com/mfrbuaa/p/4651012.html