Android面试题(比较旧的)
引言: 毕业之后,我开始从事IT行业,从一个什么都不懂的小子,变成现在技术算中等的IT人员。Android 工程师这个职位我已做了近5年之久,针对网上的一些面试题进行收集一下,面试其实就是相互了解的过程,直到现在,我才发现其实公司招聘时给出的技术面试题目网上都可以找到答案,但是答题不是唯一的,只是为了确定一个人的态度问题。看过与没看是两回事,看过至少还有一点点印象,面试最好的方法便是出个题目,直接上机写代码,是不是真材实料看代码便知晓。也有人会说,现在都是开源时代,基本上所有的代码都是可以找到的,那这样写还有啥意义?错,代码可以体现一个人做事的态度,也是我们程序员接触最多的,看到代码我们可以体会当时写代码人的思维与心情,出了Bug时解决问题的方法。好了,其他的不多说,下面的题目很多来自网络。
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(-11.5)等于多少(c). c
A、11 ,-11 B、11 ,-12 C、12 ,-11 D、12 ,-12
4. 下列程序段的输出结果是:(b )
void complicatedexpression_r(){
int x=20, y=30;
boolean b;
b=x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y<-60;
System.out.println(b);
}
A、true B、false C、1 D、0
5. activity 对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行(d)
A、onPause() B、onCreate() C、 onResume() D、onStart()
6. Intent 传递数据时,下列的数据类型哪些可以被传递(abcd)(多选)
A、Serializable B、charsequence C、Parcelable D、Bundle
7. android 中下列属于 Intent 的作用的是(c)
A、实现应用程序间的数据共享
B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失
C、可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带
D、处理一个应用程序整体性的工作
8. 下列属于 SAX 解析 xml 文件的优点的是(b)
A、将整个文档树在内存中,便于操作,支持删除,修改,重新排列等多种功能
B、不用事先调入整个文档,占用资源少
C、整个文档调入内存,浪费时间和空间
D、不是长久驻留在内存,数据不是持久的,事件过后,若没有保存数据,数据就会 消失
9. 下面的对自定 style 的方式正确的是(a)
10. 在 android 中使用 Menu 时可能需要重写的方法有(ac)。(多选)
A、onCreateOptionsMenu()
B、onCreateMenu()
C、onOptionsItemSelected()
D、onItemSelected()
11. 在 SQL Server Management Studio 中运行下列 T-SQL 语句,其输出值(c)。
SELECT @@IDENTITY
A、 可能为 0.1 B、 可能为 3 C、 不可能为-100 D、 肯定为 0
12. 在 SQL Server 2005 中运行如下 T-SQL 语句,假定 SALES 表中有多行数据,执行查询之 后的结果是(d)。
BEGIN TRANSACTION AUpdate SALES Set qty=30
WHERE qty<30BEGIN TRANSACTION BUpdate SALES Set qty=40
WHERE qty<40Update SALES Set qty=50
WHERE qty<50Update SALES Set qty=60
WHERE qty<60COMMIT TRANSACTION BCOMMIT TRANSACTION A
A、SALES 表中 qty 列最小值大于等于 30
B、SALES 表中 qty 列最小值大于等于 40
C、SALES 表中 qty 列的数据全部为 50
D、SALES 表中 qty 列最小值大于等于 60
13. 在 android 中使用 SQLiteOpenHelper 这个辅助类时,可以生成一个数据库,并可以对数据库版本进行管理的方法可以是(ab)
A、getWriteableDatabase()
B、getReadableDatabase()
C、getDatabase()
D、getAbleDatabase()
14. android 关于 service 生命周期的 onCreate()和 onStart()说法正确的是(ad)(多选题)
A、当第一次启动的时候先后调用 onCreate()和 onStart()方法
B、当第一次启动的时候只会调用 onCreate()方法
C、如果 service 已经启动,将先后调用 onCreate()和 onStart()方法
D、如果 service 已经启动,只会执行 onStart()方法,不在执行 onCreate()方法
15. 下面是属于 GLSurFaceView 特性的是(abc)(多选)
A、管理一个 surface,这个 surface 就是一块特殊的内存,能直接排版到 android 的视图 view 上。
B、管理一个 EGL display,它能让 opengl 把内容渲染到上述的 surface 上。
C、让渲染器在独立的线程里运作,和 UI 线程分离。
D、可以直接从内存或者 DMA 等硬件接口取得图像数据
16. 下面在 AndroidManifest.xml 文件中注册 BroadcastReceiver 方式正确的(a) A、
A、<receiver android:name="NewBroad">
<intent-filter>
<action android:name="android.provider.action.NewBroad"/>
</intent-filter>
</receiver>
B. <receiver android:name="NewBroad">
<intent-filter>
android:name="android.provider.action.NewBroad"/>
</intent-filter>
</receiver>
17. 关于 ContenValues 类说法正确的是(a)
A、他和 Hashtable 比较类似,也是负责存储一些名值对,但是他存储的名值对当中的 名是 String 类型,而值都是基本类型
B、他和 Hashtable 比较类似,也是负责存储一些名值对,但是他存储的名值对当中的 名是任意类型,而值都是基本类型
C、他和 Hashtable 比较类似,也是负责存储一些名值对,但是他存储的名值对当中的 名,可以为空,而值都是 String 类型
D、他和 Hashtable 比较类似,也是负责存储一些名值对,但是他存储的名值对当中 的名是 String 类型,而值也是 String 类型
18. 我们都知道 Hanlder 是线程与 Activity 通信的桥梁,如果线程处理不当,你的机器就会变得越慢,那么线程销毁的方法是(a)
A、onDestroy() B、onClear() C、onFinish() D、onStop()
19. 下面退出 Activity 错误的方法是(c)
A、finish() B、抛异常强制退出 C、System.exit() D、onStop()
20. 下面属于 android 的动画分类的有(ab)(多项)
A、Tween B、Frame C、Draw D、Animation
21. 下面关于 Android dvm 的进程和 Linux 的进程,应用程序的进程说法正确的是(d)
A、DVM 指 dalivk 的虚拟机.每一个 Android 应用程序都在它自己的进程中运行,不一定拥有一个独立 的 Dalvik 虚拟机实例.而每一个 DVM 都是在 Linux 中的一个进程,所以说可以认为是同一个概念.
B、DVM 指 dalivk 的虚拟机.每一个 Android 应用程序都在它自己的进程中运行,不一定拥有一个独立的 Dalvik 虚拟机实例.而每一个 DVM 不一定都是在 Linux 中的一个进程,所以说不是一个概念.
C、DVM 指 dalivk 的虚拟机.每一个 Android 应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik 虚拟机实例.而每一个 DVM 不一定都是在 Linux 中的一个进程,所以说不是一个概念.
D、DVM 指 dalivk 的虚拟机.每一个 Android 应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik 虚拟机实例.而每一个 DVM 都是在 Linux 中的一个进程,所以说可以认为是同一个概念.
22. Android 项目工程下面的 assets 目录的作用是什么 (b)
A、放置应用到的图片资源。
B、主要放置多媒体等数据文件
C、放置字符串,颜色,数组等常量数据
D、放置一些与 UI 相应的布局文件,都是 xml 文件
23. 关于 res/raw 目录说法正确的是(a)
A、 这里的文件是原封不动的存储到设备上不会转换为二进制的格式B、 这里的文件是原封不动的存储到设备上会转换为二进制的格式
C、 这里的文件最终以二进制的格式存储到指定的包中
D、 这里的文件最终不会以二进制的格式存储到指定的包中
24. 下列对 android NDK 的理解正确的是(abcd )
A、 NDK 是一系列工具的集合
B、 NDK 提供了一份稳定、功能有限的 API 头文件声明。
C、 使 “Java+C” 的开发方式终于转正,成为官方支持的开发方式
D、 NDK 将是 Android 平台支持 C 开发的开端
二.填空题
25. android 中常用的四个布局是 framlayout,linenarlayout,relativelayout 和 tablelayout。
26. android 的四大组件是 activiey,service,broadcast 和 contentprovide。
27. java.io 包中的 objectinputstream 和 objectoutputstream 类主要用于对对象(Object)的读写。
28. android 中 service 的实现方法(两种)是:startservice 和 bindservice。
29. activity 一般会重载 7 个方法用来维护其生命周期,除了onCreate(),onStart(),onDestory() 外还有 onrestart,onresume,onpause,onstop。
30. android 的数据存储的方式 sharedpreference,文件,SQlite,contentprovider,网络。
31. 当启动一个Activity并且新的Activity执行完后需要返回到启动它的Activity来执行 的回调函数是 startActivityResult()。
32. 请使用命令行的方式创建一个名字为 myAvd,sdk 版本为 2.2,sd 卡是在 d 盘的根目录下,名字为 scard.img, 并指定屏幕大小 HVGA.____________________________________。
33. 程序运行的结果是:_____good and gbc__(错过一次了)________。
public class Example{
String str=new String("good");
char[]ch={'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 void change(String str,char ch[])
{ str="test ok"; ch[0]='g';
}
}
34. 在 android 中,请简述 jni 的调用过程。(8 分)(考过一次了)
1)安装和下载 Cygwin,下载 Android NDK
2)在 ndk 项目中 JNI 接口的设计
3)使用 C/C++实现本地方法
4)JNI 生成动态链接库.so 文件
5)将动态链接库复制到 java 工程,在 java 工程中调用,运行 java 工程即可
35. 简述 Android 应用程序结构是哪些?(7 分)
Android 应用程序结构是: Linux Kernel(Linux 内核)、Libraries(系统运行库或者是 c/c++核心库)、Application Framework(开发框架包)、Applications (核心应用程序)
第一层:Linux 操作系统和驱动(Linux kernel)
第二层:各种库和 Android 运行环境(Android Runtime)
第三层:java 框架(有 activity manager,contentprovide 等)
第四层:应用程序
36. 请继承 SQLiteOpenHelper 实现:(10 分)
1).创建一个版本为 1 的“diaryOpenHelper.db”的数据库,
2).同时创建一个 “diary” 表(包含一个_id 主键并自增长,topic 字符型 100 长度, content 字符型 1000 长度)
3).在数据库版本变化时请删除 diary 表,并重新创建出 diary 表。
public class DBHelper extends SQLiteOpenHelper {
public 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 table 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. 页面上现有 ProgressBar 控件 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)findViewById(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(currentprogress+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() --> 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()
39. 如果后台的 Activity 由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
答:onSaveInstanceState()当你的程序中某一个 Activity A 在运行时,主动或被动地运行另一个新的 Activity B,这个时候 A 会执行 onSaveInstanceState()。B 完成以后又会来找 A,这个时候就有两种情况:一是 A 被回收,二是 A 没有被回收,被回收的 A 就要重新调用 onCreate()方法,不同于直接启动的是这回 onCreate()里是带上了参数 savedInstanceState;而没被收回的就直接执行onResume(),跳过 onCreate()了。
40. 如何将一个 Activity 设置成窗口的样式。
答: 在 AndroidManifest.xml 中定义 Activity 的地方一句话android:theme="@android:style/Theme.Dialog"或android:theme="@android:style/Theme.Translucent"就变成半透明的
41. 如何退出 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_BACKGROUND_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 基类,处理这些共通问题。
42. 请介绍下 Android 中常用的五种布局。
FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)
43. 请介绍下 Android 的数据存储方式。
一.SharedPreferences 方式
二.文件存储方式
三.SQLite 数据库方式
四.内容提供器(Content provider)方式
五. 网络存储方式
44. 请介绍下 ContentProvider 是如何实现数据共享的。
创建一个属于你自己的 Content provider 或者将你的数据添加到一个已经存在的 Contentprovider 中,前提是有相同数据类型并且有写入 Content provider 的权限。
45. 如何启用 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()方法。
3.采用 Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用 onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的 onUnbind()方法,。接着调用 onDestroy()方法。如果调用 bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说 onCreate()和 onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用 unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。
三。Service 的生命周期
1.Service 常用生命周期回调方法如下:onCreate() 该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或 bindService()方法,服务也只被创建一次。 onDestroy()该方法在服务被终止时调用。
2. Context.startService()启动 Service 有关的生命周期方法onStart() 只有采用 Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用 startService()方法尽管不会多次创建服务,但 onStart() 方法会被多次调用。
3. Context.bindService()启动 Service 有关的生命周期方法onBind()只有采用 Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用 Context.bindService()方法并不会导致该方法被多次调用。onUnbind()只有采用 Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。备注:
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); //unbindService(conn);//解除绑定
46. 注册广播有几种方式,这些方式有何优缺点?请谈谈 Android 引入广播机制的用意。
答:Android 广播机制(两种注册方法)在 android 下,要想接受广播信息,那么这个广播接收器就得我们自己来实现了,我们可以继承 BroadcastReceiver,就可以有一个广播接受器了。有个接受器还不够,我们还得重写BroadcastReceiver 里面的 onReceiver 方法,当来广播的时候我们要干什么,这就要我们自己来实现,不过我们可以搞一个信息防火墙。
第一种不是常驻型广播,也就是说广播跟随程序的生命周期。
2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
47. 请解释下在单线程模型中 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):
sendMessage(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();
} }
48. 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"),serviceConnection, Context.BIND_AUTO_CREATE); ServiceConnection 的 onServiceConnected(ComponentName name, IBinder service)方法中的service参数就是A工程中MyService类中继承了RemoteService.stub类的内部类的对象。
49. 请解释下 Android 程序运行时权限与文件系统权限的区别。运行时权限 Dalvik( android 授权)文件系统 linux 内核授权50. 系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。
通过直接发送 Uri 把参数带过去,或者通过 manifest 里的 intentfilter 里的 data 属性。