android面试复习(自己总结的知识点,小生不才,望大能指点一二,只言片语,聊表心意)

一. 关于activity

    1. 什么是activity:

        就是一个用户交互界面就是一个activity

    2. activity 的生命周期

        onCreate ,onStart , onResume, onPause,onStop,onDestroy

    3.activity 保存状态 (还有其他方法,待完善)

        用Bundle来保存状态属性, putString, putInt ,

    4.两个activity 之间跳转必然要执行的哪几个方法?

          在界面A 中执行界面B:

            [1]. A 仍然可见:onPause ,onCreate, onStart, onResume 

            [2]. B 不可见:onPause,onStop,onCreate,onStart,onResume

    5,横竖屏切换的时候 activity 的生命周期:

            [1]. 在不设置activity:configChange 的时候, 讲先摧毁首个activity, 然后在加载新的activity

       [2].设置activity:configChange="orientation|keyBoardHidden|screenSize",不重新调用各自的生命周期, 执行onConfigchanged()的方法

    6. 如何将activity 设置成窗口模式

        android: theme = "@android:style/Theme.Dialog"

    7.如何退出一个activity?如何安全的退出已调用多个activity 的application

        [1].一般退出一个activity直接按返回键, 或者是通过代码实现退出activity, 或者是直接调用finish() 方法

        [2].记录所有打开的activity, 遍历集合, 满足条件的关闭

        [3].发送特点的广播, 接受到广播的直接调用finish()方法

        [4].递归退出,

        [5]启动模式  singleTask 模式, 将所有上面的activity 全部杀死

    8.activity 的四种启动模式

        standard: 标准模式, 每次重启 都会开启一个新的activity

        singleTop:独占顶端 . 当次activity 已经在最上面的时候, 将不再重新创建新的activity

        singleTask:单任务栈, 当任务栈中存在这个activity的时候 重新调用时, 会将前面的所有activity 全部杀死

        singleInstance:单实例, 此activity 在任务栈中有且仅有一个

    9.android 中 context, activity, application 的区别

        [1]相同点:activity 和application 都是content的子类

              context  是上下文的意思,是管理上下文环境中各个变量和参数的总和,方便我们可以访问到各种资源

        [2]不同点:维护的生命周期不同, Context 是维护的当前activity 的生命周期, 而application 是维护的是整个工程项目的生命周期

    10. 两个activity 传递数据的方式有:

        [1]intent

        [2]广播接受者   broadreciver

        [3]内容提供者  content  provider

        [4]静态数据   public startic 

        [5] 利用外部储存的数据  File 文件储存  shareprefrence 首选项 , Sqlite 数据库

    11.Context 是什么?

        [1]. 它 是描述一个应用程序环境的信息, 即上下文的意思

        [2].是一个抽象类, android  提供了这个类的具体的实现类 ContextXml

        [3].我们通过这个类可以获得一些应用程序的资源和类, 包括一些系统级别的操作, 例如 开启一个activity ,发送一个广播,接受一个intent 发送一个消息


二. 关于Service

    1.Service 是否是在主线程中执行, service 能否执行耗时操作

        service 和activity 都一样的, 都是在当前app 所在的主线程main thread 中执行的

        且 service 不能执行耗时操作

    2.Activity 和Service 时怎么绑定的, 启动自己的服务

        bindService

    3.Service 的生命周期;

        [1] 非绑定式模式:

            startService()>onCreate()>onStartCommand()>(关闭)>onDestory()

        [2]绑定式模式

            bindService()>onCreate()>onBind()>(解绑)>onUnBind()>onDestory()

    4.Activity Intent Service 是什么关系

        Activity 和 Service 都是android 四大组件 ,  两者都是通过Intent 来传递数据的

    5.Service 中是否可以弹吐司?

        弹吐司的条件是 有要context, 上下文,而本身就是Context 的子类 ,所有可以弹吐司


三.关于BroadcastReceiver

    1.描述一下BroadcastRecevicer 

        BroadcastRecevicer 也是android 四大组件之一 ,主要是接受 系统或者app本身发出的广播

        广播分为两类: 有序广播和无序广播

    2.在mainfast 文件注册和通过代码注册广播

        在mainfast 中注册的广播叫做静态广播,  通过代码注册的广播叫做动态广播

    3.BroadcastReceiver 的生命周期

        [1] broadcastreceiver 的生命周期很短暂, 在接受到广播的时候创建, 在onReceive()方法之后被摧毁

        [2]不能执行耗时操作

        [3]最好不要在广播接受者中创建子线程做耗时操作, 因为当onReceive方法之后, 广播进程被杀死,为空进程,线程也会被系统杀死,而出现异常

        [4]耗时任务最好是放在服务里面完成

    4.Android 中引入广播的机制

        [1]从MVC 的角度考虑, android 的四大组件之间 都互相有依赖关系, 引入广播机制 是为了几大组件之间的信息和数据的交互

        [2]程序之间可以互相通讯

        [3] 设计模式----监听者模式


四.关于ContentProvider

        1.ContentProvider 是如何实现数据共享的?

            在Android 中, 如果想把自己应用的数据提供给第三方应用, 我们将用到ContentProvider 来实现

            ContentProvider 是应用程序之间的数据交互的借口, 我们使用的时候定义一个类继承ContentProvider

            类, 然后复写增删改查方法 insert query delete  update; ContentProvider 也是android 四大组件之一,

            也需要在mainfast 文件中注册

    2.Android 中存储数据的方式

        [1]File 储存

        [2]SharedPreference 首选项

        [3]ContentProvider 内容提供者

        [4]SQliteDataBase 轻量级数据库

        [5]网络储存

    3.ContentProvider 和SQL 的实现有什么差别

        ContentProvider 屏蔽了数据储存的细节 ,内部实现对用户完全透明 , 用户只需要知道关系操作uri就可以了, 

        ContentProvider 也可以实现不同app 之间的数据共享

        SQL 只能操作本应用下的数据库

    4. ContentProvider , ContentObserver,ContentResolver 之间的关系

        [1]ContentProvider 内容提供者  , 用于对外界提供数据的

        [2]ContentResolver.notifyChange(uri)  发出消息

        [3]ContentResolver  内容解析者,用于获取内容提供者的数据

        [4]ContentObserver  内容监听者 , 用于监听数据改变的状态

        [5]ContentResolver.registerContentObserver  注册内容监听者


五.关于ListView

    1.如何提高ListView 的效率:

        [1]复用contentview

        [2]自定义viewhold , 用来减少findviewbyid 的次数

        [3]异步加载数据  和分页加载数据

        [4]使用weakrefrence  引用ImageView 对象

    2.ListView 的适配器 adapter 发生变化之后, 如何更新ListView

        adapter.notifyDataSetChanged() 可以会使ListView 重新绘制

    3.ListView 的分页加载

        [1] 设置ListView 的滚动监听:  setOnScrollListener(new OnScrollListener{....})

            里面需要复写两个方法; 1.onScrollStateChanged()  2.onScroll

        [2]滚动状态发生改变的时候 有三种状态:

1.手指按下移动的状态: SCROLL_STATE_TOUCH_SCROLL;//触摸滑动

2.惯性滚动(滑翔状态):SCROLL_STATE_FLING//滑翔状态

3.静止状态:SCROll_STATE_IDLE;//静止

        [3]对不同的状态的处理:看静止状态下,最后一个可见的条目是否是适配器中最后一个,就可以加载更多的数据.

             当滚动的数据大于总数据的时候,可以提示无数据加载

    4.ListView 可以显示多种类型的条目

        在adapter 里面提供了getViewTypeCount( )和getViewType( )两个方法, 

        在getView 方法中可以根据不同的viewType() 来加载不同类型的布局文件

    5.如何在ScrollView 中嵌套 ListView (难点,还需要整理,)


    6.ListView 中如何优化图片

        处理图片的方法如下:

        [1]不要直接拿路径去循环BitmapFactory.decodeFile; 使用options保存图片大小,千万不要加载图片到内存

        [2]对图片一点要经过边界压缩   尤其是比较大的图片

        [3]WeakReference , SoftReference , WeakHashMap 等来储存图片信息

        [4]在getView 中图片转化的时候, 产生的中间变量一定要及时释放

        异步加载图片思想:

        [1]先从内存缓存中获取图片的信息

        [2]获取不到的话, 从sd卡中获取图片的信息

        [3]都获取不到的话, 从网络下载图片保存到SD卡 同时加载到内存并显示


六.关于Intent

    1.Intent 在传递数据的时候可以传递哪些类型的数据?

        intent 传递数据非常丰富, java的基本数据类型,和string 以及他们的数组形式都可以, 

        除此之外 还可以传递 实现了Serilizable 和Parcelable 的借口

    2.Serilizable 和 Pracelable 的区别

        Parcelable 类比Serilizable 的性能高,推荐使用Parcelable:

[1].Serilizable 在序列化的时候 会产生大量的临时变量, 从而引起频繁的GC

         [2].Parcelable 不能使用在要将数据储存在磁盘的情况.

实现:

[1].Serilizable 的实现, 只需要继承Serilizable 即可, 这只是给对象打了一个标记,

                            系统会自动将其序列化

[2].Parcelable 的实现,需要在类中 添加一个静态成员变量CREATOR,这个变量需要

                            继承Parcelable.Creator接口.

   3.描述Intent 和IntentFilter;

Android 中 用过Intent 对象来表示一条消息,一个Intent对象不仅包含有这个消息的目的

                地,还可以包含消息的内容,对于一个Intent对象,"目的地"是必须的,但内容则是可选项.

通过Intent可以实现各种系统组件的调用与激活

IntentFilter 可以理解成是一个分拣系统;由三个参数来识别:

Action 动作 view; 用户定义的一个字符串,用来描述一个Android应用程序组件

Data 数据 uri; 一个Intent 可以携带外部数据给目标组件.mimetype 属性是携带外

                        部数据的数据类型,scheme 指定协议.host指定位置,port端口,path路径

Category:额外的附加信息;当Intent 中包含这个列表的所有项目时Category 类别

                         匹配才会成功。


七. 关于Fragment

    1.Fragment 和Activity 之间是如何传值的

        fragment 和activity 绑定之后  在fragment 中 可以通过getAction 来获取activity 的对象;

        在activity 里面可以通过findFragmentById()或findFragmentByTag 来获取fragment

    2.Fragment 的生命周期

        onAttach()>>onCreate()>>onCreateView()>>onActivityCreated()>>onStart()>>

    onResume()>>onPause()>>onStop()>>onDestroyView()>>onDestroy()>>onDetach().

    3.Fragment 的replace 和add 的区别:

        Fragment 的容器是一个FragmentLayout, add 的时候是把所有的Fragment 一层一层的

        叠加到FragmentLayout上去, 但是replace是先将其他的Fragment先去除掉, 然后添加新

        的Fragment; 如果要达到切换的效果, 需要通过Fragment 的hide 和show方法结合使用,

        将想显示出来的show,其他的hide起来, 这个过程没有生命周期的变化  

    4.Fragment 在实际项目中的使用:

        [1] Fragment 可以分离activity成多个重用的组件,每个都有自己的生命周期和UI

        [2]Fragment 可以轻松的创建动态灵活的UI设计, 可以适合与不同屏幕的尺寸

        [3]Fragment 是一个独立的模块, 紧紧的跟activity 绑定在一起, 也可以动态的删除,添加,替换等等

        [4]Fragment 提供一个新的方式在不同的安卓产品上面统一的UI

        [5]Fragment 解决了activity 之间切换不流畅的问题, 轻量级切换

        [6]Fragment 替换TabActivity 做了导航,性能更好

        [7]Fragment 嵌套, 生成更好的界面效果

    5. 如何切换fragment ,不重复实例化

        add()方法时:add()另一个Fragment,hide()原来的, show()新的

    

八.Android 高级

    1. 性能优化

        ---广义题, 根据自己实际掌握情况答

    2.什么情况下导致的内存泄漏

        [1]资源释放问题导致:

        程序代码的问题, 长时间保持某些资源, 如:context,cursor,IO 流等引用, 资源得不到释放,就会造成内存泄漏

        [2]对象内存过大导致:

        保存了多个耗用过大的对象, 如Bitmap, XML等,造成内存超出限制

        [3] static 关键字的使用

        static 是java中的一个关键字, 当他修饰成员变量的时候, 该变量就是属于该类,而不是该类的实例对象, 生命周期变长,如果用它来修饰一些资源消耗很多的实例, 需要谨慎使用,也有可能导致内存溢出

        [4]线程导致的内存泄漏

        线程产生内存溢出的原因 主要在于线程生命周期不可控

    3.如何避免OOM异常(OutOfMemoryError)

        [1]图片过大导致的OOM, 解决办法如下:

               a.等比例缩小图片,这个只是改变图片大小, 并没有彻底解决内存溢出

               b.对图片进行软引用, 及时的进行recycle处理

               c.使用加载图片框架处理图片,






---未完,待续--

你可能感兴趣的:(Android)