查看原文
其他

金三银四的面试黄金季节,Android面试题来了!

2018-03-13 yuer 终端研发部

【公众号回复“1024”,送你一个特别推送】

对于部分童鞋们来说,金三银四的跳槽季节,想必是在准备换个姿势吧!最近总结了一些常见的面试题,希望对于大家能有所帮助!

声明原创|本文为yuer授权发布,未经允许请勿转载

正文

首先我们分享一个Android知识图谱。一个价值5W的图,拿走不谢

下面是一些面试官基本必问的问题,请一定要去了解!

  • 基础知识 – 四大组件(生命周期,使用场景,如何启动)

  • java基础 – 数据结构,线程,mvc框架 通信 – 网络连接(HttpClient,HttpUrlConnetion),Socket

  • 数据持久化 – SQLite,SharedPreferences,ContentProvider

  • 性能优化 – 布局优化,内存优化,电量优化
    安全 – 数据加密,代码混淆,WebView/Js调用,https

  • UI– 动画

  • 其他 – JNI,AIDL,Handler,Intent等

  • 开源框架
    – Volley,Gilde,RxJava等(简历上写你会的,用过的)
    拓展 – Android6.0/7.0/8.0特性,kotlin语言,I/O大会

整理了部分面试题,带答案

1、Android本身的api并未声明会抛出异常,则其在运行时有无可能抛出 runtime异常,你遇到过吗?诺有的话会导致什么问题?如何解决?

会,比如nullpointerException。我遇到过,比如textview.setText()时,textview没有 初始化。会导致程序无法正常运行出现forceclose。打开控制台查看logcat信息找出最新 Android面试题异常信息并修改程序。

2、IntentService有何优点?

Acitivity的进程,当处理Intent的时候,会产生一个对应的Service; Android的进程 处理器现在会尽可能的不kill掉你 40 37008 40 14939 0 0 3622 0 0:00:10 0:00:04 0:00:06 3623;非常容易使用

3、如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存 当前状态?

重写onSaveInstanceState()方法,在此方法中保存需要保存的数据,该方法将会在 activity被回收之前调用。通过重写onRestoreInstanceState()方法可以从中提取保存好的数据

4、如何将一个Activity设置成窗口的样式。


<activity>中配置:android :theme="@android:style/Theme.Dialog"
另外 android:theme="@android:style/Theme.Translucent" 是设置透明


5、如何退出Activity?如何安全退出已调用多个Activity的Application?

对于单一 Activity 的应用来说,退出很简单,直接 finish()即可。

当然, 也可以用 killProcess()和 System.exit()这样的方法。
对于多个 activity

  • 1、记录打开的 Activity:每打开一个 Activity,就记录 下来。在需要退出时,关闭每一个 Activity 即可。

  • 2、发送特定广播:在需要结 束应用时,发送一个特定的广播,每个 Activity 收到广播后,关闭即可。

  • 3、递 归退出:在打开新的 Activity 时使用 startActivityForResult,然后自己加标 志,在 onActivityResult 中处理,递归关闭。为了编程方便,最好定义一个 Activity 基类,处理这些共通问题。

    但是要注意的是:
  • 在 2.1 之前,可以使用 ActivityManager 的 restartPackage 方法。
    它可以直接结束整个应用。在使用时需要权限
    android.permission.RESTART_PACKAGES。 注意不要被它的名字迷惑。
    可是,在 2.2,这个方法失效了。

  • 在 2.2 添加了一个新的方法,killBackground Processes(), 需要权限 android.permission.KILL_BACKGROUND_PROCESSES。可惜的是,它和 2.2 的 restartPackage 一样,根本起不到应有的效果。
    另外还有一个方法,就是系统自带的应用程序管理里,强制结束程序的方法,
    forceStopPackage()。它需要权限 android.permission.FORCE_STOP_PACKAGES。并且 需要添加 android:sharedUserId=”android.uid.system”属性

    同样可惜的是

    该方法是非公 开的,他只能运行在系统进程,第三方程序无法调用。 因为需要在 Android.mk 中添加 LOCAL_CERTIFICATE := platform。 而 Android.mk 是用于在 Android 源码下编译程序用的。从以上可以看出,

  • 在 2.2,没有办法直接结束一个应用,而只能用自己的办法间接办到。 现提供几个方法,供参考:

  • 1、抛异常强制退出: 该方法通过抛异常,使程序 Force Close。 验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出 Force Close 的窗口。

  • 2、记录打开的 Activity:
    每打开一个 Activity,就记录下来。在需要退出时,关闭每一个 Activity 即可。        

  • 3、发送特定广播: 在需要结束应用时,发送一个特定的广播,每个 Activity 收到广播后,关闭即可。

  • 4、递归退出 在打开新的 Activity 时使用 startActivityForResult,然后自己加标志,在 onActivityResult 中处理,递归关闭。

除了第一个,都是想办法把每一个 Activity都结束掉,间接达到目的。但是这样做同样不完 美。你会发现,如果自己的应用程序对每一个 Activity都设置了 nosensor,在两个 Activity 结束的间隙,sensor 可能有效了。但至少,我们的目的达到了,而且没有影响用户使用。 为了编程方便,最好定义一个 Activity基类,处理这些共通问题。

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

全称是:AndroidInterface Define Language

在 Android 中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到 Service.

在不同的进程中, 怎样传递对象呢?显然, Java中不允许跨进程内存共享.因此传递
对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE 中,采用RMI 的方式,可以通过序列化传递对象.在 Android 中, 则采用 AIDL 的方式. 理论上 AIDL 可以传递 Bundle,实际上做起来却比较麻烦。

  • AIDL(AndRoid 接口描述语言)是一种借口描述语言;

  • 编译器可以通过aidl 文件生成一段代
     码

  • 通过预先定义的接口达到两个进程内部通信进程的目的.

    • 如果需要在一个 Activity中, 访 问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数),

    • 然后使用 AIDL 来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.

  • AIDL 的 IPC 的机制和 COM 或 CORBA 类似, 是基于接口的,但它是轻量级的。

  • 它使用代 理类在客户端和实现层间传递值.

  • 如果要使用 AIDL, 需要完成  2 件事情:

  1. 引入AIDL 的相 关类.;

   2.调用aidl 产生的 class.

AIDL 的创建方法: AIDL

语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。   由于远程调用的需要, 这些参数和返回值并不是任何类型.
下面是些 AIDL 支持的数据类型:

    1、不需要 import 声明的简单 Java 编程语言类型(int,boolean 等)

    2、String, CharSequence 不需要特殊声明4

    3、List, Map 和 Parcelables 类型,这些类型内所包含的数据成员也只能是简单数据类型,

    4、String 等其他比支持的类型.



    7、请解释下Android程序运行时权限与文件系统权限的区别。

    运行时权限 Dalvik(android 授权)
    文件系统 linux 内核授权

8、系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。

通过直接发送 Uri 把参数带过去,或者通过 manifest 里的 intentfilter 里的 data 属性

9、android系统的优势和不足

10、Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念

DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥 有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认 为是同一个概念。

11、sim卡的EF文件是什么?有何作用

sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本 身可以有自己的操 作系统,EF就是作存储并和手机通讯用的

12、嵌入式操作系统内存管理有哪几种, 各有何特性

页式,段式,段页,用到了MMU,虚拟空间等技术

13、什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?

嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的 速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系 统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用 于工业控制、军事设备、 航空航天等领域对系统的响应时间有苛刻的要求,这 就需要使用实时系统。又可分为软实时和硬实时两种,而 android 是基于 linux 内核的,因此属于软实时。

14、一条最长的短信息约占多少byte?

中文70(包括标点),英文160,160个字节。

15、有一个一维整型数组int[]data保存的是一张宽为width,高为height的图 片像素值信息。请写一个算法,将该图片所有的白色不)像素点透明(0xffffffff 的透明度调整为50%。

16、如何将SQLite数据库(dictionary.db文件)与apk文件一起发布

可以将dictionary.db文件复制到Eclipse Android工程中的res aw目录中。所有在res aw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将dictionary.db文件 复制到res aw目录中

17、如何将打开res aw目录中的数据库文件?

在 Android 中不能直接打开 res aw 目录中的数据库文件,而需要在程序第一次启动时 将该文件复制到手机内存或 SD 卡的某个目录中,然后再打开该数据库文件。
复制的基本方法是使用 getResources().openRawResource 方法获得 res aw 目录中资源的InputStream 对象,然后将该 InputStream对象中的数据写入其他的目录中相应文件中。在 Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase 方法来打开任意目录中 的 SQLite 数据库文件。

18、DDMS和TraceView的区别?

DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是 程序性能分析器

19、java中如何引用本地语言 可以用JNI(java native interface java 本地接口)接口

20、谈谈Android的IPC(进程间通信)机制

  • IPC 是内部进程通信的简称,是共享”命名管道”的资源。

    • Android 中的 IPC 机制是为了 让 Activity 和 Service 之间可以随时的进行交互,故在 Android 中该机制,只适用于 Activity 和 Service 之间的通信,类似于远程方法调用,类似于 C/S 模式的访问。

    • 通过定义 AIDL 接 口文件来定义 IPC 接口。Servier 端实现 IPC 接口,Client 端调用 IPC 接口本地代理。

21、NDK 是什么

  • NDK 是一些列工具的集合

  • NDK 提供了一系列的工具,帮助开发者迅速的开发 C/C++的动 态库

  • 并能自动将 so 和 java 应用打成 apk 包。 - NDK 集成了交叉编译器,并提供了相应的 mk文件和隔离 cpu、平台等的差异

  • 开发人员 只需简单的修改 mk文件就可以创建出 so

22.一道简单不易的算法题

int  a = 10;  
       int b=5;
       怎么在不引入其他变量的情况下,让a和b互换?

   ```
   public class Test {
      int  a = 10;  
      int b=5;
   public static void main(String[] args) {
      a = a+b;
      b=a-b;
      a =a-b;
      System.out.println("b="+b);
      System.out.println("a="+a);
    }
   }
   ----输出:
   b=10
   a=5      

23.你最近几年的计划是什么?

24.你的项目中遇到了比较难以解决的问题?你又是如何解决的? (提示:考察的是你分析问题和解决问题的能力)

25.一些框架基本原理,设计模式的优势。

26.自我介绍,(逻辑清晰,不可自我矛盾)

27.你写过那些自定义组件?说一说是怎么使用的?

27.tinker热修复的基本原理 : 一定要形成自己的话术

28.性能优化

29.JVM和Dalvik虚拟机的工作原理

30.APP的启动过程

部分答案为整理,见后续!

最后希望大家能在新的一年里工作顺利,找一个称心如意的工作!

阅读更多

Python探究之旅—Python语言的基本认识

来一起愉快的开始Python吧

 一招教你读懂JVM和Dalvik之间的区别

一招教你打造一个滑动置顶的视觉特效

NDK项目实战—高仿360手机助手之卸载监听

最新2017(Android)面试题级答案(精选版)

相信自己,没有做不到的,只有想不到的

在这里获得的不仅仅是技术!


日   更   精   彩

微  信  号:codeGoogler

终端研发部


如果你觉得此文对您有所帮助,可以转发给身边的朋友,一起做一个乐于分享的小猿猿


            

这里学到不仅仅是技术

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存