安卓面试易考题(三)
面试题一:请描述一下Intent 和 Intent Filter。
我们可以把intent理解成一个动作,这个动作包含数据和额外的附加信息:
Action: 动作 Intent.ation_view
Data: 数据uri uri mime
Category : 而外的附加信息
而这个动作是一句一些匹配规则匹配的,匹配规则可以在清单文件注册,也能在代码中注册。
清单文件中:
<intent-filter > <action android:name="android.intent.action.MAIN" /> <action android:name="cn.itcast.action" /> …… </intent-filter>
代码中:
如果我们在启动一个 Activity 时使用这样的 Intent 对象:
Intent intent =new Intent(); intent.setAction("cn.itcast.action");
Intent filter: 可以理解为邮局或者是一个信笺的分拣系统,根据filter指定的内容来匹配。
面试题二:intent传递数据可传递哪些数据类型?
1. 一般的基本数据类型
Intent .putextra() intent.getStringextra();
2. 数据的uri,
intent.setData() intent.getData();
面试题三:说说Activity,Intent,Service是什么关系?
他们是系统不同的组件,默认情况下是没有什么关系的。这种问题,就讲下activity,讲一下service,说一下 通过intent去激活组件,传递数据.
说自己项目中有这样一个网络更新的功能,显示界面就用的activity, 后台有个service每隔半小时都去访问下服务器获取更新的数据
开启服务用的是intent来开启
面试题四:请描述一下Broadcast Receiver?
有很多广播接收者 ,系统已经实现了.广播分两种 :
有序广播:同步的
(根据优先级发广播,优先级高的可以把广播中止,这样优先级低的九阶和艘不到广播了,我们开发发短信的应用就用到了这个,因为级别是可以设定的,women把自己写的应用级别设定比系统短信应用级别高的话就可以屏蔽系统短信蹦出来),配置优先级可以这样配置:
指定接收者的广播 . 是不可以被拦截掉的
<intent-filter android:priority="1000"> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter>
无序广播:异步的
广播的应用场景很多,用于接收系统的广播通知, 系统会有很多sd卡挂载,手机重启,广播通知,低电量,来短信等,一个apk的安装成功。
面试题五:在manifest和代码中如何注册和使 用 broadcast receiver?
在清单里面注册就送定义一个receiver,然后指定它的intentFilter。例如:
<intent-filter android:priority="1000"> <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> </intent-filter> </receiver> <receiver android:name=".SmsReceiver"> <intent-filter android:priority="1000"> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver> <receiver android:name=".BootCompleteReceiver"> <intent-filter > <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
在代码里面注册就registerReceiver(receiver, filter);
如果代码中注册的代码没有执行,那这个receiver就不能接受到广播,同样,如果没有在清单文件配置也会收不到。
面试题六:请介绍下ContentProvider是如何实现数据共享的?
通过ContentProvider把自己的数据通过uri的形式共享出去,android 系统下 不同程序 数据默认是不能共享访问 ,要想访问,我们可以通过实现一个类去继承ContentProvider,然后复写里面的一些方法。
public class PersonContentProvider extends ContentProvider{ public boolean onCreate(){ //.. } query(Uri, String[], String, String[], String) insert(Uri, ContentValues) update(Uri, ContentValues, String, String[]) delete(Uri, String, String[]) } content:// 代表contentprovider
面试题七:介绍一下Android下的数据存储?
有好几种方式:
1.存文件文件 写文件需要权限. 访问sd卡需要sdcard权限。
默认文件存在/data/data/包名/files 内存里面
2.数据库 sqlite
3.存在SharedPreference里面,在<data>/<data>/包名/shared_preps下,其实打开后能看到就是用的xml形式存储的。
4.保存到网络上
网络 socket tcp 面向连接
http httpurlconnection
Android httpclient post get
ftp的网络 file transport protoco
面试题八:为什么要用ContentProvider?它和sql的实现上有什么差别?
好处一:屏蔽数据存储的细节,对用户透明,用户只需要关心操作数据的uri就可以了,对应的参数 .
好处二:不同app之间共享,操作数据。
面试题九:Android下的常用布局?
FrameLayout(帧布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)
FrameLayout
从屏幕的左上角开始布局,叠加显示, 实际应用 播放器的暂停按钮.
LinearLayout
线性布局,这个东西,从外框上可以理解为一个div,他首先是一个一个从上往下罗列在屏幕上。每一个LinearLayout里面又可分为垂直布局
(android:orientation="vertical")和水平布局(android:orientation="horizontal"
)。当垂直布局时,每一行就只有一个元素,多个元素依次垂直往下;水平布局时,只有一行,每一个元素依次向右排列。
面试题十:谈谈UI中, Padding和Margin有什么区别?
Padding 是文字对边框之间的距离, 而margin是控件与控件之间的距离。
面试题十一:在单线程模型中Message、Handler、Message Queue、Looper之间的关系?
当handler在主线程被创建的时候,会有一个messageQueue消息队列,然后就有一个Loopper轮询器调用prepare方法查询队列里面的数据,当受到子线程调用handler发送过来消息时,lpooer就查询到消息了,于是加入消息队列交给handler来处理。
子线程里面 显示土司
Looper.parepare()会在子线程里面创建一个looper,然后就能发消息了,但是当Looper.loop被调用的时候,下面的代码就不执行了,也就是在之后你就是写了发消息的指令也不会发出去。原因是当前子线程里面已经有了一个looper了,它会把消息发给子线程的looper。
Looper.parepare(); Toast.makexxxxx.show(); Looper.loop();