您的位置:首页 > 职场人生

面试题(Android 基础部分)

2016-12-30 13:43 288 查看
Q:如何将一个 Activity 设置成窗口模式?

A:将 Activity 的样式设置成:android:theme=”@android:style/Theme.Dialog

Q:如何适配不同屏幕分辨率的机型?

A:屏幕适配方式就多了去了。Android 系统本身提供了很多适配方法,比如存放图片资源的 drawable 目录根据不同分辨率的手机提供了 drawable-hdpi、drawable-ldpi、drawable-mdpi、 drawable-xhdpi 等多中目录。我们只需把适应不同分辨率的多套图片分别放到对应的目录中即可。 Android 的 layout、values 目录也提供了类似 drawable 的适配功能。

但是在开发中,不可能针对不同的手机分辨率提供多种图片资源,这太耗费资源了。我们一般在写 控件宽高的时候都会用 dp 单位取代 pix 单位。因为 dp 是一个相对单位,pix 是绝对单位,使用 dp 替 代 pix 也可以解决很多适配问题。dp 跟 pix 之间可以通过公式进行转换。

Q:请描述下 Activity 的生命周期? A:onCreate、onStart、onResume、onPause、onStop、onDestroy、onRestart。

、、我(阳哥)答:Activity 有以下生命周期回调方法,比如常用的有 onCreate、onStart、onResume、 onPause、onStop、onDestroy、onRestart。默认情况下,如果我们不给 Activity 设置横竖屏配置信 息的话,在横竖屏切换时会将一个 Activity 销毁掉然后重新创建。

Q:如何退出 Activity?如何安全退出已调用多个 Activity 的 Application?

A:调用 Activity 的 finish 方法可以退出当前 Activity。可以自定义一个 Application,在 Application 中声明一个成员变量 ArrayList 用于存放打开的 Activity,当退出时遍历 ArrayList,依次调用 Activity 的 finish 方法。

Q:DDMS 和 TraceView 的区别。

A:DDMS 的全称是 Dalvik Debug Monitor Service,是 Android 开发环境中的 Dalvik 虚拟机调试 监控服务。TraceView 是程序性能分析器

Q:说说 Activity、Intent、Service 以及他们之间的关系。

A:Activity 负责界面的显示和用户的交互,Intent 封装了数据,可以实现 Activity 之间以及 Activity 和 Service 之间数据的传递。Service 运行在后台进程,一般我们会让给其运行一些后台任务,Activity 通过 StartService(Intent)或者 BindService(Intent)可以启动 Service。

Q:请介绍一下 ContentProvider 是如何实现数据共享的。

A:我们可以定义一个类继承 ContentProvider,然后覆写该类的 insert、delete、update 等方法,在 这些方法里访问数据库等资源。同时将我们 ContentProvider 注册在 AndroidManifest 文件中,其他 应用需要使用的时候只需获取 ContentResolver,然后通过 ContentResolver 访问即可。

Q:那 Fragment 跟 Activity 之间是如何实现值传递的?

A:Activity 可以先获取 FragmentSupportManager 或者 FragmentManager,前者是 v4 包下的,向下兼容因此用的比较多。然后这些 Manager 通过 Fragment 的 tag 或者 id 调用 findFragmentByTag(“tag”),findFragmentById(“id”)找到我们需要的 Fragment 对象,然后通过调 用 Fragment 对象的方法来进行值的传递。

Q:用过哪些自定义控件吗?

自定义控件做过,比如我们项目中的 SlideMenu,LazyViewPager,Pull2RefreshListView, VerticalSeekbar,RandomLayout 等都是自定义控件。

Q:那你说说 View 的绘制过程?

A:View 绘制是从根节点(Activity 是 DecorView)开始,他是一个自上而下的过程。View 的绘制经历三个过程:Measure、Layout、Draw。

Q:ListView 的优化你们是怎么做的?

ListView 的优化有多种多样的策略。在我们的项目中主要做了如下优化。1、重用 ConvertView,2、给 ConvertView 绑定 ViewHolder,3、分页加载数据,4、使用缓存。前两个是通用的解决方案,后两个是针对我们业务的个性化解决方案。我们的数据来自服务端,如果服务端有 1000 条数据的话,我们客户端不可能傻瓜式的一次性用 ListView 把这些数据全部加载进来,因此我们就用 分页加载数据,每次加载 20 页,当用户请求更多的时候再获取更多数据,网络的访问就算网速再快也 多多少少会有一定的延迟,因此我们的网络请求是异步处理的,同时从网络加载来的数据使用了 2 级缓 存来处理,第一级是内存级别的缓存,第二级是本地文件的缓存。当 ListView 加载数据的时候首先从 内存中找,如果找不到再去本地文件中找,只有都找不到的情况下才去请求网络。

Q:我们的项目中有多个 Fragment,Fragment A 跳转到 Fragment B,Fragment B 跳转到 FragmentC,那么这时候我多次按返回键,如何能让 Fragment 跟 Activity 的任务栈一样,依次从 FragmentC 跳转到 FragmentB,再跳转到 FragmentA?

A:这个需求应该很好实现。我们可以这样,首先定义一个 BaseFragment,让 FragmentA、 FragmentB、FragmentC 都继承 BaseFragment,第二在 BaseFragment 中定义一个 ArrayList,每 打开一个 Fragment,把这个 Fragment 对象添加到 ArrayList 中,这样这个 ArrayList 就可以当做一个 栈结构,第三我们需要设置返回键监听,当监听到返回键的时候,查看当前 ArrayList 中倒数第二个 Fragment 有没有 Fragment,如果有则取出该 Fragment 并把 ArrayList 中末尾 Fragment 删除,然 后用 FragmentManager 的 Replace 方法,将当前 Fragment 替换成最新 Fragment 即可,如果 ArrayList 中只有一个 Fragment,且监听到了返回键,那就不对 Fragment 做处理,同时也不拦截该事 件,这样也不会影响其他 Activity 之间的切换。

Q: MD5 的原理吗?

A:MD5 算以 512 位分组来处理输入的信息,且每一分组又被划分为 16 个 32 位子分组, 经过了复杂处理后,输出由四个 32 位分组组成,将这四个 32 位分组级联后将生成一个 128 位散列值。 这个过程是不可逆的,我们也把他叫做数据指纹,但是我们依然对用户的输入进行安全校验,如果是纯 数字类型密码,是不允许注册的,因此就算你 MD5 加密了,黑客也可以通过彩虹碰撞的形式进行暴力 破解。

Q:Activity 销毁前,如何保存 Activity 的状态?

A:可以使用 onSaveInstanceState(Bundle)方法将 Activity 中需要的数据保存起来,当下次重新启 动 Activity 的时候在 onCreate(Bundle)中获取 Bundle 数据。

Q:请介绍一下 handler 机制?

A:Android 中 handler 多用于主线程和子线程之间的通信,比如在 Android 中子线程是不允许修改 UI 的,如果修改只能让子线程给主线程通过 handler 发送 message,然后主线程进行修改。Handler 整个机制的实现,还依赖 Looper、Message 两个核心内容。在主线程中 Android 默认给我们创建了 Looper

Q:java 如何调用 c、c++语言?

A:java 通过 JNI 调用 C/C++代码,在使用的时候首先通过 System.loadLibrary(“xxx”)将 xxx.so 文件 加载到 jvm 中,同时在类中必须对 so 文件中的方法进行生命,格式:public native void test();

Q:Android 分几层,分别是什么?

A:四层。Linux Core、Libraries(Android Runtime)、Application Framework、Applications。 Q:final、finally、finalize 的区别?

A:第一个是关键字最终,用 final 修饰的类为最终类,不能被继承,修饰的方法不能被覆写,修饰的变 量不能被改变。finally 是异常体系中的关键字,当系统遇到异常是,在进行 trycatch 的时候,finally 代码块里的代码是必须被执行的。finalize 是 Object 类中的方法,当 GC 回收对象时回调的方法。

Q:View 和 ViewGroup 的关系是什么?View 的绘制过程(主要方法)有哪些?

A:ViewGroup 继承了 View。onMesure、onLayout、onDraw。

Q:Activity 和 Task 的区别及启动模式有哪些?

A:Activity 运行 Task 中。Activity 有四种启动模式。standard、singleTop、singleTask、singleInstance。 standard:默认的启动模式,多个 Activity 位于同一 Task 中。singleTop,顾名知义就是 Task 栈顶只 能有一个相同的 Activity,singleTask 就是一个 Task 中只有一个 Activity,singleInstance 就是一个 Activity 独享一个 Task。

PS:关于 Activity 的四种启动模式其实还有更详细的说法,我在上面就简单介绍一下了,如果面试官需 要问的更详细再往深处介绍就行了。

Q:如何注册 BroadCastReceiver 和 Service?Service 有什么特征,哪些情况会用到 Service? A:都可以通过 AndroidManifest.xml 进行静态注册。不过 B
4000
roadCastReceiver 可以在代码中通过 registReceiver 方法来注册。Service 运行在后天进程中,一般需要在后台一直运行的任务会让 Service 来完成。比如我们的 telephoneService、locationService 等等。

Q:Android 有哪些安全机制?

A:权限机制。我们的应用只要涉及到了用户的隐私、网络都需要在 AndroidManifest.xml 中进行声明, 这样用户在安装的时候可以根据你申请的权限进行判断是否允许应用的某些行为。

Q:Handler 机制的原理,内部是如何实现的?

A:Android 中 handler 多用于主线程和子线程之间的通信,比如在 Android 中子线程是不允许修改 UI 的,如果修改只能让子线程给主线程通过 handler 发送 message,然后主线程进行修改。Handler 整个机制的实现,还依赖 Looper、Message 两个核心内容。在主线程中 Android 默认给我们创建了 Looper,当我们通过 handler.sendMessage()后,该消息被添加到 MessageQueue 中,Looper.looper

Q:Thread 和 AsyncTask 的区别是什么?

A:AsyncTask 是封装好的线程池,比起 Thread+Handler 的方式,AsyncTask 在操作 UI 线程上更方 便,因为 onPreExecute()、onPostExecute()及更新 UI 方法 onProgressUpdate()均运行在主线程中, 这样就不用 Handler 发消息处理了;

Q:Serializable 和 Parcelable 的区别

1.在使用内存的时候,Parcelable 类比 Serializable 性能高,所以推荐使用 Parcelable 类。

2.Serializable 在序列化的时候会产生大量的临时变量,从而引起频繁的 GC。

3.Parcelable 不能使用在要将数据存储在磁盘上的情况。尽管 Serializable 效率低点,但在这种情况下,还是建

议你用 Serializable 。 实现:

1 Serializable 的实现,只需要继承 Serializable 即可。这只是给对象打了一个标记,系统会自动将其序列化。

2 Parcelabel 的实现,需要在类中添加一个静态成员变量 CREATOR,这个变量需要继承 Parcelable.Creator 接 口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: