Android程序员面试笔试宝典
上QQ阅读APP看书,第一时间看更新

1.3.4 常见面试笔试真题

1)分别描述一下广播的类型及其区别。

思路:记住它们的工作流程图以及使用的代码。

解答:

①普通广播:是一种完全异步的广播,发出之后,所有广播接收器都能在同一时刻接收到该广播;优点是传递效率高,缺点是安全性不能保证,因为接收器并不能处理拦截广播:

②有序广播:是一种同步执行的广播,所以该广播发出后,同一时刻只有一个广播接收器可接收到该广播,并且接收该广播的广播接收器能对该广播进行拦截,如果不拦截,则可继续传给下一个广播接收器:

然后发送广播:

如果要拦截广播则在广播接收器上调用:

③本地广播:有序广播与普通广播都是全局广播,它们发出的广播都是可以被其他应用程序所接收的,而自定义的广播器也能接收他们发过来的广播。而本地广播,则是在一个应用程序内进行传播,所以定义的广播接收器也只能接收来自该应用程序发来的广播。优点是安全性得到保证,传送的广播不会被其他应用程序接收到:

2)谈一谈你对广播注册的认识及其使用场景。

解答:

①静态注册:直接用AndroidStudio快捷方式创建BroadcastReceiver,自动会注册,然后就可在创建的类中的onReceiver()方法中写要处理的逻辑;静态注册一般用于像开机之后就要收到广播的场景,这样就不会依赖于程序;

②动态注册:在活动中创建一个内部类(该类就是自定义广播接收器),这个类继承BroadcastReceiver,然后在该类中重写onReceiver()方法。最后在活动中调用registerReceiver(),把刚刚定义好的内部类对象作为参数传进该方法,除此之外,还要同时传入另一个参数IntentFilter对象,通过使用IntentFilter对象来添加相应的action,从而让广播接收器知道自己监听的是什么广播,如果匹配则进行接收。把这两个参数传到registerReceiver()方法中,这样就实现了注册,而注销广播接收器则调用unregisterReceiver()方法,只传一个参数进去,该参数就是广播接收器对象。动态注册比较灵活,可以控制注册与注销,但是要依赖程序启动后才能接收到广播。一般会用于跟程序有关的通知功能,即当收到广播后就触发的功能。

3)为什么不要在广播接收器里做耗时操作?

解答:

如果实际开发中需要在onReceive()方法完成一些耗时操作,应该考虑在Service中开启一个新线程处理耗时操作,不应该直接在BroadcastReceiver中开启一个新的线程,因为BroadcastReceiver生命周期很短,在执行完onReceive()方法后就结束了,如果开启一个新的线程,可能出现BroadcastRecevier退出以后线程还在,而此时此刻该线程就会被标记为一个空线程(因为BroadcastRecevier已经销毁了,即进程销毁),根据Android的内存管理策略,在系统内存不足的情况下,会按照优先级来结束等级低的线程,而空线程是优先级最低的,这样就可能导致BroadcastReceiver启动的子线程不能执行完成,所以系统就会在运行程序的时候报错。

4)谈一谈你对广播BroadcastReceiver的理解。

思路:这种问的比较广的题可以按照BroadcastReceiver是什么,有什么用,怎么使用的思路去答即可。

解答:

①广播是四大组件之一,相当于一个监听器的作用。Android广播按角色可以分为广播发送者和广播接收者。按种类来分又可以分为有普通广播、有序广播和本地广播。

②它就是监听与接收系统或其他应用发出的广播消息,并做出响应。这就使得应用程序间可以互相通信。

③广播接收器的注册。

注册的方式分为两种:静态注册、动态注册:

静态注册:在AndroidManifest.xml里通过<receive>标签声明。

特点:常驻,不受任何组件的生命周期影响,缺点是耗电、占内存,应用在需要时刻监听广播的情况。

动态注册:在活动中创建一个内部类—自定义广播接收器,继承BroadcastReceiver,重写onReceiver()方法;调用registerReceiver(内部类对象,IntentFilter对象)注册,调用unregisterReceiver(内部类对象)注销。

特点:非常驻,灵活,跟随组件的生命周期变化(组件结束=广播结束,在组件结束前,必须移除广播接收器)。

④动态广播最好在Activity的onResume()里注册,在onPause()里注销。因为对于动态广播,有注册就必然有注销,否则会导致内存泄漏;另外重复注册、重复注销也是不允许的。

5)请你阐述一下本地广播与全局广播以及它们的区别。

思路:全局广播其实就是普通广播、有序广播以及系统广播,所以把它们和本地广播的区别介绍清楚即可。

解答:

①全局广播:

●普通广播:

即开发者自身定义intent的广播,也是最常用的;

●系统广播:

Android中内置了多个系统广播:只要涉及手机的基本操作(如开机、网络状态变化、拍照等),都会发出相应的广播;

●有序广播:

发送出去的广播被广播接收者按照先后顺序接收,有序是针对广播接收者而言的;

●有序广播按顺序接收:

先接收的广播接收者可以对广播进行截断,即后接收的广播接收者不再接收到此广播;

先接收的广播接收者可以对广播进行修改,那么后接收的广播接收者将接收到被修改后的广播。

有序广播的使用过程与普通广播非常类似,差异仅在于广播的发送方式:

②本地广播:

本地广播是在一个应用程序内进行传播,所以定义的广播接收器也只能接收来自该应用程序发来的广播。优点是安全性得到保证,传送的广播不会被其他应用程序接收到。

通过LocalBroadcastManager来发送,注册与注销。

6)如何实现拦截一条短信?

思路:其实很简单,短信接收方式是通过广播来接收,而且这个广播是有序广播。所以可以利用有序广播拦截的方法来拦截短信。

解答:

①首先添加接收短信的权限:

②在AndroidManifest.xml中注册广播接收器,设置该广播接收器优先级,尽量设高一点;

③创建一个BroadcastReceiver来实现广播的处理,并设置拦截器abortBroadcast()。

7)广播接收器可以请求网络吗?

解答:

广播可以监听网络变化情况,但如果要做网路请求的话,会有可能导致主线程阻塞,因为网络请求是耗时操作,所以要开启子线程去进行网络请求。

8)广播引起ANR的时间限制是多少?

解答:超过10秒就会引起ANR问题。