2018年Android面试题汇总三(持续更新中)

六、自定义View如何提供获取View属性的接口

a、attrs.xml定义declare-styelable

b、构造方法中用TypedArray获取值

c、xml使用,加apk/res-auto

七、art和Dalvik对比(绿色表示面试出现概率很大)

7.1、即时编译技术(Just In Time JIT)与预编译技术(Ahead Of Time AOT)

 1、JIT(Just In Time)即时编译技术

   a、解释执行逐条编译成机器码,执行速度仍比直接执行机器码慢

   b、JIT技术在运行时将热方法编译成机器码,存储到代码缓存中,以后不再解释执行

  2、AOT(Ahead Of Time)预编译技术

   a、在安装时就直接编译成机器码,运行时直接运行机器码

7.1、对机器码的处理

 1、dalvik下,每次运行时字节码通过JIT转换为机器码,效率低

 2、ART下,第一次安装时通过AOT编译成机器码。启动和执行都会很快

 3、ART下,机器码储存空间大,安装应用的时间变长

7.2、两者的联系

  1、android 4.4用ART(Android

Runtime)替代Dalvik,开发者模式中“选择运行环境”

八、Dalvik虚拟机

8.1、Dalvik的特点

 1、每个程序都有一个Dalvik

 2、Dalvik是基于寄存器的,数据访问通过寄存器间直接传递;jvm基于栈,从栈上读写数据需要很多的指令指派和内存访问次数

 3、Dalvik处理dex文件,执行的是Dalvik字节码。 Dalvik字节码由java字节码转换而来,并被打包到dex文件中,Dalvik解释dex文件执行Dalvik字节码

 8.2、Android SDK中有个dx工具将Java字节码转换为Dalvik字节码

 1、dx工具对java字节码重排序

 2、将java类文件中的常量池分解,消除冗余信息,重新组成一个常量池,所有类文件共享一个常量池,相同字符串、常量在Dalvik中只出现一次,减少文件体积


八、Dalvik与jvm的区别

1、Dalvik基于寄存器,处理的是dex文件,Dalvik字节码,支持JIT

2、jvm基于栈,

3、java处理java字节码。

4、jvm本质上是软件,将Java字节码翻译为机器码

九、滑动冲突解决

1、onInterceptTouchEvent中ACTION_DOWN做标记,不拦截;在ACTION_MOVE中作条件判断,拦截。然后交给onTouchEvent事件

2、内部拦截,parent.requestDisallowInterceptTouchEvent

十、四大组件的生命周期

10.1、Activity的生命周期

 1、正常启动:oncreate->onStart->onResume

 2、back键退出:onPause->onStop->onDestory

 2、透明Activity、对话框或者锁屏:onPause->onResume

 3、非透明Activity、完全覆盖或者Home件回主屏:onPause->onSaveInstanceState->onStop->onRestart->onStart->onRestoreInstanceState->onResume

  4、下拉通知栏,对生命周期时没有影响的

  5、不走onStop的情景,在onCreate中调用finish

  6、从A的Activity中点击button进入B Activity。再back键finish掉B Activity。A和B的完整生命周期,也就是A的onStop要在B的onResume之后同理finish掉B:

           A.onCreate->A.onStart->A.oResume->A.onPause->B.onCreate->B.onStart->B.onResume->A.onStop->B.onPause->A.onCreate->A.onStart->A.onResume->B.onStop->B.onDestroy

10.2、Activity几个函数的调用

  1、onSaveInstanceState、onRestoreInstanceState调用时机

  a、透明Activity、对话框或者锁屏的时候因系统资源不足杀死

  b、屏幕方向改变

  c、非透明Activity、完全覆盖或者Home件回主屏

  d、长期待在后台资源不足时

PS:被回收,Fragment重叠就是这样造成的

           ps:Activity的onSaveInstanceState时,收集实现了保存/恢复方法View的状态;在onRestoreInstanceState方法中,Activity将收集的状态发回View结构树具有相同id的View(做搜索的时候,EditText出现的问题)。

10.3、Activity的四种启动模式和应用场景

1、四种启动模式,在AndroidManifest的android:launchMode属性

           a、standard:默认,每次都创建一个Activity实例放在任务栈

           b、singleTop:如果这个Activity实例在任务栈顶,onNewIntent重用该实例;否则创建一个新实例放在任务栈顶

           c、singleTask:任务栈中有这个Activity实例,onNewIntent重用该实例;并且这个实例之上的任务全部出栈

           d、singleInstance:一个独立的任务栈存在这个Activity实例

2、应用场景

           a、singleTop:消息推送要启动的Activity;登录成功要跳转的Activity;耗时操作返回的Activity

           b、singleTask:浏览器、微博的入口主Activity;

           c、singleInstance:呼叫来电界面;闹钟提醒;不可用于中间跳转页

3、什么是任务栈

           1、每一个程序都有一个任务栈,这个程序的所有Activity都放在这个任务栈中

           2、栈顶activity才可以和用户交互

           3、退出程序时,任务栈的所有activity出栈,任务栈被销毁。

4、另外一种形式的启动模式,Intent标志

           a、FLAG_ACTIVITY_NEW_TASK对应singleTask

           b、FLAG_ACTIVITY_SINGLE_TOP对应singleTop

           c、FLAG_ACTIVITY_CLEAR_TOP对应清除栈中Activity和其上面的Activity,重新创建这个Activity

5、不同进程的Activity可以放在同一个任务栈,如android:process=":remote"

6、用taskAffinity可以在一个程序中指定不同的栈,也可不同进程同一个栈

10.4、Service的生命周期

1、startService->onCreate(Service已创建跳过) 

         ->onStartCommand->stopService/stopSelf->onDestroy

2、bindService->onCreate->onBind->unbindService->onUnbind->onDestroy

PS:做过的项目中,NetTrafficService采用startService和bindService同时使用。在bindService时使用不同Action,而在onBind中对不同的Action返回不同用途的接口。bindService和unbindService配对使用。

10.5、bindService几个点

1、indService的onBind执行一次和多个Client即组件(如Activity)绑定

2、bindService发生的事情

           a、Client执行bindService

           b、Service不存在,Service执行onCreate

           c、没有执行过onBind,Service执行onBind

           d、执行过onBind,直接获取上次已经获取到的IBinder实例。

    e、onBind一次执行创建的IBinder实例,Anroid会将该IBinder存起来,对所有client共享

           f、client的ServiceConnection执行onServiceConnected

3、Client销毁,比如Activity执行onDestroy,该Client就会自动解除与Service的绑定

4、UnBindService发生的事情

           a、Client执行unbindService

           b、Client与Service解除绑定状态

           d、Service检测是否还有其他Client与其绑定

           c、如果没有其他Client绑定,Service执行onUnbind、onDestroy

 十一、Fragment的生命周期

  11.1、生命周期

  1、onAttach->Activity的onAttachFragment->onCreate->onCreateView->onActivityCreate->onStart->onResume

  2、onPause->onStop->onDestroyView->onDestory->onDetach

11.2、Fragment的状态保存和恢复

  1、Fragment的自身状态保存

  1.1、Activity中对View已经有保存和恢复,在Fragment中就应该不再有。Fragment只保存和保存自身的成员变量

11.3、Fragment的传递数据

  1、使用setArgument,在onCreate中getArgument取出

  a、好处:内存重启之前,这样做可以让系统保存数据。同Activity的intent恢复机制

11.4、Fragment中存在的七大问题

11.5、getActivity空指针问题

   1、原因:

a、onDetach造成

b、onSaveInstanceState保存Fragment造成:Activity回收Fragment不会回收,而是在onSaveInstanceState中保存在Bundle中,在Activity的onCreate中取出来恢复。恢复的Fragment使用getActivity会是null

   2、解决方案:在onAttach中用mActivity=getActivity保存Activity的引用

11.6、Fragment重叠问题

 1、原因:onSaveInstanceState时,保存了Fragment,而回收了Activity。onCreate取出了Fragment,又add一个Fragment

 2、出现情况:

A、当使用add、show和hide组合方式操作,重新add一个Fragment

B、使用replace不会出现这个问题,每次replace都会执行Fragment的生命周期。在这些生命周期里如果拉取了数据,就会造成多次重复拉取

C、add是将一个Fragment添加到container;replace先remove掉相同id的Fragment,再add,其中remove会执行那个Fragment的onDetach。而add在只有第一次add的时候会,在Activity退出的时候执行onPause->onStop->onDestroyView->onDestroy->onDetch

D、根本原因是在Fragment的hide之后,Activity的onSaveInstanceState中的FragmentState没有对应的Fragment的mHidden状态

2、解决方案

 a、重写Activity的onSaveInstanceState,调用super.onSavedInstanceState之前使用FragmentTransaction.remove删除所有的Fragment,FragmentTransaction.commitAllowingStateLoss。FragmentTransaction通过getFragmentManager().getFragmentTransaction

 b、重写Activity的onAttachFragment,让新的Fragment指向原来未原来未销毁的Fragment

 c、重写Activity的OnSaveInstanceState保存hidden状态,在重建之前Fragment的onCreate的判断saveInstanceState是否为null,调用FragmentTransaction.hide并FragmentTransaction.commit

 d、在Activity的onCreate中重建Fragment之前调用savedInstanceState.remove(TAG)

 e、重写onSaveInstanceState,不调用super.onSaveInstanceState

十二、Fragment与Activity间的通信

12.1、Fragment和Activity相互获得

  1、Fragment获得Activity:getActivity

  2、Activity获得Fragment:getFragmentManager.findFragmentById([fragment在Activity中的布局id])

12.2、Fragment与Fragment间通信

1、 通过Activity中转:getActivity().getFragmentManager().findFragmentById

2、使用接口

3、 使用广播

十三、ContentProvider

  13.1、概念

     1、Android四大组件,提供增删查改功能,必须在AndroidManifest中注册

     2、将自己的数据通过URI共享出去

     3、以数据库表的方式将数据暴露出去,外界通过URI方法

     4、系统中联系人信息、短信信息、图片库和音频库都是通过ContentProvider展现

 13.2、URI

    1、URI由Scheme、authority、path、query和fragment组成

    2、UriMacth类对Uri进行验证

  13.3、ContentProvider、ContentResolver、ContentObsever的关系

    1、ContentProvider对外提供数据

    2、ContentObserver监听数据的改变状态

    3、ContentResolver获取ContentProvider提供的数据,ContentResolver.registerContentObserver注册ContentObserver、ContentResolver.notifyChange发出通知ContentProvider

十四、Android数据存储方式

 14.1、五大存储方法

   1、File

   2、SharedPreference

   3、ContentProvider

   4、SQLiteDataBase

   5、网络

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值