Android 面试--小知识点

一、ANR是什么?如何避免?
在 Android 上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应
用程序无响应(ANR:Application Not Responding)对话框。用户可以选择让程序继续运行,但是,他们在使用你
的应用程序时,并不希望每次都要处理这个对话框。
不同的组件发生 ANR 的时间不一样,主线程(Activity、Service)是 5 秒,BroadCastReceiver 是 10 秒。

  解决方案:

将所有耗时操作,比如访问网络,Socket 通信,查询大量 SQL 语句,复杂逻辑计算等都放在子线程中去,然后
通过 handler.sendMessage、runonUITread、AsyncTask 等方式更新 UI。无论如何都要确保用户界面操作的流畅度。
如果耗时操作需要让用户等待,那么可以在界面上显示进度条。

二、如何判断是否有 SD 卡:

  通过如下方法:

Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
如果返回 true 就是有 sdcard,如果返回 false 则没有。

三、请介绍下 adb、ddms、aapt 的作用:

  adb 是 Android Debug Bridge ,Android 调试桥的意思,
  ddms 是 Dalvik Debug Monitor Service,dalvik 调试监视服务。

Android 的主要调试工具是 adb(Android debuging bridge),ddms 是一个在 adb 基础上的一个图形化工具。
adb,它是一个命令行工具。而 ddms 功能与 adb 相同,只是它有一个图形化界面。
对不喜欢命今操作方式的人来说是一个不错的选择。

  aapt 即 Android Asset Packaging Tool,在 SDK 的 build-tools 目录下。
  该工具可以查看,创建,更新 ZIP 格式的文档附件(zip, jar, apk)。也可将资源文件编译成二进制文件,尽管我们没有直接使用过该工具,但是开

发工具会使用这个工具打包 apk 文件构成一个 Android 应用程序

四、DVM 和 JVM 的区别?
a) dvm 执行的是.dex 文件,而 jvm 执行的是.class。Android 工程编译后的所有.class 字节码会被
dex 工具抽取到一个.dex 文件中。
b) dvm 是基于寄存器的虚拟机 而 jvm 执行是基于虚拟栈的虚拟机。寄存器存取速度比栈快的多,
dvm 可以根据硬件实现最大的优化,比较适合移动设备。
c) .class 文件存在很多的冗余信息,dex 工具会去除冗余信息,并把所有的.class 文件
整合到.dex 文件中。减少了 I/O 操作,提高了类的查找速度

五、谈一谈 Android 的安全机制
1、Android 是基于 Linux 内核的,因此 Linux 对文件权限的控制同样适用于 Android
在 Android 中每个应用都有自己的/data/data/包名 文件夹,该文件夹只能该应用访问,而其他应用则无权
访问。
2、Android 的权限机制保护了用户的合法权益
如果我们的代码想拨打电话、发送短信、访问通信录、定位、访问 sdcard 等所有可能侵犯用于权益的行为都
是必须要在 AndroidManifest.xml 中进行声明的,这样就给了用户一个知情权。
3、Android 的代码混淆保护了开发者的劳动成果。

六、Intent 传递数据时,可以传递哪些类型数据?
Intent 可以传递的数据类型非常的丰富,java 的基本数据类型和 String 以及他们的数组形式都可以,
除此之外还可以传递实现了 Serializable 和 Parcelable 接口的对象。

七、写 10 个简单的 linux 命令:

mkdir 创建文件夹
rmdir 删除文件夹
rm 删除文件
mv 移动文件
cp 拷贝文件
cat 查看文件
tail 查看文件尾部
more 分页查看文件
cd 切换当前目录
ls 列出文件清单
reboot 重启
date 显示日期
cal 显示日历
ps 查看系统进程相当于 windows 的任务管理器
ifconfig 配置网络

八、Activity、Intent、Service 以及他们之间的关系。

  Activity 负责界面的显示和用户的交互,Intent 封装了数据,可以实现 Activity 之间以及 Activity

和 Service 之间数据的传递。Service 运行在后台进程,一般我们会让给其运行一些后台任务,Activity
通过 StartService(Intent)或者 BindService(Intent)可以启动 Service。

九、DDMS 和 TraceView 的区别。

  DDMS 的全称是 Dalvik Debug Monitor Service,是 Android 开发环境中的 Dalvik 虚拟机调试

监控服务。TraceView 是程序性能分析器

十、 Fragment 跟 Activity 之间是如何实现值传递的?

   Activity 可以先获取 FragmentSupportManager 或者 FragmentManager,前者是

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

十一、ListView 的优化你们是怎么做的?

    ListView 的优化有多种多样的策略。在我们的项目中主要做了如下优化。1、重用ConvertView,

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

十二、说说你对泛型的了解?

泛型是 jdk5.0 版本出来的新特性,他的引入主要有两个好处:
第一,提高了数据类型的安全性,可以将运行时异常提高到编译时期,
比如 ArrayList 类就是一个支持泛型的类,这样我们给ArrayList 声明成什么泛型,
那么他只能添加什么类型的数据。

第二,也是我个人认为意义远远大于第一个的就是它实现了我们代码的抽取,大大简化了代码的抽取,
提高了开发效率。比如我们对数据的操作,如果我们有 Person、Department、Device 三个实体,
每个实体都对应数据库中的一张表,每个实体都有增删改查方法,这些方法基本都是通用的,
因此我们可以抽取出一个 BaseDao,里面提供 CRUD 方法,
这样我们操作谁只需要将我之前提到的三个类作为泛型值传递进去就 OK 了。而数据的安全性,
其实程序员本身通过主观意识是完全可以避免的,何况某些情况下,我们还真的想在 ArrayList
中既添加 String 类型的数据又添加 Integer 类型的数据。

十三、问:你知道 Java 的继承机制吗?
答:java 是单继承多实现呀。

    问:那你知道 java 为何这样设计吗?
答:为何 Java 这样设计,其实这也是我一直的一个小疑惑。不过我是这样理解的。我只能

用反证法,如果一个类继承了类 A 和类 B,A 和 B 都有一个 C 方法,那么当我们用这个子类对象调用 C
方法的时候,jvm 就晕了,因为他不能确定你到底是调用 A 类的 C 方法还是调用了 B 类的 C 方法。而
多实现就不会出现这样的问题,假设 A 和 B 都是接口,都有 C 方法,那么问题就能解决了,因为接口
里的方法仅仅是个方法的声明,并没有实现,子类实现了 A 和 B 接口只需要实现一个 C 方法就 OK 了,
这样调用子类的 C 方法时,Java 不至于神志不清。从另外一个方面考虑的话应该就是 Java 是严格的面
向对象思想的语言,一个孩子只能有一个亲爸爸。

十四、问:Java 的异常体系你知道吗?
答:知道呀,顶层是 Throwable 接口,往下分了两大类,一个 RunntimeException 另一个
是普通的 Exception。

问:那你知道这两类异常的区别吗?
    答:当然知道,java 的命名是见名知意的。从名字上我们也知道 RunntimeException 就是

运行时异常,在运行的时候才能被 jvm 发现导致程序的终止,而普通 Exception 必须进行 try、catch
处理,或者在方法上用 throws 声明。

十五、AIDL 的全称是什么?如何工作?能处理哪些类型的数据?

① Android Interface Definition Language
② AIDL 一般用于远程服务,也就是进程间通信。我们可以分服务端和客户端,服务端声明 AIDL 文件,
该文件命名为 xxx.aidl,ADT 会自动将 xxx.aidl 生成代码文件,代码文件提供了 aidl 中接口的实现。客
户端如果要使用服务端提供的服务需要将xxx.aidl文件放到客户端源代码目录下,然后生成xxx.java类,
客户端通过 bindService 的形参 ServiceConnection 的 onServiceConnected 获取到 Service 对象,
这个对象通过 Stub.asInterface(service)返回 aidl 的实现类。之后我们就可用调用这个 aidl 的实现
类。
③ 基本数据类型都可以,复杂对象也可以,只不过需要实现 Parcelable 接口。

十六、堆和栈的区别:

十七、接口和抽象类:

 抽象类:可以有抽象方法,也可以没有。
 接口:只能有抽象方法。他们都不能创建对象,需要被继承。

十八、请描述下 JVM 加载 class 文件的原理机制。

JVM 加载 class 是动态性的,也就是当“需要”的时候才会加载,这是也是为节约 JVM 内存来考虑
的。同时 JVM 的类加载是父类委托机制,这个机制简单来讲,就是“类装载器有载入类的需求时,会
先请示其 Parent 使用其搜索路径帮忙载入,如果 Parent 找不到,那么才由自己依照自己的搜索路径搜索类”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值