深圳市万利机械科技有限公司官网! 收藏本站 联系方式 关于优盈娱乐
首页-优盈娱乐-注册登录站

定制高速高光机、精雕机设备研发生产厂家

寿命长达10年,精准度达0.01MM,效率高

免费打样咨询:
400-123-4567
当前位置: 首页 > 优盈资讯 > 公司动态

Android笔试面试题(一)

文章作者:佚名 人气:发表时间:2024-05-20 19:48:12

面试心得:

    如果你只是想做简单的android应用开发人员,你只要准备一下Java知识(多线程,Socket通信等),然后在对Android略知一二(如Android架构,Activity的理解,以及一个应用的生命周期等等).这些我相信可以应付过去了. 

    但是如果你想做更底层的开发,比如嵌入式开发(Android驱动开发等),那么你就要懂得多一些知识了,毕竟这年头Arm+Android还是很有搞头的.这个你就要懂Linux,Arm,C,C++等知识了,毕竟这方面的要求还是蛮高的.大家可以买个arm开发板,然后自己把android移植进去,做一些驱动开发,和应用开发,这样你去应聘直接把你的东西带过去,还是更有说头的.


1 Activity的生命周期

    下面是周期的流程图:

        


过程解释如下:

  1).启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。

  2).当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。

  3).当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。

  4).当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。

  5).用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。

  6).当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。

  7).用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。


2 横竖屏切换时activtiy的生命周期变化

  1)、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

  2)、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

  3)、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法


3 android单线程模型(UI线程)

   当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件。所以主线程通常又被叫做UI线程。响应系统回调的方法(比如响应用户动作的onKeyDown()和各种生命周期回调)永远都是在UI线程里运行。如果UI线程耗时操作的时间太长(大约超过5秒),用户就会看到ANR(application not responding)的对话框。

  在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行(Android禁止其他子线程来更新由UI thread创建的视图,只能用android的异步线程来更新,例如handlerasynctask)。所以Android的单线程模型有两条原则:

  1.不要阻塞UI线程。

  2.不要在UI线程之外访问Android UI toolkit(主要是这两个包中的组件:android.widgetand android.view)。


4 如何更新UI线程中的UI?

   处理UI更新的两种方法:handler和AsyncTask,Android之所以有HandlerAsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。

1)Handler

    原理图:

创建消息:




发送消息:


处理消息:


2) AsyncTask相对来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可实现。

  AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。 
  1) 子类化AsyncTask 
  2) 实现AsyncTask中定义的下面一个或几个方法 
    onPreExecute():该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。 

       doInBackground(Params...):将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。 
    onProgressUpdate(Progress...):在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。 
    onPostExecute(Result):在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread. 

   为了正确的使用AsyncTask类,以下是几条必须遵守的准则: 
  1) Task的实例必须在UI thread中创建 
  2) execute方法必须在UI thread中调用 
  3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法 
  4) 该task只能被执行一次,否则多次调用时将会出现异常 
      doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。

       最后需要说明AsyncTask不能完全取代线程,在一些逻辑较为复杂或者需要在后台反复执行的逻辑就可能需要线程来实现了。

5 android中的五种进程

1.Foreground Process(前台进程): 
前端的进程状态: 
正处于Activity Resume()状态 
正处于与bound服务交互状态 
正处于服务在前台运行的状态,(startForeground()被调用,例如:播放音乐) 
Service生命周期函数正在被执行(onCreate(),onStart(),onDestory()) 
BroadcastReceiver正在执行onReceive()方法 
杀死Foreground Process需要用户响应-因为这个安全优先级最高 
2.Visible Process (可见进程)
显示进程:Activity不再前端显示.但是也没有完全隐藏,能够看得见,比如弹出一个对话框。(Input Methed) 
3.Service Process (服务进程)
在运行的非Foreground,Visible的进程。 
4.Background Process (后台进程)
不可见状态哦Activity进程(onStop()被调用) 
5.Empty Process(空进程)

没有运行任何Compuments的进程,保留这个进程主要是为了缓存的需要。android五个进程等级


6  android虚拟机(Dalvik)

   编译、链接和签名的整个过程如下:

流程图解释如下:
1)使用aapt工具生成R.java文件
     R.java文件的作用是提供给程序访问资源的入口。
2)使用aidl工具将.aidl文件编译成.java文件
    AIDL是Android系统提供的一种进程间调用的方式,类似于IPC调用,通过aidl工具将使用Android Interface Definition Language描述的.aidl文件编译成包含java接口类的.java文件,然后进程间遵循这些接口进行相互调用。.aidl文件一般与程序源码文件存放在一起。
3)使用javac工具将.java文件编译成.class文件
    随后会在工程目录下的bin目录下生成.class文件。
4)使用dx.bat批处理将众多.class文件转换成一个.dex文件
   .dex文件是在Android的Dalvik虚拟机上运行的文件。
5)使用aapt工具打包资源文件
6)使用apkbuilder生成未签名的apk安装文件
   apkbuilder后面紧跟的路径是生成的apk安装文件的路径。
7)使用jdk中的jarsigner对apk安装文件进行签名

   签名的目的是保证应用程序的开发者的唯一性,签名需要的东西除了jarsigner工具外还有密钥文件,即.keystore文件。


附加内容--->Android应用程序创建和运行的过程(别人整理的图):

7 关于Dalvik虚拟机的几个问题

1)大部分jvm是基于栈的,而Dalvik是基于寄存器的。

     基于栈的机器必须使用指令来载入栈上数据,或是用指令来操纵数据,因此指令集更为庞大。但是对于寄存器指令而言,又必须指定源地址和目的地址,因此,基于寄存器的jvm单个指令更大。

2)所有的android线程都对应一个linux线程。

     每个Android Dalvik应用程序都运行在自己的沙盒里,不同的应用在不同的进程空间里运行。

3)Dalvik不遵循java SE和java ME的API规范,所以不支持AWT或者Swing。

4)Dalvik相当于java的JVM,.NET的CLI,Python、Perl、Ruby的Interpreter。Dalvik定义自己的字节码为VM的指令。


8  广播的两种注册方法

       静态注册:在AndroidManifest.xml中加上<receiver> 标签。

  动态注册:通过 Context.registerReceiver()方法进行注册。比如在onResume中注册,在onPause中注销。


 android的启动模式

1) Standared模式(默认)

我们平时直接创建的Activity都是这种模式的Activity,这种模式的Activity的特点是:只要你创建了Activity实例,一旦激活该Activity,则会向任务栈中加入新创建的实例,退出Activity则会在任务栈中销毁该实例。

2)SingleTop模式

这种模式会考虑当前要激活的Activity实例在任务栈中是否正处于栈顶,如果处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。

3)SingleTask模式

如果任务栈中存在该模式的Activity实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的newInstance()方法重用该Activity,使该实例处於栈顶位置,否则就重新创建一个新的Activity实例。

4)SingleInstance模式

当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用实例的newInstance()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity


10 Android的系统架构

                         

1)应用程序层(Application)

     Android平台不仅仅是操作系统,也包含了许多应用程序,诸如SMS短信客户端程序、电话拨号程序、图片浏览器、Web浏览器等应用程序。这些应用程序都是Java语言编写的,并且这些应用程序都是可以被开发人员开发的其他应用程序所替换,这点不同于其他手机操作系统固化在系统内部的系统软件,更加灵活和个性化。

2)应用程序框架层(Application Framework)

    应用程序框架层是我们从事Android开发的基础,很多核心应用程序也是通过这一层来实现其核心功能的,该层简化了组件的重用,开发人员可以直接使用其提供的组件来进行快速的应用程序开发,也可以通过继承而实现个性化的拓展。包含各种Manager管理器。

3)系统运行库层(Libraries和Android Runtime)

    从图中可以看出,系统运行库层可以分成两部分,分别是系统库和Android运行时。系统库是应用程序框架的支撑,是连接应用程序框架层与Linux内核层的重要纽带。 Android应用程序时采用Java语言编写,程序在Android运行时中执行,其运行时分为核心库和Dalvik虚拟机两部分。

4)Linux内核层 (Linux Kernel)

    Android是基于Linux2.6内核,其核心系统服务如安全性、内存管理、进程管理、网路协议以及驱动模型都依赖于Linux内核。












0 0

平台注册入口