一. 关于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.使用加载图片框架处理图片,
---未完,待续--