干货 干货 2019阿里巴巴Android40道基本面试题

|▌冷眼眸甩不掉的悲伤 提交于 2020-04-24 23:29:42

找工作还是需要大家不要经常,有我们干这一行的接触人本来就不多 难免看到面试官会紧张,主要是因为怕面试官问的问题到不上来,那时候不要着急 ,答不上了的千万不然胡扯一些,直接就给面试官说这块我还没接触到,以后如果工作当中遇到的话我可以很快的吧这个问题给解决了,但是我们有了这篇文章,就不一样了,基本上问的问题都有适当的看一下,到时候很快就可以拿到  offer 我在这里祝大家工作顺利,天天开心 ,好了下面就是正题,

1. Tcp和http 的区别
  Tcp是在网络层,http是在服务层.Http借助Httpclient和urlconnenticon是短连接 ,请求一次后就断开了需要 重新请求才能连接
  Tcp借助是socket,长连接需要三次握手,第四次握手才能取消连接

2 .存储数据有哪些方式
  文件存储,
  sharedpreference存储,
  sqllite存储 ,
  contentprivider存储 ,
  网络存储

3. 如何将一个Activity设置成窗口的样式。
可以自定义一个activity的样式,详细见手机卫士的程序详细信息
android:theme="@android:style/Theme.Dialog"

4.如何退出Activity?如何安全退出已调用多个Activity的Application? 
  每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。
  在application 全集的环境里面 
  List<Activity> lists = new ArrayList<Activity>();
  每一个activity在执行oncreate()方法的时候 lists.add(this);
  Ondestory()中执行 lists.remove(this);
  退出的时候得到在application的lists执行,执行下面方法
  for(Activity activity: lists)
  {
    activity.finish();
  }

5. 两个Activity之间怎么传递数据?
  基本数据类型可以通过.Intent 传递数据 
  Bundle bundle = new Bundle();
  bundle.putShort(key, value);
  intent.putExtras(bundle);
  获取到激活他的 getIntent();
  Intent intent = getIntent();
  Bundle bundle = intent.getExtras();
  Bundle 类似map的集合 
  intent.getStringExtra("key","value");

6. Activity怎么和service绑定,怎么在activity中启动自己对应的service?
  startService() 方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。 stopService停止 
  bindService () 把service 与调用者绑定 ,如果调用者被销毁, service会销毁 //unbindService(conn);//解除绑定
  onCreate, onStart, onDestroy,

7 . 什么时候使用service
  1.Service的特点可以让他在后台一直运行,可以在service里面创建线程去完成耗时的操作. 后台播放音乐,
  录音通话记录
  2.Broadcast receiver捕获到一个事件之后,可以起一个service来完成一个耗时的操作.

8. Intent传递数据时,可以传递哪些类型数据?
  1.一般的基本数据类型 Intent .putextra() intent.getStringextra();
  2. 数据的uri, intent.setData() intent.getData();

9.请描述一下Broadcast Receiver。
  有很多广播接收者 ,系统已经实现了,监听一些事件:如接收到短信 ,打出去电话
  广播分两种 
  有序广播 可被拦截,可终止,可以修改数据
  无序广播 是不可以被拦截掉的 


10. 请介绍下ContentProvider是如何实现数据共享的。 
  android 系统下不同程序 数据默认是不能共享访问 
  把自己的数据通过uri的形式共享出去(查看短信,查看通讯录联系人)
  1.看urlmarcher. 
  2. 根据匹配码 查看增删改查的具体实现 

11. 为什么要用ContentProvider?它和sql的实现上有什么差别?
  屏蔽数据存储的细节,对用户透明,用户只需要关心操作数据的uri就可以了,对应的参数 .

12. 请介绍下Android中常用的五种布局。
  LinearLayout(线性布局),RelativeLayout(相对布局),FrameLayout(帧布局),
  AbsoluteLayout(绝对布局),TableLayout(表格布局)

13.谈谈UI中, Padding和Margin有什么区别?
  Padding 文字对边框内间距, margin是控件与控件之间的距离,外间距

14. widget相对位置的完成在activity的哪个生命周期阶段实现。
  widget可以理解成桌面小控件, 
  也可以理解成 某个button, imageview这样的控件…
  onmeasure() // 计算 控件在屏幕上的位子 
15.activity的生命周期。 
  activity主要生命周期的方法说明: 
  onCreate(Bundle savedInstanceState):创建activity时调用。设置在该方法中,还以Bundle的形式提供对以前储存的任何状态的访问! 
  onStart():activity变为在屏幕上对用户可见时调用。 
  onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。 
  onPause():activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧! 
  onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。 
  onRestart():重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。 
  onDestroy():activity被完全从系统内存中移除时调用,该方法被

16 .在Android中,怎么节省内存的使用,怎么主动回收内存?
  尽量多使用内部类 提高程序效率 
  回收已经使用的资源, 
  合理的使用缓存 
  合理设置变量的作用范围 application 对象 

17. dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念
  Dvm的进程是dalivk虚拟机进程,每个android程序都运行在自己的进程里面,
  每个android程序系统都会给他分配一个单独的liunx uid(user id), 
  每个dvm都是linux里面的一个进程.所以说这两个进程是一个进程.

18. 谈谈Android的优点和不足之处。
  1、开放性,开源 ophone 阿里云( 完全兼容android) 乐os 
  2、挣脱运营商束缚 
  3、丰富的硬件选择 mtk android 
  4、不受任何限制的开发商
  5、无缝结合的Google应用
  缺点也有5处:
  1、安全问题、隐私问题 
  2、卖手机的不是最大运营商 
  3、运营商对Android手机仍然有影响
  4、山寨化严重
  5、过分依赖开发商,缺乏标准配置 版本过多 

19. 什么是ANR 如何避免它?
  主线程被阻塞的时候,会出现5秒超时的异常 在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称  作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择让程序继续运行,但是,他们在使用你的应用程序时,并不希望每次  都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。
  Activity 5秒 broadcast10秒 
  耗时的操作 worker thread里面完成,
  handler message…AsynsTask , intentservice.等…

20. android中的动画有哪几类,它们的特点和区别是什么? 
  两种,一种是Tween动画、还有一种是Frame动画。
  Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;
  另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。

21.java中的soft reference是个什么东西
  StrongReference 是 Java 的默认引用实现,
  它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收

22,udp连接和TCP的不同之处
  tcp/滑动窗口协议. 拥塞控制. 可靠的连接 ,三次握手
  udp 不关心数据是否达到,是否阻塞,不可靠的连接
  画面优先. tcp 
  流畅优先 udp

23.handler机制的原理 
     是一个消息的处理者, 是满足线程间的通讯,和传递一些信息
    Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。 
    1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。 
    2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;
  或者接收Looper从Message Queue取出)所送来的消息。 
    3) Message Queue(消息队列):用来存放线程放入的消息。 
    4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。

24.AsycTask与一般线程异步之间的差别
  1)是因为AsyncTask使用了线程池技术,而且其中的方法很容易实现调用
  2)是因为AsyncTask可以调用相关的方法,在开启子线程前和后,进行界面的更新
  3)是因为一旦任务多了,不用每次都new新的线程,可以直接使用
25. ListView如何提高其效率?
  复用convertview , 复用历史的view对象 
  Static class ViewHolder 
  使用静态的view对象 避免创建过多的view,减少findViewByid
  异步加载数据, 可以使用,分批或分页加载数据, onscallLinster()监听;
  把下载后的数据缓存到数据库里 
  客户端和服务器 协同 作战 .
  Http 请求 
26. 图片的优化
  异步加载图片
  图片的压缩处理bitMapFactory.options
  设置内存的大小
  缓存在内存,缓存在SD卡, 取的时候先从内存中取 ,在去SD卡取 ,没有的话,去网上取
27.屏幕的适配
  文字使用SP ,控件使用dp ,weight
  多布局, 里面加不同的dimens.xml
  图片有要求的话,采用多图片处理
28.Activity的启动模式
  1. standard 默认标准的启动模式, 每次startActivity都是创建一个新的activity的实例。
      适用于绝大大数情况
  2. singleTop 单一顶部,如果要开启的activity在任务栈的顶部已经存在,就不会创建新的实例,
      而是调用 onNewIntent() 方法。
      应用场景: 浏览器书签。 避免栈顶的activity被重复的创建,解决用户体验问题。
  3. singletask 单一任务栈 , activity只会在任务栈里面存在一个实例。如果要激活的activity,在
      任务栈里面已经存在,就不会创建新的activity,而是复用这个已经存在的activity,
      调用 onNewIntent() 方法,并且清空当前activity任务栈上面所有的activity
      应用场景:浏览器activity, 整个任务栈只有一个实例,节约内存和cpu的目的
      注意: activity还是运行在当前应用程序的任务栈里面的。不会创建新的任务栈。

  4. singleInstance 单态 单例模式
    单一实例,整个手机操作系统里面只有一个实例存在。不同的应用去打开这个activity
    共享 公用的同一个activity。
    他会运行在自己单独,独立的任务栈里面,并且任务栈里面只有他一个实例存在。
    应用场景:呼叫来电界面 InCallScreen

29.注册广播哪几种方法
  2种 ,
  1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。registerReceiver
  2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。一种是在AndroidManifest.xml中配置广播

30.横竖屏切换时候activity的生命周期? 
  1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,
    切横屏时会执行一次,切竖屏时会执行两次
  2、设置Activity的android:configChanges="orientation"时,
    切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次 
  3、设置Activity的android:configChanges="orientation|keyboardHidden"时,
    切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法 

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

32.说说mvc模式的原理,它在android中的运用 
   MVC(Model_view_contraller)”模型_视图_控制器”。 
   MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model
   传递到view上

33、 你后台的Activity被系统回收怎么办:

  onSaveInstanceState
34.Framework工作方式及原理,Activity是如何生成一个view的,机制是什么。
  反射 , 配置文件 
  每个activity里面都有window.callback和keyevent.callback,一些回调的接口或者函数吧. 框架把activity创建出来就会调用里面的这些回调方法,会调用  activity生命周期相关的方法.
  setContentView();
  普通的情况:
  Activity创建一个view是通过 ondraw 画出来的, 画这个view之前呢,还会调用onmeasure方法来计算显示的大小.

35.请解释下Android程序运行时权限与文件系统权限的区别。
  运行时权限Dalvik( android授权) 
  文件系统 linux 内核授权

36. IntentService有何优点? 
  答:IntentService 的好处 
  * Acitivity的进程,当处理Intent的时候,会产生一个对应的Service 
  * Android的进程处理器现在会尽可能的不kill掉你 
  * 非常容易使用 

37. 显式意图和隐式意图的区别
  显式意图 :必须指定要激活的组件的完整包名和类名 (应用程序之间耦合在一起)
  // 一般激活自己应用的组件的时候 采用显示意图
  隐式意图: 只需要指定要动作和数据就可以 ( 好处应用程序之间没有耦合)
  //激活别人写的应用 隐式意图, 不需要关心对方的包名和类名

38.引入任务栈目的 : 
  为了记录用户开启了那些activity,
  记录这些activity开启的先后顺序,
  帮助维护好的用户体验。

39 .Android中4大组件是:
ContentProvider、Activity、BroadcastReceiver和Service 

40. 简单描述下Android 数字签名。
在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系 Android系统要求每一个安装进系统的应用程序都是经过数字证书签名的,数字证书的私钥则保存在程序开发者的手中。Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序。
这个数字证书并不需要权威的数字证书签名机构认证(CA),它只是用来让应用程序包自我认证的。
同一个开发者的多个程序尽可能使用同一个数字证书,这可以带来以下好处。
(1)有利于程序升级,当新版程序和旧版程序的数字证书相同时,Android系统才会认为这两个程序是同一个程序的不同版本。如果新版程序和旧版程序的数字证书不相同,则Android系统认为他们是不同的程序,并产生冲突,会要求新程序更改包名。 (2)有利于程序的模块化设计和开发。Android系统允许拥有同一个数字签名的程序运行在一个进程中,Android程序会将他们视为同一个程序。所以开发者可以将自己的程序分模块开发,而用户只需要在需要的时候下载适当的模块。
在签名时,需要考虑数字证书的有效期:
(1)数字证书的有效期要包含程序的预计生命周期,一旦数字证书失效,持有改数字证书的程序将不能正常升级。
(2)如果多个程序使用同一个数字证书,则该数字证书的有效期要包含所有程序的预计生命周期。
(3)Android Market强制要求所有应用程序数字证书的有效期要持续到2033年10月22日以后。 
Android数字证书包含以下几个要点:
(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证 (3)如果要正式发布一个Android,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。 (4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!