1. 请描述下Activity的生命周期
答:创建 onCreate- 启动onStart – 开始onResume – 暂停 onPause – 结束onStop – 销毁onDestroy
2. 如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
答:onSaveInstanceState()
当你的程序中某一个Activity A在运行时,主动或被动地运行另一个新的ActivityB,这个时候A会执行onSaveInstanceState()。B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;而没被收回的就直接执行onRestart()->onStart()->onResume(),跳过onCreate()了。
3. 如何将一个Activity设置成窗口的样式。
答:两种方法:
l 在AndroidManifest.xml设置当前Activity的一个主题属性
android :theme="@android:style/Theme.Dialog"
或者android:theme="@android:style/Theme.Translucent"
l 通过修改Theme.Dialog主题的android:windowBackground属性值可以改变Activity的背景图像
style.xml下增加以下内容
<style name= “MyTheme” parent= “@android:style/Theme.Dialog>
<item name= “android:windowBackground”>@drawable/msg_background</item>
</style>
在manifest.xml中直接指定Activity的theme就行了
<activity android:name= “.MainActivity” android:label= “@string/app_name”android:theme= “@style/MyTheme”>
<intent-filter>
<actionandroid:name= “android.intent.action.MAIN”/>
<categoryandroid:name= “android.intent.category.LAUNCHER”/>
</intent-filter>
</activity>
4. 按下返回键与Home键的区别。
答:back键默认行为是finish处于前台的Activity的,即Activity的状态为Destroy状态为止,再次启动该Activity是从onCreate开始的(不会调用onSaveInstanceState()方法)。Home键默认是stop前台的Activity即状态为onStop为止,而不是Destroy,若再次启动它,会调用onSaveInstanceState()方法,保持上次Activity的状态则是从OnRestart开始的---->onStart()--->onResume()。
5. 请介绍下Android中常用的几种布局。
答:
1、 LinearLayout– 线性布局。
orientation – 容器内元素的排列方式。vertical: 子元素们垂直排列;horizontal: 子元素们水平排列
gravity – 内容的排列形式。常用的有 top, bottom, left, right, center 等
2、AbsoluteLayout – 绝对布局。
layout_x – x 坐标。以左上角为顶点
layout_y – y 坐标。以左上角为顶点
3、TableLayout – 表格式布局
表格布局主要以行列的形式来管理子控件,其中每一行即一个TableRow对象,每个TableRow对象可以添加子控件,并且每加入一个空间即相当于添加了一列
4、RelativeLayout – 相对布局。
layout_centerInParent – 将当前元素放置到其容器内的水平方向和垂直方向的中央位置(类似的属性有:layout_centerHorizontal,layout_alignParentLeft 等)
layout_marginLeft – 设置当前元素相对于其容器的左侧边缘的距离
layout_below – 放置当前元素到指定的元素的下面
layout_alignRight – 当前元素与指定的元素右对齐
5、FrameLayout – 层叠布局。以左上角为起点,将 FrameLayout 内的元素一层覆盖一层地显示,在帧布局中,先添加的图片会被后添加的图片覆盖。
6. 请介绍下Android的数据存储方式,以及优缺点。
Ø SharedPreferences方式
用来存储”key-value paires”格式的数据,它是一个轻量级的键值存储机制,只可以存储基本数据类型,可以通过它保存一些上次用户所做的修改操作
Ø 文件存储方式
它通过FileInputStream和FileOutputStream对文件进行操作。但是在Android中,文件是一个应用程序私有的,一个应用程序无法读写其他应用程序的文件,如果要共享数据就用Content Providers
Ø SQLite数据库方式
Android提供的一个标准的数据库,支持SQL语句
Ø 内容提供器(Contentprovider)方式
是所有应用程序之间数据存储和检索的桥梁,它的作用是使得各个应用程序之间实现数据共享
Ø 网络存储方式
通过网络来存储和获取数据
7. 请介绍下ContentProvider是如何实现数据共享的。
答:一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露。Contentproviders存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。要想使应用程序的数据公开化,可通过2种方法:创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Content provider中,前提是有相同数据类型并且有写入Contentprovider的权限。
8. 如何启用Service,如何停用Service.
答:
1.第一种是通过调用Context.startService()启动,调用Context.stopService()结束,startService()可以传递参数给Service
2.第二种方式是通过调用Context.bindService()启动,调用Context.unbindservice()结束,还可以通过ServiceConnection访问Service。
在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。
9. 注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。
答:注册广播有两种方式:
1、在应用程序的代码中注册
注册BroadcastReceiver:
registerReceiver(receiver,filter);
取消注册BroadcastReceiver:
unregisterReceiver(receiver);
当BroadcastReceiver更新UI,通常会使用这样的方法注册。启动Activity时候注册BroadcastReceiver,Activity不可见时候,取消注册。
2、在androidmanifest.xml当中注册
<receiver>
<intent-filter>
<action android:name="android.intent.action.PICK"/>
</intent-filter>
</receiver>
使用这样的方法注册弊端:它会始终处于活动状态,毕竟是手机开发,cpu和电源资源比较少,一直处于活动耗费大,不利。
引入广播机制的用意:
a:引入广播机制可以方便几大组件的信息和数据交互。
b:程序间互通消息(例如在自己的应用程序内监听系统来电)
c:效率上(参考UDP的广播协议在局域网的方便性) d:设计模式上(反转控制的一种应用,类似监听者模式
10.Android如何进行进程间通信,怎么实现?
答:Android提供了AIDL来实现进程间通信(IPC),AIDL全称为Android Interface Definition Language。
简历里AIDL服务的具体步骤如下:
1. 在Eclipse Android工程中的Java源文件目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码,但会稍有不同。
2. 如果aidl文件的内容正确的话,ADT会自动生成一个Java接口文件(*.java).
3. 建立一个服务类(Service的子类)
4. 实现由aidl文件生成的Java接口。
5. 在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,<action>标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类构造方法的参数值。
11.Android提供给第三方调用的方式有哪几种,优缺点分别是什么?
答:第三方调用的方式?不理解是什么!
12.什么是ANR,如何避免ANR?
答:
ANR:ApplicationNot Responding,五秒在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当出现下列情况时,Android就会显示ANR对话框了:
对输入事件(如按键、触摸屏事件)的响应超过5秒
意向接受器(intentReceiver)超过10秒钟仍未执行完毕
Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。因为此时,你的应用程序已经没有机会去响应输入事件和意向广播(Intent broadcast)。
因此,任何运行在主线程中的方法,都要尽可能的只做少量的工作。特别是活动生命周期中的重要方法如onCreate()和 onResume()等更应如此。潜在的比较耗时的操作,如访问网络和数据库;或者是开销很大的计算,比如改变位图的大小,需要在一个单独的子线程中完成 (或者是使用异步请求,如数据库操作)。但这并不意味着你的主线程需要进入阻塞状态已等待子线程结束 — 也不需要调用Therad.wait()或者Thread.sleep()方法。取而代之的是,主线程为子线程提供一个句柄(Handler),让子线程在即将结束的时候调用它(xing:可以参看Snake的例子,这种方法与以前我们所接触的有所不同)。使用这种方法涉及你的应用程序,能够保证你的程序对输入保持良好的响应,从而避免因为输入事件超过5秒钟不被处理而产生的ANR。这种实践需要应用到所有显示用户界面的线程,因为他们都面临着同样的超时问题。
13.如果实现一个web app来调用本地的通讯录功能?
答: 没有使用webapp来调用本地的通讯录功能,不知道如何解答。