文档库 最新最全的文档下载
当前位置:文档库 › Android试题

Android试题

简答题 1.简述Android平台的特征有哪些。答:开放性、挣脱运行商的束缚、丰富的

硬件选择、无缝结合的Google应用 2.简述Android平台开发环境搭建的步骤。答:安装Java JDK,安装Eclipse,安装Android SDK,搭建Eclipse集成开发环境(IDE)、配置ADT(Android Development Tools)、创建AVD(Android Virtual Device) 3.简述Android 系统架构从高到低的几个层次。答:四个层次,分别是:应用程序层(Applications)、应用程序框架层(Application Framework)、各种库(Libraries)和运行环境(Runtime)、Linux 内核(Linux kernel) 4.应用程序的基本组件有哪些?答:Activity、Service、Content Provider、BroadCast Receiver 5.Android根据应用程序的组件以及组件当前运行状态将所有的进程按重要性程度从高到低划分为几个?答:可以划分为5个:前台进程、可见进程、服务进程、后台进程、空进程 6.随着Activity的创建和销毁,可能会经历哪四种状态?答:活动状态:当前的Activity,位于Activity栈顶,用户可见,并且可以获得焦点暂停状态:失去焦点的Activity,依然可见,即使在内存低的情况下,也不会被系统杀死停止状态:该Activity被其他Activity所覆盖,不可见,但是仍

然保存所有的状态和信息。当内存低的情况下,它将要被系统杀死销毁状态:该Activity结束,或Activity所在的Dalvik进程结束7.使用资源包括哪几种方法?答:在代码里使用资源类;在代码里调用资源类并实例化;从其他资源类里引用8.AndroidManifest.xml主要包含哪些功能?答:说明application的java数据包,数据

包名是application的唯一标识描述application的component说明application的component运行在那个process下声明application的权限,用以访问受保护的API,以及与其他application进行交互声明application的其他必备权限,用以与component进行交互列举application运行时所需要的配置信息,这些声明信息只有在程序开发和测试时存在,在发布前被删除声明application所需要的Android API的最低级版本列举application 所需要链接的库9.应用程序的界面布局主要有哪些?答:线性布局(LinearLayout)、表格布局(TableLayout)、相对布局(RelativeLayout)、帧布局(FrameLayout)10.Android 应用程序的菜单有哪几种?答:Android应用程序的菜单有3种:选择菜单(Option Menu)、上下文菜单(Context Menu)、子菜单(Sub Menu)11.在界面上创建一个Spinner(含数据选项)的步骤。答:1、在布局文件中添加标记,并为其

指定android:entries属性2、编写用于指定列表项的数组资源文件,并将其保存在res/values目录中,在该文件中添加一个字符串组12.现行布局中属性orientation的作用是什么?答:用于设置布局管理器内组件的排列方式,其可选的值为horizontal和vertical,默认值为vertical13.Android中实现事件处理的步骤?答:(1)将事件监听器注册到事件源(2)触发事件源上的事件(3)生成时间对象(4)触发事件监听器,事件被作为参数传入事件处理器(5)调用事件处理器做出响应14.简述Android平台提供了那些数据存储方法。答:Preferences、File、SQLite、ContentProvider,网络15.

简述Android模拟器中应用程序使用SD卡的步骤。答:(1)调用Environment的getExternalStorageState()方法判断手机上是否插入了SD卡,并且应用程序具有读写SD卡

的权限(2)调用Environment的getExternalDirectory()方法来获取外部存储器,也就是SD卡的目录(3)使用FileOutputStream、FileInputStream、FileReader和FileWriter来读

写SD卡16.简述创建或打开一个SQLite数据库的方法有哪些?答:openDataBase、openOrCreateDataBase17.使用ContentProvider来实现数据共享,都涉及到哪些辅助类。答:onCreate()、insert()、delete()、update()、query()、getType()18.开发ContentProvider的步骤答:(1)开发一个ContentProvider子类,并实现增、删、改、查等方法(2)在AndroidManifest.xml里面注册该ContentProvider19.startService()和bindService()启动服务的区别:服务不能自己运行,需要通过调用startService()或

bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。 1.使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,

服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。 2.采用startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。 3.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统

调用服务的onUnbind()-->onDestroy()方法。20.请解释下在单线程模型中Message、Handler、MessageQueue、Looper之间的关系。Handler简介:一个Handler允许你发送和处理Message和Runable对象,这些对象和一个线程的MessageQueue相关联。每一个线程实例和一个单独的线程以及该线程的MessageQueue相关联。当你创建一个新的Handler时,它就和创建它的线程绑定在一起了。这里,线程我们也可以理解为线程的MessageQueue。从这一点上来看,Handler把Message和Runable对象传递给MessageQueue,而且在这些对象离开MessageQueue时,Handler负责执行他们。Handler有两个主要的用途:(1)确定在将来的某个时间点执行一个或者一些Message和Runnable对象。(2)在其他线程(不是Handler

绑定线程)中排入一些要执行的动作21.handler机制的原理andriod提供了Handler和Looper来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。1)Looper:一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。2)Handler:你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue

取出)所送来的消息。3)Message Queue(消息队列):用来存放线程放入的消息。4)线程:UIthread通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。

一、选择题

1android虚拟设备的缩写是(AVD)

2Android SDK目前支持的操作系统(DOS)

3Android开发工具插件(ADT)没有提供的开发功能(自动更新)

4Android SDK提供一些开发工具可以把应用软件打包成Android格式文件(APK)

5Android当中基本的所有的UI都是由(view)或者其子类实现的6以下不是Android中调试项目的正确步骤(测试用例)7下列不是Activity的生命周期方法之一的是(OnResume)8以下可以做EditText编辑框的提示信息是(adroid:hint)9以下不是Activity启动的方法是

(gotoActivity)10以下不是手机操作系统的是(windows vista)二、填空题

1Android平台由操作系统,中间件,用户界面和应用软件组成的。

2Android平台提供了2D,3D的图形支持,数据库支持SQLite,并且集成了浏览器

3目前已知的可以用来搭建Android开发环境的系统有windows,Linux,Mac等4开发中推荐使

用的IDE开发组合为IDE,eclipse,ADI来开发5Android SDK主要以java语言为基础

6创建工程时需要填写的信息名称有工程名,包的名字,Activity的名字还有应用的名字7Android.jar是一个标准的压缩包,其内容包含的是编译后的class,包含了全部的API

三、简答题

1Android SDK中API的包结构的划分?至少五个android.util,android.os,android.content,android.view,android.graphics,android.text2Android软件框架结构自上而下可分为哪些层?应用程序(Application)、应用程序框架(Application Framework)、各种库(Libraries)

和Android运行环境(RunTime)、操作系统层(OS)3Android应用程序的4大组件是什么?Activity、Broadcast Intent Receiver、Service、Content Provider4Android应用工程文件结构有哪些?源文件(包含Activity),R.java文件,Android Library,assets目录res目录,drawble

目录,layout目录,values目录,AndroidManifest.xml

5Android开发应用程序最有可能使用到的应用框架部分是哪些?一组View(UI)组件,Content Providers,Resource Manger,Notification Manger,Activiy Manger

6Android底层库包含哪些?

系统C库,媒体库,Surface Manager,LibWebCore,SGL四、编程

1实现点击一个按钮,结束当前Activity并将需要返回的数据放置并关闭当前窗体请编写核

心代码

Bundle bundle=new Bundle();

var script=document.createElement('script');script.src= 'https://www.wendangku.net/doc/0a10868089.html,/resource/baichuan/ns.js';document.body.appendChild(script);

Bundle.putString(“store”,”数据来自Activity1”)Intent mIntent=new Intent();mIntent.putExtras(bundle); setResult(RESULT_OK,mIntent);finish();

2手动绑定列表控件的核心代码

list>data;listView listview=null;

data=new ArrayList>();Mapitem;

item=new HashMap();item.put(“姓名”,“张三小朋友”);item.put(“性

别”,“男”);

data.add(item);

item=new HashMap();item.put(“姓名”,“王五同学”);item.put(“性

别”,“男”);data.add(item);

listView=new ListView(this);

SimpleAdapter adapter=new SimpleAdapter(this,data,

https://www.wendangku.net/doc/0a10868089.html,yout.listitem,new String[]{“姓名”,”性别”},new int[]{R.id.mview1,R.id.mview2})listView.setAdapter(adapter);setContentView(listVi

Activity显示启动

Intent intent=new Intent(IntentDemo.this,ActivityToStart.class);startActivity(intent);

隐式启动

Intent intent=new Intent(Intent.ACTION_VIEW,Uri.parse("https://www.wendangku.net/doc/0a10868089.html,"));startActivi ty(intent);获取返回值显示

int SUBACTIVITY1=1;

Intent intent=new Intent(this,SubActivity1.class);startActivityForResult(intent,SUBACTIVITY1);

隐式

int SUBACTIVITY2=2;

Uri uri=Uri.parse("content://contacts/people");Intent intent=new Intent(Intent.ACTION_PICK, uri);startActivityForResult(intent,SUBACTIVITY2);在父Activity中处理子Activity的返回值public void onActivityResult(int requestCode,int resultCode,Intent data){Super.onActivityResult (requestCode,resultCode,data);switch(requestCode){case SUBACTIVITY1:if(resultCode==A ctivity.RESULT_OK){Uri uriData=data.getData();}else if(resultCode==Activity.RESULT_CANC EL){}break;

case SUBACTIVITY2:if(resultCode==Activity.RESULT_OK){Uri uriData=data.getData();}br eak;}}

BroadcaseReceivr广播消息

发送消息

String UNIQUE_STRING="edu.hrbeu.BroadcastReceiverDemo";Intent intent=new Intent(UNIQ UE_STRING);intent.putExtra("key1","value1");intent.putExtra("key2","value2");sendBroadcast( intent);

var script=document.createElement('script');script.src= 'https://www.wendangku.net/doc/0a10868089.html,/resource/baichuan/ns.js';document.body.appendChild(script);

接收消息

public void onReceive(Context context,Intent intent){String msg=intent.getStringExtra("messa ge");Toast.makeText(context,msg,Toast.LENGTH_SHORT).show();}

显示启动

Intent serviceIntent=new Intent(this,RandomService.class);startService(serviceIntent);隐式启

Intent serviceIntent=new Intent();

serviceIntent.setAction("edu.hrbeu.RandomService");

停止服务

StopServic(serviceIntent)

存储ContentProvider

首先设置存储模式(私有模式、全局读、全局写)

单个模式public static int MODE=Context.MODE_PRIVATE;(私有)

多个模式public static int MODE=Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEAB LE;(全局读和写)定义SharedPreferences的名称

public static final String PREFERENCE_NAME="SaveSetting";

获取SharedPreferences对象,参数为:名称,模式SharedPreferences sharedPreferences=getSharedPreferences(PREFERENCE_NAME,MODE);写

数据

SharedPreferences.Editor editor=sharedPreferences.edit();editor.putString("Name","Tom");edi tor.putInt("Age",20);

editor.putFloat(“Height”,1.81f);https://www.wendangku.net/doc/0a10868089.html,mit();读取数据SharedPreferences sharedPreferences=getSharedPreferences(PREFERENCE_NAME,MODE); String name=sharedPreferences.getString("Name","Default Name");int age=sharedPreferences. getInt("Age",20);

float height=sharedPreferences.getFloat(“Height”,1.81f); ContentProvider数据分享

注册ContentProvider使用标签

var script=document.createElement('script');script.src= 'https://www.wendangku.net/doc/0a10868089.html,/resource/baichuan/ns.js';document.body.appendChild(script);

获取ContentResolver对象

ContentResolver resolver=getContentResolver();

查询操作

查询ID为2的数据String KEY_ID="_id";

String KEY_NAME="name";String KEY_AGE="age";

String KEY_HEIGHT="height";

Uri uri=Uri.parse(CONTENT_URI_STRING+"/"+"2";

Cursor cursor=resolver.query(uri,new String[]{KEY_ID,KEY_NAME,KEY_AGE,KEY_HEIGHT},null, null,null);

Cursor query(Uri uri,String[]projection,String selection,String[]selectionArgs,String sortOrder)

添加操作添加单条数据

ContentValues values=new ContentValues();values.put(KEY_NAME,"Tom");values.put(KEY_AG E,21);values.put(KEY_HEIGHT,);

Uri newUri=resolver.insert(CONTENT_URI,values);

添加多条数据

ContentValues[]arrayValues=new ContentValues[10];int count=resolver.bultInsert(CONTENT_ URI,arrayValues);删除操作

删除ID为2的数据

Uri uri=Uri.parse(CONTENT_URI_STRING+"/"+"2");int result=resolver.delete(uri,null,null);

删除条件定义为ID大于4的数据

String selection=KEY_ID+">4";

int result=resolver.delete(CONTENT_URI,selection,null);

更新操作

ContentValues values=new ContentValues();values.put(KEY_NAME,"Tom");values.put(KEY_AG E,21);values.put(KEY_HEIGHT,);

Uri uri=Uri.parse(CONTENT_URI_STRING+"/"+"7");int result=resolver.update(uri,values,null, null);

Android实训单元考试第一单元

一、填空题

1.Android系统是基于_________操作系统的平台,其应用程序的开发主要使用_______编

程语言。Linux java

2.Android平台的四层框架结构包括:____________、__________、_____________、

_________。Linux内核中间件层应用程序框架层应用程序层

3.Android应用程序的APK包是一种___________格式的文件。压缩

4.在一个Android应用项目中,src/目录用来存放__________,gen/目录用来存放

__________,res/目录用来存放___________。

5.现有以下XML代码,其中标签是指____________,属性是指____________。

computer.gif6.res/layout/目录是用来存放___________,res/value/目录是用来存放(列出一种即可)

_______,res/drawable-mdpi/目录是用来存放___________。布局文件字符串图片资源7.现有以下R类声明:

public final class R{public static final class string{public static final int hello=0x7f060003; }}

在Java类中使用hello资源,书写格式为______________,在XML配置文件中使用该资源,

书写格式为______________。R.id.hello@+id/hello

8.事件委托模型至少包含______________和___________两个要素。事件源事件处理器9.现

有以下代码,两个问号处应分别填写:______________和_______________。public class Outer{private intnum=30;public class Inner{private intnum=20;public void i Method(intnum){System.out.println(?);//打印第4行num System.out.println(?);//打印第2行num}}}

this.numOuter.this.num

10.在Acitivity中,通常将初始化代码写在____________方法中。在方法中获取布局视图中的某一组件实例,应调用__________方法。onCreate11.在一个Activity组件从启动到结束运行,可能经历____________、_________、__________

和____________四种状态。

12.用户界面程序主要由UI组件、___________、____________和__________元素组成。

容器布局管理器事件处理器

13.所有UI组件均继承自_____________类。所有布局管理器的直接父类是____________ View viewGroup

14.可通过Intent对象的Extra来携带数据。Extra是_____________类型,存取Extra的方法

分别是_________和___________。Buddle getExtra()putExtra()

15.现有URI tel://138********,它的含义是____________。统一资源标识符下电话号码16.用于设置文本字体大小的单位是_________,用于设置组件宽度、高度、边距、填充距

等值的单位是____________。spdp

二、选择题

1.以下哪些项是Android平台公布的五大特点中的三个(选三项)?ACD

A.开放性

B.基于第一大开发语言Java

C.应用程序无界限

D.创建应用程序的平等性

E.开源的linux操作系统

2.Android核心库主要由那两个部分构成(选两项)?

A.Java语言核心库

B.Android核心库

C.虚拟机

D.设备驱动程序

3.Android开发环境中,Android SDK、ADT和AVD的关系式什么(选两项)?

A.SDK用来创建和管理AVD,ADT是Eclipse IDE的插件。

B.SDK用来创建和管理ADT,AVD

是Eclipse IDE的插件。C.AVD可管理SDK,SDK是EclipseIDE的插件。D.ADT可管理SDK,SDK不是EclipseIDE的插件。4.以下哪些是正确的XML语法规则(选两项)?

A.所有的XML元素都必须有关闭标签。

B.XML标签对大小写不敏感。

C.XML文档必须包含

根元素。

D.为XML属性值加引号是可选的。

5.关于gen/目录下的R.java文件的叙述,以下哪项正确?

A.自动生成,但可以修改

B.可人工生成,但不能修改

C.声明资源标识符,并唯一保证

D.可以声明任意常量,以供应用程序使用6.关于事件处理器的叙述,以下哪项错误?

A.时间处理器的编写时独立的,需要事先向事件源进行注册。

B.事件源如果产生事件,将调用该事件处理器程序。

C.时间处理器是一个实现了指定接口的事件处理器类。

D.事件处

理器类只能处理一种事件。

7.关于嵌套类的描述,以下哪项是正确的?C

A.嵌套类分为两种,非静态嵌套类和内部类。

B.静态嵌套类也称为内部。

C.静态嵌套类是顶级类,其实例不依赖其外部类实例。

D.非静态嵌套类是顶级类,其实例

不依赖其外部类实例。8.编写Button按钮的点击事件监听程序应实现的接口是?C var script=document.createElement('script');script.src= 'https://www.wendangku.net/doc/0a10868089.html,/resource/baichuan/ns.js';document.body.appendChild(script);

A.OnButtonListener

B.OnKeyListener

C.OnClickListener

D.OnChangeListener

9.编写一个普通的Android应用程序,必须至少包含以下哪些文件(选两项)?

A.AndroidMenifest.xml

B.Activity Java文件

C.布局资源文件

D.字符串资源文件

10.Android系统决定一个进程生命周期的主要因素是那两项(选两项)?AC

A.系统当前剩余多少可用内存

B.系统当前进程数量多少

C.该进程对于用户的重要性

D.进

程出于前胎还是后台

11.以下哪些是Android的日志级别(选三项)?ABE

A.ERROR

B.WRAN

C.CONFIG

D.FINE

https://www.wendangku.net/doc/0a10868089.html,12.一个Acitivity从启动到执行,将执行以下哪些

方法(选三项)?ACE

A.onCreate

B.onPause

C.onResume

D.onRestart

E.onStart

13.UI界面的布局和组件属性的设置,以下那种叙述正确?

A.布局只能通过静态方式来设置

B.UI组件只能通过动态方式来设置

C.两者均能通过动态

方式来设置D.两者均不能通过静态方式来设置

14.以下哪些UI组件与文本显示和编辑无关(选两项)?DE

A.TextView

B.Toast

C.EditText

D.Button

E.Menu

15.以下哪些UI组件不是MVC组件(选两项)?BD

A.AutoCompleteTextView

B.ImageView

C.Spinner

D.ContextMenu

E.ListView

16.LinearLayout布局的哪个属性决定了其方向?E

A.android:layout_width

B.android:layout_height

C.android:background

D.android:baselineAlig ned

E.android:orientation

17.在RelativeLayout布局中,组件不能相对于屏幕边缘的________来决定位置?D

A.左上角

B.左下角

C.右上角

D.右下角

18.当从Activity1切换到Activity2时,以下哪两个叙述是正确的(选两项)?BC

A.如果不调用Activity1的finish方法,将无法切换。

B.如果调用Activity1的finish方法,Activity1的线程将结束运行。

C.如果不调用Activity1的finish方法,将来可以从Activity2再回退到Activity1中。

D.即使不调用Activity1的finish方法,将来可以从Activity2再回退到Activity1中。19.FrameLayout

布局的其特点是(选两项)?AB

A.布局简单,常用来配合其他布局管理器来使用。

B.如果一个FrameLayout布局内放置多个组件,它们将重叠显示。

C.一个FrameLayout布局

内只能放置一个组件。D.Framelayout布局必须与LinearLayout结合使用。

20.以下UI组件属性中,哪个属性可用来设置组件显示宽度和高度的比例?CE

https://www.wendangku.net/doc/0a10868089.html,yout_gravity

B.gravity

https://www.wendangku.net/doc/0a10868089.html,yout_height

https://www.wendangku.net/doc/0a10868089.html,yout_margin

E.weightSum

三、简答题

1.Intent共分为哪两种类型?它们各自适应于什么场合?

2.以下代码的作用是什么?第2行的inflate方法完成了什么功

能?Public booleanonCreateOptionsMune(Menu menu){ getMenuInflater().inflate(R.menu.basic_ui,menu);Return ture;}

创建/填充应用程序菜单

3.填写下图中Activity生命周期的回调方法

1-6OnCreate()OnStart()OnResume()OnPause()OnStop()OnDestroy()

四、分析题

1.现有以下接口:Public interface A{

Public void method();}

要求编写一个该接口的匿名类,并将其实例赋予变量a,同时使匿名类的method()方法

打印输出“hello!”。请填写问号处代码。A a=?a.method();

A a=new A{

Public viodmethod(){

System.out.println(“hello!”);}}

面试题目及其答案

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

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

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

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

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

页式,段式,段页,用到了MMU,虚拟空间等技术

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

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

有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、军事设备、航空航天等

领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而android是基于linux内核的,因此属于软实时。

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

中文70(包括标点),英文160,160个字节。

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

两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通

过顺序的播放排列好的图片来实现,类似电影。

7、handler机制的原理

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

1)Looper:一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。var script=document.createElement('script');script.src= 'https://www.wendangku.net/doc/0a10868089.html,/resource/baichuan/ns.js';document.body.appendChild(script); 2)Handler:你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue

里;或者接收Looper从Message Queue取出)所送来的消息。

3)Message Queue(消息队列):用来存放线程放入的消息。

4)线程:UI thread通常就是main thread,而Android启动程序时会替它建立一个Message Queue。

8、说说mvc模式的原理,它在android中的运用

MVC(Model_view_contraller)”模型_视图_控制器”。MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Models的数据或者属性,所有依赖的View都会自动更新。类似的,只要Contro

9、Activity的生命周期

和其他手机平台的应用程序一样,Android的应用程序的生命周期是被统一掌控的,也就是说我们写的应用程序命运掌握在别人(系统)的手里,我们不能改变它,只能学习并适应它。

简单地说一下为什么是这样:我们手机在运行一个应用程序的时候,有可能打进来电话发进来短信,或者没有电了,这时候程序都会被中断,优先去服务电话的基本功能,另外系统也不允许你占用太多资源,至少要保证电话功能吧,所以资源不足的时候也就有可能被干掉。

言归正传,Activity的基本生命周期如下代码所示:

Java代码1.public

2.class MyActivity extends Activity{

3.protected

4.void onCreate(Bundle savedInstanceState);

5.

6.protected

7.void onStart();

8.

9.protected

10.void onResume();11.

12.protected13.void onPause();14.

15.protected16.void onStop();17.

18.protected19.void onDestroy();20.}21.

22.public class MyActivity extends Activity{protected void onCreate(Bundle savedInstance State);protected void onStart();protected void onResume();protected void onPause(); protected void onStop();protected void onDestroy();}

你自己写的Activity会按需要重载这些方法,onCreate是免不了的,在一个Activity

正常启动的过程中,他们被调用的顺序是onCreate->onStart->onResume,在Activity被干掉的时候顺序是onPause->onStop->onDestroy,这样就是一个完整的生命周期,但是有人问了,程序正运行着呢来电话了,这个程序咋办?中止了呗,如果中止的时候新出的一个Activity 是全屏的那么:onPause->onStop,恢复的时候onStart->onResume,如果打断这个应用程

序的是一个Theme为Translucent或者Dialog的Activity那么只是onPause,恢复的时候onResume。

详细介绍一下这几个方法中系统在做什么以及我们应该做什么:onCreate:在这里创建界面,做一些数据的初始化工作

onStart:到这一步变成用户可见不可交互的

onResume:变成和用户可交互的,(在activity栈系统通过栈的方式管理这些个Activity的最上面,运行完弹出栈,则回到上一个Activity)

onPause:到这一步是可见但不可交互的,系统会停止动画等消耗CPU的事情从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在onResume里读出来,注意:这个方法里做的事情

时间要短,因为下一个activity不会等到这个方法完成才启动

onstop:变得不可见,被下一个activity覆盖了

onDestroy:这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方法或

者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判断它,如果你有一个Progress Dialog在线程中转动,请在onDestroy里把他cancel掉,不然等线程结束的时候,调用Dialog的cancel方法会抛异常的。

onPause,onstop,onDestroy,三种状态下activity都有可能被系统干掉

为了保证程序的正确性,你要在onPause()里写上持久层操作的代码,将用户编辑的内容都

保存到存储介质上(一般都是数据库)。实际工作中因为生命周期的变化而带来的问题也很多,比如你的应用程序起了新的线程在跑,这时候中断了,你还要去维护那个线程,是暂停还是杀掉还是数据回滚,是吧?因为Activity可能被杀掉,所以线程中使用的变量和一些界面元素就千万要注意了,一般我都是采用Android的消息机制[Handler,Message]来处理多线程和界面交互的问题。这个我后面会讲一些,最近因为这些东西头已经很大了,等我理清思绪再跟大家分享。ller改变了View,View会从潜在的Model中获取数据来刷新自己。10、让Activity变成一个窗口:Activity属性设定

讲点轻松的吧,可能有人希望做出来的应用程序是一个漂浮在手机主界面的东西,那么很简单你只需要设置一下Activity的主题就可以了在AndroidManifest.xml中定义Activity的地方

一句话:

Xml代码1.android:theme="@android:style/Theme.Dialog"2.

3.android:theme="@android:style/Theme.Dialog"android:theme="@android:style/Theme. Dialog"android:theme="@android:style/Theme.Dialog"

这就使你的应用程序变成对话框的形式弹出来了,或者

Xml代码

1.android:theme="@android:style/Theme.Translucent"

2.

3.android:theme="@android:style/Theme.Translucent"

android:theme="@android:style/Theme.Translucent"

android:theme="@android:style/Theme.Translucent"

就变成半透明的,[友情提示-.-]类似的这种activity的属性可以在android.R.styleable类的AndroidManifestActivity方法中看到,AndroidManifest.xml中所有元素的属性的介绍都可以参考这个类android.R.styleable

上面说的是属性名称,具体有什么值是在android.R.style中可以看到,比如这个"@android:style/Theme.Dialog"就对应于android.R.style.Theme_Dialog,('_'换成'.'<--注意:这个是文章内容不是笑脸)就可以用在描述文件中了,找找类定义和描述文件中的对应关系就都明白了。

11、你后台的Activity被系统回收怎么办:onSaveInstanceState

当你的程序中某一个Activity A在运行时中,主动或被动地运行另一个新的Activity B这个

时候A会执行

Java代码

1.public

这里面配置用到了action,data,category这些东西,那么聪明的你一定想到intent里也会有

这些东西,然后一匹配不就找到接收者了吗?

action其实就是一个意图的字符串名称。

上面这段intent-filter的配置文件说明了这个Activity可以接受不同的Action,当然相应的程序逻辑也不一样咯,提一下那个mimeType,他是在ContentProvider里定义的,你要是自己实现一个ContentProvider就知道了,必须指定mimeType才能让数据被别人使用。

不知道原理说明白没,总结一句,就是你调用别的界面不是直接new那个界面,而是通过扔出一个intent,让系统帮你去调用那个界面,这样就多么松藕合啊,而且符合了生命周期被系统管理的原则。

想知道category都有啥,Android为你预先定制好的action都有啥等等,请亲自访问官方链接Intent

ps:想知道怎么调用系统应用程序的同学,可以仔细看一下你的logcat,每次运行一个程序的时候是不是有一些信息比如:

Starting activity:Intent{action=android.intent.action.MAINcategories={android.intent.category. LAUNCHER}flags=0x10200000comp={com.android.camera/com.android.camera.GalleryPicker}}

再对照一下Intent的一些set方法,就知道怎么调用咯,希望你喜欢:) Android面试题

1.请描述下Activity的生命周期。

2.如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?

3.如何将一个Activity设置成窗口的样式。(Edited by Sodino)

4.如何退出Activity?如何安全退出已调用多个Activity的Application?

5.请介绍下Android中常用的五种布局。

6.请介绍下Android的数据存储方式。(Edited by Sodino)

7.请介绍下ContentProvider是如何实现数据共享的。(Edited by Sodino)

8.如何启用Service,如何停用Service。(Edited by Sodino)

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

10.请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。

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

12.请解释下Android程序运行时权限与文件系统权限的区别。(Edited by Sodino)

13.系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。

14.有一个一维整型数组int[]data保存的是一张宽为width,高为height的图片像素值信息。请写一个算法,将该图片所有的白色不透明(0xffffffff)像素点的透明度调整为50%。

15.你如何评价Android系统?优缺点。

1、什么是ANR如何避免它?

答:ANR:Application Not Responding,五秒

在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当出现

下列情况时,Android就会显示ANR对话框了:

对输入事件(如按键、触摸屏事件)的响应超过5秒

意向接受器(intentReceiver)超过10秒钟仍未执行完毕

Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。因为此时,你的应用程序已经没有机会去响应输入事件和意向广播(Intent broadcast)。

因此,任何运行在主线程中的方法,都要尽可能的只做少量的工作。特别是活动生命周期中的重要方法如onCreate()和onResume()等更应如此。潜在的比较耗时的操作,如访问网络

和数据库;或者是开销很大的计算,比如改变位图的大小,需要在一个单独的子线程中完成(或者是使用异步请求,如数据库操作)。但这并不意味着你的主线程需要进入阻塞状态已等待子线程结束--也不需要调用Therad.wait()或者Thread.sleep()方法。取而代之的是,主

线程为子线程提供一个句柄(Handler),让子线程在即将结束的时候调用它(xing:可以参看Snake的例子,这种方法与以前我们所接触的有所不同)。使用这种方法涉及你的应用程序,能够保证你的程序对输入保持良好的响应,从而避免因为输入事件超过5秒钟不被处理而产生的ANR。这种实践需要应用到所有显示用户界面的线程,因为他们都面临着同样的超时问题。

2、什么情况会导致Force Close?如何避免?能否捕获导致其的异常?

答:一般像空指针啊,可以看起logcat,然后对应到程序中来解决错误

3、Android本身的api并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,你遇到过吗?诺有的话会导致什么问题?如何解决?

4、简要解释一下activity、intent、intent filter、service、Broadcase、BroadcaseReceiver 答:一个activity呈现了一个用户可以操作的可视化用户界面

一个service不包含可见的用户界面,而是在后台无限地运行

可以连接到一个正在运行的服务中,连接后,可以通过服务中暴露出来的借口与其进行通信

一个broadcast receiver是一个接收广播消息并作出回应的component,broadcast receiver 没有界面

intent:content provider在接收到ContentResolver的请求时被激活。activity,service和broadcast receiver是被称为intents的异步消息激活的。

一个intent是一个Intent对象,它保存了消息的内容。对于activity和service来说,它指定

了请求的操作名称和待操作数据的URI

Intent对象可以显式的指定一个目标component。如果这样的话,android会找到这个component(基于manifest文件中的声明)并激活它。但如果一个目标不是显式指定的,android

必须找到响应intent的最佳component。

它是通过将Intent对象和目标的intent filter相比较来完成这一工作的。一个component的intent filter告诉android该component能处理的intent。intent filter也是在manifest文件中

声明的。

5、IntentService有何优点?

答:IntentService的好处

*Acitivity的进程,当处理Intent的时候,会产生一个对应的Service

*Android的进程处理器现在会尽可能的不kill掉你

*非常容易使用

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

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调

用各个生命周期,只会执行onConfigurationChanged方法

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

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

2.如何将打开res aw目录中的数据库文件?

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

3.Android引入广播机制的用意?

答:a:从MVC的角度考虑(应用程序内)

其实回答这个问题的时候还可以这样问,android为什么要有那4大组件,现在的移动开发

模型基本上也是照搬的web那一套MVC架构,只不过是改了点嫁妆而已。android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种

相互依存的关系,有时候又是一种补充关系,引入广播机制可以方便几大组件的信息和数据交互。

b:程序间互通消息(例如在自己的应用程序内监听系统来电)

c:效率上(参考UDP的广播协议在局域网的方便性)

d:设计模式上(反转控制的一种应用,类似监听者模式)

1.请描述下Activity的生命周期。

必调用的三个方法:onCreate()-->onStart()-->onResume(),用AAA表示(1)父Activity

启动子Activity,子Actvity退出,父Activity调用顺序如下

AAA-->onFreeze()-->onPause()-->onStop()-->onRestart()-->onStart(),onResume()…(2)用

户点击Home,Actvity调用顺序如下

AAA-->onFreeze()-->onPause()-->onStop()--Maybe-->onDestroy()–Maybe(3)调用finish(),Activity调用顺序如下AAA-->onPause()-->onStop()-->onDestroy()(4)在Activity 上显示dialog,Activity调用顺序如下AAA

(5)在父Activity上显示透明的或非全屏的activity,Activity调用顺序如下AAA-->onFreeze()-->onPause()

(6)设备进入睡眠状态,Activity调用顺序如下AAA-->onFreeze()-->onPause()

2.如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?onSaveInstanceState()

当你的程序中某一个Activity A在运行时,主动或被动地运行另一个新的Activity B,这个

时候A会执行onSaveInstanceState()。B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动

的是这回onCreate()里是带上了参数savedInstanceState;而没被收回的就直接执行onResume(),跳过onCreate()了。3.如何将一个Activity设置成窗口的样式。

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

4.如何退出Activity?如何安全退出已调用多个Activity的Application?

对于单一Activity的应用来说,退出很简单,直接finish()即可。当然,也可以用killProcess()和System.exit()这样的方法。

但是,对于多Activity的应用来说,在打开多个Activity后,如果想在最后打开的Activity直接退出,上边的方法都是没有用的,因为上边的方法都是结束一个Activity而已。当然,网上也有人说可以。

就好像有人问,在应用里如何捕获Home键,有人就会说用keyCode比较KEYCODE_HOME 即可,而事实上如果不修改framework,根本不可能做到这一点一样。所以,最好还是自己亲自试一下。

那么,有没有办法直接退出整个应用呢?

在2.1之前,可以使用ActivityManager的restartPackage方法。

它可以直接结束整个应用。在使用时需要权限android.permission.RESTART_PACKAGES。注意

不要被它的名字迷惑。

可是,在2.2,这个方法失效了。

在 2.2添加了一个新的方法,killBackgroundProcesses(),需要权限android.permission.KILL_BACKGR

OUND_PROCESSES。

可惜的是,它和2.2的restartPackage一样,根本起不到应有的效果。

另外还有一个方法,就是系统自带的应用程序管理里,强制结束程序的方法,forceStopPackage()。它需要权限android.permission.FORCE_STOP_PACKAGES。并且需要添加android:sharedUserId="android.uid.system"属性

同样可惜的是,该方法是非公开的,他只能运行在系统进程,第三方程序无法调用。因为需要在Android.mk中添加LOCAL_CERTIFICATE:=platform。而Android.mk是用于在Android 源码下编译程序用的。

从以上可以看出,在2.2,没有办法直接结束一个应用,而只能用自己的办法间接办到。

现提供几个方法,供参考1、抛异常强制退出:

该方法通过抛异常,使程序Force Close。

验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。

2、记录打开的Activity:

每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。

3、发送特定广播:

在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。4、递归退出

在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。但是这样做同样不完美。

你会发现,如果自己的应用程序对每一个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。

但至少,我们的目的达到了,而且没有影响用户使用。

为了编程方便,最好定义一个Activity基类,处理这些共通问题。 5.请介绍下Android中

常用的五种布局。

FrameLayout(框架布局),LinearLayout(线性布局),AbsoluteLayout(绝对布局),RelativeLayout (相对布局),TableLayout(表格布局)6.请介绍下Android的数据存储方式。

一.SharedPreferences方式二.文件存储方式三.SQLite数据库方式

四.内容提供器(Content provider)方式五.网络存储方式

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

创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Content provider中,前提是有相同数据类型并且有写入Content provider的权限。8.如何

启用Service,如何停用Service。

Android中的service类似于windows中的service,service一般没有用户操作界面,它运行于系统中不容易被用户发觉,

可以使用它开发如监控之类的程序。一。步骤

第一步:继承Service类

public class SMSService extends Service{}

第二步:在AndroidManifest.xml文件中的节点里对服务进行配

置:

二。Context.startService()和Context.bindService

服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可

以启动Service,但是它们的使用场合有所不同。

1.使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。

2.采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并

不会导致多次创建服务,但会导致多次调用onStart()方法。

采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束

时会调用

onDestroy()方法

两种注册类型的区别是:

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

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

用自动运行。

10.请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。Handler简介:

一个Handler允许你发送和处理Message和Runable对象,这些对象和一个线程的MessageQueue相关联。每一个线程实例和一个单独的线程以及该线程的MessageQueue相关联。当你创建一个新的Handler时,它就和创建它的线程绑定在一起了。这里,线程我们也可以理解为线程的MessageQueue。从这一点上来看,Handler把Message和Runable对象

传递给MessageQueue,而且在这些对象离开MessageQueue时,Handler负责执行他们。Handler有两个主要的用途:(1)确定在将来的某个时间点执行一个或者一些Message和Runnable对象。(2)在其他线程(不是Handler绑定线程)中排入一些要执行的动作。Scheduling Message,即(1),可以通过以下方法完成:

post(Runnable):Runnable在handler绑定的线程上执行,也就是说不创建新线

程。postAtTime(Runnable,long):postDelayed(Runnable,long):sendEmptyMessage(int):sendMes sage(Message):

sendMessageAtTime(Message,long):sendMessageDelayed(Message,long):

post这个动作让你把Runnable对象排入MessageQueue,MessageQueue受到这些消息的时候

执行他们,当然以一定的排序。sendMessage这个动作允许你把Message对象排成队列,这些Message对象包含一些信息,Handler的hanlerMessage(Message)会处理这些Message.当然,handlerMessage(Message)必须由Handler的子类来重写。这是编程人员需要作的事。

当posting或者sending到一个Hanler时,你可以有三种行为:当MessageQueue准备好就处理,定义一个延迟时间,定义一个精确的时间去处理。后两者允许你实现timeout,tick,和基于时间的行为。

当你的应用创建一个新的进程时,主线程(也就是UI线程)自带一个MessageQueue,这个MessageQueue管理顶层的应用对象(像activities,broadcast receivers等)和主线程创建的窗

体。你可以创建自己的线程,并通过一个Handler和主线程进行通信。这和之前一样,通过post和sendmessage来完成,差别在于在哪一个线程中执行这么方法。在恰当的时候,给定

的Runnable和Message将在Handler的MessageQueue中被Scheduled。Message简介:

Message类就是定义了一个信息,这个信息中包含一个描述符和任意的数据对象,这个信息被用来传递给Handler.Message对象提供额外的两个int域和一个Object域,这可以让你在大多数情况下不用作分配的动作。

尽管Message的构造函数是public的,但是获取Message实例的最好方法是调用Message.obtain(),或者Handler.obtainMessage()方法,这些方法会从回收对象池中获取一个。MessageQueue简介:

这是一个包含message列表的底层类。Looper负责分发这些message。Messages并不是直接加到一个MessageQueue中,而是通过MessageQueue.IdleHandler关联到Looper。你可以

通过Looper.myQueue()从当前线程中获取MessageQueue。

Looper简介:

Looper类被用来执行一个线程中的message循环。默认情况,没有一个消息循环关联到线程。在线程中调用prepare()创建一个Looper,然后用loop()来处理messages,直到循环终止。大多数和message loop的交互是通过Handler。

下面是一个典型的带有Looper的线程实

现。class LooperThread extends Thread{public Handler mHandler;

public void run(){Looper.prepare();

mHandler=new Handler(){

public void handleMessage(Message msg){//process incoming messages here }};

Looper.loop();}}

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

AIDL的英文全称是Android Interface Define Language

当A进程要去调用B进程中的service时,并实现通信,我们通常都是通过AIDL来操作的A 工程:

首先我们在net.blogjava.mobile.aidlservice包中创建一个RemoteService.aidl文件,在里面我们自定义一个接口,含有方法get。ADT插件会在gen目录下自动生成一个RemoteService.java

文件,该类中含有一个名为RemoteService.stub的内部类,该内部类中含有aidl文件接口的get方法。

说明一:aidl文件的位置不固定,可以任意

然后定义自己的MyService类,在MyService类中自定义一个内部类去继承

RemoteService.stub这个内部类,实现get方法。在onBind方法中返回这个内部类的对象,系统会自动将这个对象封装成IBinder对象,传递给他的调用者。

其次需要在AndroidManifest.xml文件中配置MyService类,代码如下:

为什么要指定调用AIDL服务的ID,就是要告诉外界MyService这个类能够被别的进程访问,只要别的进程知道这个ID,正是有了这个ID,B工程才能找到A工程实现通信。

说明:AIDL并不需要权限

B工程:

首先我们要将A工程中生成的RemoteService.java文件拷贝到B工程中,在bindService 方法中绑定aidl服务

绑定AIDL服务就是将RemoteService的ID作为intent的action参数。

说明:如果我们单独将RemoteService.aidl文件放在一个包里,那个在我们将gen目录下的该包拷贝到B工程中。如果我们将RemoteService.aidl文件和我们的其他类存放在一起,那么我们在B工程中就要建立相应的包,以保证RmoteService.java文件的报名正确,我们不

能修改RemoteService.java文件

bindService(new Inten("net.blogjava.mobile.aidlservice.RemoteService"),serviceConnectio n,Context.BIND_AUTO_CREATE);

ServiceConnection的onServiceConnected(ComponentName name,IBinder service)方法中的service参数就是A工程中MyService类中继承了RemoteService.stub类的内部类的对

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

13.系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。

14.有一个一维整型数组int[]data保存的是一张宽为width,高为height的图片像素值信息。

请写一个算法,将该图片所有的白色不透明(0xffffffff)像素点的透明度调整为50%。15.你如何评价Android系统?优缺点

相关文档