Android高级面试题汇总——Android篇(1)

(一)Android基础知识点

1、四大组件是什么

        Activity,Service,ContentProvider,BroadcastReceiver

2、四大组件的生命周期和简单用法

        Activity的生命周期:onCreate()->onStart()->onResume()->onPause()->onStop()->onRestart()->onDestroy()

        用法:创建一个Intent对象,将该Activity以及将要打开的Activity传进去,然后Intent对象将代入startActivity()即可启动

        Service的生命周期:

        (1)onCreate()->onStart()->onDestroy()

        (2)onCreate()->onBind()->onUnBind()->onRebind()->onDestroy()

        用法:

        (1)通过简单的startService()进行service启动,此后启动该Service的组件无法把控Service的生命周期,理论上此后该Service可以在后台无期限运行,但根据实际情况该Service可能会在任意一个时刻被杀死

         我们可以在onStartCommand()里面做我们要做的操作,虽然运行ANR(Application No Response) 时间比Activity多了近一倍,但Service跟Activity一样不可以做耗时操作

        (2)通过绑定的方式启动Service

         绑定后,该Service与启动绑定操作的组件形成绑定,当组件销毁时,该Service也随着销毁

         ContentProvider:

        提供数据的进程使用contentProvider内容提供者

        获取数据的进程使用contentResolver内容解析器

        BroadcastReceive广播接收器生命周期:

        生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报ANR程序无响应的错误信息

        它的生命周期为从回调onReceive()方法开始到该方法返回结果后结束

        用法:

        (1)静态注册(常驻广播)

        在AndroidManifest.xml中进行注册,App启动的时候自动注册到系统中,不受任何组件生命周期影响,(即便应用程序已经关闭),但是耗电,占内存 

        (2)动态注册(非常驻广播)

        在代码中进行注册,通过IntentFilter意图过滤器筛选需要监听的广播,记得注销(推荐在onResume()注册,在onPause()注销),使用灵活,生命周期随组件变化

3、Activity之间的通信方式

        (1)在Intent跳转时携带数据

  • 在Intent里直接赋值
  • 使用Bundle传值

        使用Bundle传值对比在Intent里直接赋值的好处:

  •  减少重复赋值操作(需要传递多次)
  • 除了基本类型,还可以传实现Serializable 接口的对象

        (2)借助类的静态变量来实现

        由于类的静态成员可以通过“className.fileName”来访问,故而可以供两个Activity访问从而实现Activity之间的数据通信

        (3)借助全局变量 Application 来实现

        和类的静态变量类似,但是这个类作为单独第三个类(最好是写一个Application类)

        (4)借助Service服务

         Service设计的本意,就是提供一些后台的服务,数据存取,也可以归于其职责的一部分

         Service是提供了直连机制,调用的Activity,可以通过bindService方法,与目标Service建立一条数据通路,拿到IBinder。这样,通过Android提供的IPC模型(进程间通信),就可以进行远程方法的调用和数据的传输了

         通过这种模式,可以解决一定问题,但是对于Service来说,实在是太大才小用了,Service的专长,不是在数据,还是在逻辑。对于传数据而言,Service还是重量了一点,不但是有连接耗精力,传输经由IPC,写起来也够费劲。而且作为组件,Service随时可能死掉,你还是要费劲心机的处理数据的持久化,得不偿失

        (5)借助外部存储来实现通讯

        Ⅰ.借助 SharedPreference来实现

        SharedPreferences是Android平台上一个轻量级的存储辅助类,用来保存应用的一些常用配置,它提供了string,set,int,long,float,boolean六种数据类型。最终数据是以xml形式进行存储。在应用中通常做一些简单数据的持久化缓存

        Ⅱ.借助 SQLite 来实现

        SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,在存储大量复杂的关系型数据的时可以使用,比前面学过的只适用于存储简单数据的两种存储方式要好很多

        Ⅲ.借助 Flie 来实现

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

4、Activity各种情况下的生命周期

        (1)两个Activity(A->B)切换(B正常的Activity)的生命周期:onPause(A)->onCreate(B)->onStart(B)->onResume(B)               ->oStop(A)

        这时如果按回退键回退到A:onPause(B)->onRestart(A)->onStart(A)->onResume(A)->oStop(B)

        如果在切换到B后调用了A.finish(),则会走到onDestory(A),这时点回退键会退出应用

       (2)两个Activity(A->B)切换(B透明主题的Activity或是Dialog风格的Acivity)的生命周期:onPause(A)->onCreate(B)               ->onStart(B)->onResume(B)

        这时如果回退到A: onPause(B)->onResume(A)->oStop(B)->onDestory(B)

        (3)Activity(A)启动后点击Home键再回到应用的生命周期:onPause(A)->oStop(A)->onRestart(A)->onStart(A)                    ->onResume(A)

        (4)横竖屏切换的时候,Activity 各种情况下的生命周期

  • 切换横屏时:onPause->onSaveInstanceState->onStop->onDestory->onCreate->onStart->onRestoreInstanceState              ->onResume
  • 切换竖屏时:onPause->onSaveInstanceState->onStop->onDestory->onCreate->onStart->onRestoreInstanceState              ->onResume
  • 如果在AndroidMainfest.xml中修改该Activity的属性,添加android:configChanges="orientation":                             onPause->onSaveInstanceState->onStop->onDestory->onCreate->onStart->onRestoreInstanceState ->onResume
  • 如果AndroidMainfest.xml中该Activity中的android:configChanges="orientation|keyboardHidden",则只会打印onConfigurationChanged

        (5)Activity上有Dialog的时候按Home键时的生命周期

        AlertDialog并不会影响Activity的生命周期,按Home键后才会使Activity走onPause->onStop,AlertDialog只是一个组件,并不会使Activity进入后台

        AlertDialog和Toast是通过WindowManager.addView()来显示的,AlertDialog和Toast可以看做是当前Activity的一部分View

5、Activity与Fragment之间生命周期比较

        Activity:

        (1)onCreate():Activity创建界面时,调用此方法

        (2)onStart():Activity界面可见时,调用此方法

        (3)onResume():界面获得焦点可以和用户可交互时,调用此方法

        (4)onPause(): 界面可见(变为半透明或弹出对话框)但失去焦点不可以和用户交互,调用此方法

        (5)onStop(): 界面完全不可见时 ,调用此方法

        (6)onDestroy(): Activity被销毁时,调用此方法

        (7)onRestart():界面由不可见变为可见时,调用此方法和onStart()方法

        Fragment:

        (1)onAttach():Fragment和Activity关联时,调用此方法

        (2)onCreate():创建Fragment时,调用此方法

        (3)onCreateView():加载Fragment的ui布局时,调用此方法

        (4)onActivityCreated():Activity的onCreate方法完成时,调用此方法

        (5)onStart(): Fragment和Activity一起启动且可见时,调用此方法

        (6)onResume():Fragment获取焦点时,调用此方法

        (7)onPause()

你可能感兴趣的:(Android,面试)