Android 面试题总结

1.Android四大组件以及作用???

           Activity:Activity是Android程序与用户实现交互的窗口,是Android中最重要的一中,它需要保存各界面的状态,做很多持久化的事情。        

            Service:运行与后台服务于Activity,定义好接受的Intent提供同步和异步的接口。   

            Content Provider:   

            BroadCast Receiver:

2.Android中常用的五中布局???

       FrameLayout: 框架布局                 LinearLayout:线性布局         

        AbsolueLayout:绝对布局                RelativeLayout:相对布局        

        TableLayout:表格布局 

3.Android 中动画有哪几类???它们的特点和区别是什么???

       两类,一类是Tween动画、另一类是Frame动画。        

        Tween动画,实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化。       

        Frame动画,通过一定的顺序来播放一组图片,(如gif图)。

4.Android中Listview优化方案???

            如果是自定义适配器,那么在getView方法中考虑传进来额参数contenView是否为null,如果不为null则直接使用,尽量减少view的创建。        

             给contentView设置tag(setTag()),传入viewHolaer对象,用于缓存要显示的数据,可以达到图像数据的异步加载。       

            如果Listview需要显示的item比较多时,就要考虑数据的分页加载,根据需求去对应加载数据。 

5.ArrayList与LinkedList的区别和适用场景???

    Arraylist:

            优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。

            缺点:因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。

    LinkedList:

            优点:LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add和remove,LinedList比较占优势。LinkedList 适用于要头尾操作或插入指定位置的场景。

            缺点:因为LinkedList要移动指针,所以查询操作性能比较低。

    适用场景分析: 当需要对数据进行对此访问的情况下选用ArrayList,当需要对数据进行多次增加删除修改时采用LinkedList。

6.View的绘制流程???

    View的绘制流程:OnMeasure()——>OnLayout()——>OnDraw()

    各步骤的主要工作:

    OnMeasure():

            测量视图大小。从顶层父View到子View递归调用measure方法,measure方法又回调OnMeasure。 OnLayout():

            确定View位置,进行页面布局。从顶层父View向子View的递归调用view.layout方法的过程,即父View根据上一步measure子View所得到的布局大小和布局参数,将子View放在合适的位置上。

    OnDraw():

            绘制视图:ViewRoot创建一个Canvas对象,然后调用OnDraw()。六个步骤:①、绘制视图的背景;②、保存画布的图层(Layer);③、绘制View的内容;④、绘制View子视图,如果没有就不用;⑤、还原图层(Layer);⑥、绘制滚动条。

 7.activity的生命周期???

    Activity生命周期方法主要有onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()和onRestart()方法。

    启动一个A Activity,分别执行onCreate()、onStart()、onResume()方法。

    从A Activity打开B Activity分别执行A onPause()、B onCreate()、B onStart()、B onResume()、A onStop()方法。

    关闭B Activity,分别执行B onPause()、A onRestart()、A onStart()、A onResume()、B onStop()、B onDestroy()方法。

    横竖屏切换A Activity,清单文件中不设置android:configChanges属性时,先销毁onPause()、onStop()、onDestroy()再重新创建onCreate()、onStart()、onResume()方法,设置orientation|screenSize(一定要同时出现)属性值时,不走生命周期方法,只会执行onConfigurationChanged()方法。

    Activity之间的切换可以看出onPause()、onStop()这两个方法比较特殊,切换的时候onPause()方法不要加入太多耗时操作否则会影响体验。

8.android的数据存储???

            使用SharedPreferences存储数据;它是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将数据存储到设备中。只能在同一个包内使用,不能在不同的包之间使用。

            文件存储数据;文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。

            SQLite数据库存储数据;SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。

            使用ContentProvider存储数据;主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。

            网络存储数据;通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在网络空间中的数据信息。

9.Activity启动模式???

            standard:标准模式,也是系统默认的启动模式。假如 activity A 启动了 activity B , activity B 则会运行在 activity A 所在的任务栈中。而且每次启动一个 Activity ,都会重新创建新的实例,不管这个实例在任务中是否已经存在。

             singleTop:栈顶复用模式。假如 activity A 启动了 activity B ,就会判断 A 所在的任务栈栈顶是否是 B 的实例。如果是,则不创建新的 activity B 实例而是直接引用这个栈顶实例,同时 onNewIntent 方法会被回调,通过该方法的参数可以取得当前请求的信息;如果不是,则创建新的 activity B 实例。

            singleTask:栈内复用模式。在第一次启动这个 Activity 时,系统便会创建一个新的任务,并且初始化 Activity 的实例,放在新任务的底部。不过需要满足一定条件的。那就是需要设置 taskAffinity 属性。

            singleInstance:单实例模式。这个是 singleTask 模式的加强版,它除了具有 singleTask 模式的所有特性外,它还有一点独特的特性,那就是此模式的 Activity 只能单独地位于一个任务栈,不与其他 Activity 共存于同一个任务栈。

10.广播注册???

            首先写一个类要继承BroadCastReceiver

            第一种:在清单文件中声明,添加 第二种:使用代码进行注册如:

    <receive android :name ="BroadCastReceiverDemo">

        <intent-filter>

            <action android:name="android.provider.Telephony.SMS_RECEIVED">

        </intent-filter>

    </receiver>

            第二种:使用代码进行注册如:

    IntentFilter filter = new    IntentFilter("android.provider.Telephony.SMS_RECEIVED");

    BroadCastReceiverDemo receiver = new BroadCastReceiver();

    registerReceiver(receiver, filter);

            两种注册类型的区别是:

    第一种是常驻型广播,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

    第二种不是常驻广播,也就是说广播跟随程序的生命周期。 

猜你喜欢

转载自www.cnblogs.com/monkey0928/p/9293894.html