1、Android面试题1. 下列哪些语句关于内存回收的说明是正确的? (b )A、 程序员必须创建一个线程来释放内存B、 内存回收程序负责释放无用内存 C、 内存回收程序允许程序员直接释放内存 D、 内存回收程序可以在指定的时间释放内存对象 2. 下面异常是属于 Runtime Exception 的是(abcd)(多选)A、ArithmeticException B、IllegalArgumentException C、NullPointerException D、BufferUnderflowException 3. Math.round(11.5)等于多少(). Math.round(-1
2、1.5)等于多少(c). cA、11 ,-11 B、11 ,-12 C、12 ,-11 D、12 ,-124. 下列程序段的输出结果是:(b )void complicatedexpression_r()int x=20, y=30;boolean b;b=x50 charch=a,b,c; public static void main(String args) Example ex=new Example(); ex.change(ex.str,ex.ch); System.out.print(ex.str+“ and “); Sytem.out.print(ex.ch); public
3、void change(String str,char ch) str=“test ok“; ch0=g; 34. 在 android 中,请简述 jni 的调用过程。(8 分)1)安装和下载 Cygwin,下载 Android NDK2)在 ndk 项目中 JNI 接口的设计3)使用 C/C+实现本地方法4)JNI 生成动态链接库.so 文件5)将动态链接库复制到 java 工程,在 java 工程中调用,运行 java 工程即可35. 简述 Android 应用程序结构是哪些?(7 分)Android 应用程序结构是:Linux Kernel(Linux 内核)、 Libraries(系统
4、运行库或者是 c/c+核心库)、Application Framework(开发框架包)、Applications (核心应用程序)36. 请继承 SQLiteOpenHelper 实现:(10 分)1).创建一个版本为 1 的“diaryOpenHelper.db ”的数据库,2).同时创建一个 “diary” 表(包含一个_id 主键并自增长,topic 字符型 100长度, content 字符型 1000 长度)3).在数据库版本变化时请删除 diary 表,并重新创建出 diary 表。public class DBHelper extends SQLiteOpenHelper pu
5、blic final static String DATABASENAME = “diaryOpenHelper.db“;public final static int DATABASEVERSION = 1;/创建数据库public DBHelper(Context context,String name,CursorFactory factory,int version)super(context, name, factory, version);/创建表等机构性文件public void onCreate(SQLiteDatabase db)String sql =“create tab
6、le diary“+“(“+“_id integer primary key autoincrement,“+“topic varchar(100),“+“content varchar(1000)“+“)“;db.execSQL(sql);/若数据库版本有更新,则调用此方法public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)String sql = “drop table if exists diary“;db.execSQL(sql);this.onCreate(db);37. 页面上现有 Progre
7、ssBar 控件 progressBar,请用书写线程以 10 秒的的时间完成其进度显示工作。(10 分)答案public class ProgressBarStu extends Activity private ProgressBar progressBar = null;protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.progressbar);/从这到下是关键progressBar = (ProgressBar)fin
8、dViewById(R.id.progressBar);Thread thread = new Thread(new Runnable() Overridepublic void run() int progressBarMax = progressBar.getMax();try while(progressBarMax!=progressBar.getProgress()int stepProgress = progressBarMax/10;int currentprogress = progressBar.getProgress();progressBar.setProgress(cu
9、rrentprogress+stepProgress);Thread.sleep(1000); catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTrace(););thread.start();/关键结束38. 请描述下 Activity 的生命周期。必调用的三个方法:onCreate() onStart() onResume(),用 AAA 表示(1)父 Activity 启动子 Activity,子 Actvity 退出,父 Activity 调用顺序如下AAA onFreeze() o
10、nPause() 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
11、 onFreeze() onPause()(6)设备进入睡眠状态,Activity 调用顺序如下AAA onFreeze() onPause()39. 如果后台的 Activity 由于某原因被系统回收了,如何在被系统回收之前保存当前状态?onSaveInstanceState()当你的程序中某一个 Activity A 在运行时,主动或被动地运行另一个新的 Activity B,这个时候 A 会执行 onSaveInstanceState()。B 完成以后又会来找 A,这个时候就有两种情况:一是 A 被回收,二是 A 没有被回收,被回收的 A 就要重新调用 onCreate()方法,不同于直
12、接启动的是这回 onCreate()里是带上了参数 savedInstanceState;而没被收回的就直接执行onResume(),跳过 onCreate()了。 40. 如何将一个 Activity 设置成窗口的样式。在 AndroidManifest.xml 中定义 Activity 的地方一句话android:theme=“android:style/Theme.Dialog“或android:theme=“android:style/Theme.Translucent“就变成半透明的41. 如何退出 Activity?如何安全退出已调用多个 Activity 的 Applicatio
13、n?对于单一 Activity 的应用来说,退出很简单,直接 finish()即可。当然,也可以用 killProcess()和 System.exit()这样的方法。但是,对于多 Activity 的应用来说,在打开多个 Activity 后,如果想在最后打开的 Activity直接退出,上边的方法都是没有用的,因为上边的方法都是结束一个 Activity 而已。当然,网上也有人说可以。就好像有人问,在应用里如何捕获 Home 键,有人就会说用 keyCode 比较KEYCODE_HOME 即可,而事实上如果不修改 framework,根本不可能做到这一点一样。所以,最好还是自己亲自试一下。
14、那么,有没有办法直接退出整个应用呢?在 2.1 之前,可以使用 ActivityManager 的 restartPackage 方法。它可以直接结束整个应用。在使用时需要权限 android.permission.RESTART_PACKAGES。注意不要被它的名字迷惑。可是,在 2.2,这个方法失效了。在 2.2 添加了一个新的方法,killBackgroundProcesses(),需要权限 android.permission.KILL_BACKGROUND_PROCESSES。可惜的是,它和 2.2 的 restartPackage 一样,根本起不到应有的效果。另外还有一个方法,就是
15、系统自带的应用程序管理里,强制结束程序的方法,forceStopPackage()。它需要权限 android.permission.FORCE_STOP_PACKAGES。并且需要添加 android:sharedUserId=“android.uid.system“属性同样可惜的是,该方法是非公开的,他只能运行在系统进程,第三方程序无法调用。因为需要在 Android.mk 中添加 LOCAL_CERTIFICATE := platform。而 Android.mk 是用于在 Android 源码下编译程序用的。从以上可以看出,在 2.2,没有办法直接结束一个应用,而只能用自己的办法间接办
16、到。现提供几个方法,供参考:1、抛异常强制退出:该方法通过抛异常,使程序 Force Close。验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出 Force Close 的窗口。2、记录打开的 Activity:每打开一个 Activity,就记录下来。在需要退出时,关闭每一个 Activity 即可。3、发送特定广播:在需要结束应用时,发送一个特定的广播,每个 Activity 收到广播后,关闭即可。4、递归退出在打开新的 Activity 时使用 startActivityForResult,然后自己加标志,在 onActivityResult 中处理,递归关闭。除了第一个,
17、都是想办法把每一个 Activity 都结束掉,间接达到目的。但是这样做同样不完美。你会发现,如果自己的应用程序对每一个 Activity 都设置了 nosensor,在两个 Activity 结束的间隙,sensor 可能有效了。但至少,我们的目的达到了,而且没有影响用户使用。为了编程方便,最好定义一个 Activity 基类,处理这些共通问题。 42. 请介绍下 Android 中常用的五种布局。FrameLayout(框架布局), LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)
18、43. 请介绍下 Android 的数据存储方式。一.SharedPreferences 方式二.文件存储方式三.SQLite 数据库方式四.内容提供器(Content provider)方式五. 网络存储方式44. 请介绍下 ContentProvider 是如何实现数据共享的。创建一个属于你自己的 Content provider 或者将你的数据添加到一个已经存在的 Content provider 中,前提是有相同数据类型并且有写入 Content provider 的权限。45. 如何启用 Service,如何停用 Service。Android 中的 service 类似于 wind
19、ows 中的 service,service 一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。一。步骤第一步:继承 Service 类public class SMSService extends Service 第二步:在 AndroidManifest.xml 文件中的节点里对服务进行配置:二。Context.startService()和 Context.bindService服务不能自己运行,需要通过调用 Context.startService()或 Context.bindService()方法启动服务。这两个方法都可以启动 Service,但
20、是它们的使用场合有所不同。1.使用 startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。使用 bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。2.采用 Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用 onStart()方法。如果调用 startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用 onStart()方法。采用 startService(
21、)方法启动的服务,只能调用 Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。 3.采用 Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用 onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的 onUnbind()方法,。接着调用 onDestroy()方法。如果调用 bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说 onCreate()和 onBind()
22、方法并不会被多次调用) 。如果调用者希望与正在绑定的服务解除绑定,可以调用 unbindService()方法,调用该方法也会导致系统调用服务的 onUnbind()onDestroy()方法。三。Service 的生命周期1.Service 常用生命周期回调方法如下:onCreate() 该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或 bindService()方法,服务也只被创建一次。 onDestroy()该方法在服务被终止时调用。 2. Context.startService()启动 Service 有关的生命周期方法onStart()
23、只有采用 Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用 startService()方法尽管不会多次创建服务,但 onStart() 方法会被多次调用。3. Context.bindService()启动 Service 有关的生命周期方法onBind()只有采用 Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用 Context.bindService()方法并不会导致该方法被多次调用。onUnbind()只有采用 Context.bin
24、dService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。备注:1. 采用 startService()启动服务Intent intent = new Intent(DemoActivity.this, DemoService.class);startService(intent);2.Context.bindService()启动Intent intent = new Intent(DemoActivity.this, DemoService.class);bindService(intent, conn, Context.BIND_AUTO_CREATE);/
25、unbindService(conn);/解除绑定46. 注册广播有几种方式,这些方式有何优缺点?请谈谈 Android 引入广播机制的用意。Android 广播机制(两种注册方法) 在 android 下,要想接受广播信息,那么这个广播接收器就得我们自己来实现了,我们可以继承 BroadcastReceiver,就可以有一个广播接受器了。有个接受器还不够,我们还得重写 BroadcastReceiver 里面的 onReceiver 方法,当来广播的时候我们要干什么,这就要我们自己来实现,不过我们可以搞一个信息防火墙。具体的代码:public class SmsBroadCastReceiv
26、er extends BroadcastReceiver Override public void onReceive(Context context, Intent intent) Bundle bundle = intent.getExtras(); Object object = (Object)bundle.get(“pdus“); SmsMessage sms=new SmsMessageobject.length; for(int i=0;i 两种注册类型的区别是:1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播
27、来,程序也会被系统调用自动运行。47. 请解释下在单线程模型中 Message、Handler、Message Queue、Looper 之间的关系。Handler 简介:一个 Handler 允许你发送和处理 Message 和 Runable 对象,这些对象和一个线程的MessageQueue 相关联。每一个线程实例和一个单独的线程以及该线程的 MessageQueue 相关联。当你创建一个新的 Handler 时,它就和创建它的线程绑定在一起了。这里,线程我们也可以理解为线程的 MessageQueue。从这一点上来看,Handler 把 Message 和 Runable对象传递给 M
28、essageQueue,而且在这些对象离开 MessageQueue 时,Handler 负责执行他们。Handler 有两个主要的用途:(1)确定在将来的某个时间点执行一个或者一些 Message 和Runnable 对象。 (2)在其他线程(不是 Handler 绑定线程)中排入一些要执行的动作。Scheduling Message,即(1) ,可以通过以下方法完成:post(Runnable):Runnable 在 handler 绑定的线程上执行,也就是说不创建新线程。postAtTime(Runnable,long):postDelayed(Runnable,long):sendEm
29、ptyMessage(int):sendMessage(Message):sendMessageAtTime(Message,long):sendMessageDelayed(Message,long):post 这个动作让你把 Runnable 对象排入 MessageQueue,MessageQueue 受到这些消息的时候执行他们,当然以一定的排序。sendMessage 这个动作允许你把 Message 对象排成队列,这些 Message 对象包含一些信息,Handler 的 hanlerMessage(Message)会处理这些 Message.当然,handlerMessage(Me
30、ssage)必须由 Handler 的子类来重写。这是编程人员需要作的事。当 posting 或者 sending 到一个 Hanler 时,你可以有三种行为:当 MessageQueue 准备好就处理,定义一个延迟时间,定义一个精确的时间去处理。后两者允许你实现 timeout,tick,和基于时间的行为。当你的应用创建一个新的进程时,主线程(也就是 UI 线程)自带一个 MessageQueue,这个 MessageQueue 管理顶层的应用对象(像 activities,broadcast receivers 等)和主线程创建的窗体。你可以创建自己的线程,并通过一个 Handler 和主
31、线程进行通信。这和之前一样,通过 post 和 sendmessage 来完成,差别在于在哪一个线程中执行这么方法。在恰当的时候,给定的 Runnable 和 Message 将在 Handler 的 MessageQueue 中被 Scheduled。Message 简介:Message 类就是定义了一个信息,这个信息中包含一个描述符和任意的数据对象,这个信息被用来传递给 Handler.Message 对象提供额外的两个 int 域和一个 Object 域,这可以让你在大多数情况下不用作分配的动作。尽管 Message 的构造函数是 public 的,但是获取 Message 实例的最好方
32、法是调用Message.obtain(),或者 Handler.obtainMessage()方法,这些方法会从回收对象池中获取一个。MessageQueue 简介:这是一个包含 message 列表的底层类。Looper 负责分发这些 message。Messages 并不是直接加到一个 MessageQueue 中,而是通过 MessageQueue.IdleHandler 关联到 Looper。你可以通过 Looper.myQueue()从当前线程中获取 MessageQueue。Looper 简介:Looper 类被用来执行一个线程中的 message 循环。默认情况,没有一个消息循环
33、关联到线程。在线程中调用 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 mes
34、sages here;Looper.loop();48. AIDL 的全称是什么?如何工作?能处理哪些类型的数据?AIDL 的英文全称是 Android Interface Define Language当 A 进程要去调用 B 进程中的 service 时,并实现通信,我们通常都是通过 AIDL 来操作的A 工程:首先我们在 net.blogjava.mobile.aidlservice 包中创建一个 RemoteService.aidl 文件,在里面我们自定义一个接口,含有方法 get。ADT 插件会在 gen 目录下自动生成一个RemoteService.java 文件,该类中含有一个名
35、为 RemoteService.stub 的内部类,该内部类中含有 aidl 文件接口的 get 方法。说明一:aidl 文件的位置不固定,可以任意然后定义自己的 MyService 类,在 MyService 类中自定义一个内部类去继承RemoteService.stub 这个内部类,实现 get 方法。在 onBind 方法中返回这个内部类的对象,系统会自动将这个对象封装成 IBinder 对象,传递给他的调用者。其次需要在 AndroidManifest.xml 文件中配置 MyService 类,代码如下:为什么要指定调用 AIDL 服务的 ID,就是要告诉外界 MyService 这
36、个类能够被别的进程访问,只要别的进程知道这个 ID,正是有了这个 ID,B 工程才能找到 A 工程实现通信。说明:AIDL 并不需要权限B 工程:首先我们要将 A 工程中生成的 RemoteService.java 文件拷贝到 B 工程中,在bindService 方法中绑定 aidl 服务绑定 AIDL 服务就是将 RemoteService 的 ID 作为 intent 的 action 参数。说明:如果我们单独将 RemoteService.aidl 文件放在一个包里,那个在我们将 gen 目录下的该包拷贝到 B 工程中。如果我们将 RemoteService.aidl 文件和我们的其他
37、类存放在一起,那么我们在 B 工程中就要建立相应的包,以保证 RmoteService.java 文件的报名正确,我们不能修改 RemoteService.java 文件bindService(new Inten(“net.blogjava.mobile.aidlservice.RemoteService“), serviceConnection, Context.BIND_AUTO_CREATE); ServiceConnection 的 onServiceConnected(ComponentName name, IBinder service)方法中的 service 参数就是 A 工程
38、中 MyService 类中继承了 RemoteService.stub 类的内部类的对象。49. 请解释下 Android 程序运行时权限与文件系统权限的区别。运行时权限 Dalvik( android 授权 ) 文件系统 linux 内核授权50. 系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。通过直接发送 Uri 把参数带过去,或者通过 manifest 里的 intentfilter 里的 data 属性51. 你如何评价 Android 系统?优缺点。答:Android 平台手机 5 大优势: 一、开放性 在优势方面,Android 平台首先就是其开发性,开发的平
39、台允许任何移动终端厂商加入到Android 联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。开放性对于 Android 的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,随大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。二、挣脱运营商的束缚 在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。从去年 iPhone 上市 ,用户可以更加方便地连接网络,运营商的制约减少。随着 EDGE、HSDP
40、A 这些 2G 至 3G 移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈,当你可以通过手机 IM 软件方便地进行即时聊天时,再回想不久前天价的彩信和图铃下载业务,是不是像噩梦一样?互联网巨头 Google 推动的 Android 终端天生就有网络特色,将让用户离互联网更近。三、丰富的硬件选择 这一点还是与 Android 平台的开放性相关,由于 Android 的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容,好比你从诺基亚 Symbian 风格手机 一下改用苹果 iPhone ,同时还可将Symbian 中
41、优秀的软件带到 iPhone 上使用、联系人等资料更是可以方便地转移,是不是非常方便呢?四、不受任何限制的开发商 Android 平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如可控制正是留给 Android 难题之一。五、无缝结合的 Google 应用 如今叱诧互联网的 Google 已经走过 10 年度历史,从搜索巨人到全面的互联网渗透,Google 服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而 Android 平台手机将无缝结合这些优秀的 Google
42、服务。再说 Android 的 5 大不足:一、安全和隐私 由于手机 与互联网的紧密联系,个人隐私很难得到保守。除了上网过程中经意或不经意留下的个人足迹,Google 这个巨人也时时站在你的身后,洞穿一切,因此,互联网的深入将会带来新一轮的隐私危机。二、首先开卖 Android 手机的不是最大运营商 众所周知,T-Mobile 在 23 日,于美国纽约发布 了 Android 首款手机 G1。但是在北美市场,最大的两家运营商乃 AT&T 和 Verizon,而目前所知取得 Android 手机销售权的仅有 T-Mobile 和 Sprint,其中 T-Mobile 的 3G 网络相对于其他三家
43、也要逊色不少,因此,用户可以买账购买 G1,能否体验到最佳的 3G 网络服务则要另当别论了!三、运营商仍然能够影响到 Android 手机 在国内市场,不少用户对购得移动定制机不满,感觉所购的手机被人涂画了广告一般。这样的情况在国外市场同样出现。Android 手机的另一发售运营商 Sprint 就将在其机型中内置其手机商店程序。四、同类机型用户减少 在不少手机论坛都会有针对某一型号的子论坛,对一款手机的使用心得交流,并分享软件资源。而对于 Android 平台手机,由于厂商丰富,产品类型多样,这样使用同一款机型的用户越来越少,缺少统一机型的程序强化。举个稍显不当的例子,现在山寨机泛滥,品种各
44、异,就很少有专门针对某个型号山寨机的讨论和群组,除了哪些功能异常抢眼、颇受追捧的机型以外。五、过分依赖开发商缺少标准配置 在使用 PC 端的 Windows Xp 系统的时候,都会内置微软 Windows Media Player 这样一个浏览器程序,用户可以选择更多样的播放器,如 Realplay 或暴风影音等。但入手开始使用默认的程序同样可以应付多样的需要。在 Android 平台中,由于其开放性,软件更多依赖第三方厂商,比如 Android 系统的 SDK 中就没有内置音乐 播放器,全部依赖第三方开发,缺少了产品的统一性。52. 什么是 ANR 如何避免它 ? 答:ANR:Applica
45、tion Not Responding,五秒 在 Android 中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当出现下列情况时,Android 就会显示 ANR 对话框了: 对输入事件(如按键、触摸屏事件 )的响应超过 5 秒 意向接受器(intentReceiver)超过 10 秒钟仍未执行完毕 Android 应用程序完全运行在一个独立的线程中( 例如 main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发 ANR。因为此时,你的应用程序已经没有机会去响应输入事件和意向广播(Intent broadcast)。 因此,任何运行在主线程中的方法,都要尽可能的只做少量的工作。特别是活动生命周期中的重要方法如 onCreate()和 onResume()等更应如此。潜在的比较耗时的操作,如