1、Activity的生命周期
1) onCreate() ->程序创建。
2) onRestart() ->程序进入onStop()但没进入到onDestroy()。
3) onStart() ->程序进入前台,可见但不可操作。
4) onResume() ->用户可操作。
5) onPause() ->程序进入暂停状态。
6) onStop() -> 程序进入停止状态。
7) onDestroy() -> 程序销毁。
2、Fragment的生命周期
Fragment依赖Activity所以生命周期和Activity差不多。
1) onAttach() -> Fragment与Activity绑定。
2) onCreate() -> 初始化Fragment。可通过参数savedInstanceState获取之前保存的
值。
3) onCreateView() -> 初始化Fragment的布局。加载布局和findViewById的操作通常
在此函数内完成,但是不建议执行耗时的操作,比如读取数
据库数据列表。
4) onActivityCreated() -> 执行该方法时,与Fragment绑定的Activity的onCreate方
法已经执行完成并返回,在该方法内可以进行与Activity交
互的UI操作,所以在该方法之前Activity的onCreate方法并
未执行完成,如果提前进行交互操作,会引发空指针异
常。
5) onStart() -> 执行该方法时,Fragment由不可见变为可见状态。
6) onResume() -> Fragment处于活动状态,用户可与之交互。
7) onpause() -> Fragment处于暂停状态,但依然可见,用户不能与之交互。
8) onStop() -> Fragment完全不可见。
9) onDestroyView() -> 销毁与Fragment有关的视图,但未与Activity解除绑定,依然
可以通过onCreateView方法重新创建视图。通常在
ViewPager+Fragment的方式下会调用此方法。
10) onDestroy() -> 销毁Fragment。通常按Back键退出或者Fragment被回收时调用
此方法。
11) onDetach -> 解除与Activity的绑定。在onDestroy方法之后调用。
3、Service的生命周期
启动Service有两种方式 1、startService ,2、bindService。
startService -> onCreate() -> onStartCommand() -> onDestroy()。
bindService -> onCreate -> onBind() -> onUnbind() -> onDestroy()。
使用第一种方式启动service ,onCreate()只会被调用一次,多次启动会多次调用
onStartCommand(),要退出Service时,调用StopService()。StartService不受
Activity的生命周期影响。
使用第二种方式启动service,onCreate() 只会被调用一次,多次绑定Service会调用
BindService,可以通过unBind() 解除绑定。 bindService受Activity的生命周期影
响,Activity销毁了,服务也停止了。
同时调用startService和bindService的生命周期:
onCreate() -> onStartCommand() -> onBind() -> onUnbind() -> onDestroy()
4、Activity的启动模式
- standard 默认启动方式,无论栈中是否存在实例都会创建新的实例。
- singleTop 栈顶复用模式,如果栈顶存在该实例,则不创建直接复用,如果栈顶不
存在该实例则重新创建该实例。 - singleTask 每次启动Activity时检查栈中是否存在该实例,如果没有则创建,如果
存在实例则复用该实例,并把之上的Activity都push出去。 - singleInstance 该模式的Activity会启动一个新的任务栈来管理Activity实例,并且
该实例在整个系统中只有一个。无论从哪个任务栈中启动该Activity,都会使该
Activity所在的任务栈转移到前台,从而使Activity显示。主要作用是为了在不同程
序中共享一个Activity
5、Touch事件传递机制
当我们点击屏幕的时候,Activity会调用dispatchTouchEvent将事件传递给Window
Window会将事件传递给DecorView(DecorView是View的根布局)
DecorView再传递给ViewGroup。
Activity -> Window -> DecorView -> ViewGroup -> View。
事件分发主要有三个方法
dispatchTouchEvent
onInterceptTouchEvent
onTouchEvent
Activity先调用dispatchTouchEvent分发,接着调用super向下传递
ViewGroup首先调用 dispatchTouchEvent进行分发,接着调用
onInterceptTouchEvent(拦截事件),如果返回值为true,表示拦截,事件不会向
下层的View或者ViewGroup传递,如果返回值为false,表示不拦截,继续分发事
件。 默认是false。#View 是没有onInterceptTouchEvent方法的。
事件在ViewGroup和ViewGroup、ViewGroup和View直接传递,最终到达VIew。
View调用dispatchTouchEvent方法,然后在onTouchEvent处理事件,
onTouchEvent返回true 表示处理该事件,反之交给上一级处理。
6、自定义View流程
1) 自定义View属性,编写attr.xml文件。
2) 在layout布局中引用,同时引用命名空间
3) 在View的构造方法中获得我们自定义的属性,在自定义空间中进行读取(构造方
法中拿到attr.xml文件值)
4) 重写onMeasure
5) 重写onDraw
7、Android中动画有哪些。
1) 补间动画
2) 帧动画
3) 属性动画
补间动画是对View一系列的操作比如: 平移、翻转、透明、放大缩小等。但他不会
改变View的属性值,只是改变了View的绘制位置,例如在一个按钮移动后,不在原
来的位置但是触发事件仍然在原来的坐标。
帧动画,播放一系列图片来实现动画效果。可以设置动画时间。
属性动画,动画除了View动画还可以是object对象,动画结束后,object的属性值被
实实在在改变了。
8、ANR是什么,怎么避免ANR?
Application Not Responding,应用无响应。
1、界面5秒钟未响应。
2、广播10秒内未处理好事件。
3、Service在20秒内未完成事件。
避免: 在主线程减少耗时操作。
1) 在子线程处理耗时操作。
2) 使用Handler进行UI更新。使用Handler处理子线程结果,而不是使用
Thread.wait()或者Thread.sleep()来阻塞主线程
3) Activity的onCreate和onResume回调中尽量避免耗时的代码
4) BroadcastReceiver中onReceiver代码也要尽量减少耗时操作,建议使用
intentService处理。intentService是一个异步的,会自动停止的服务,很好解决
了传统的Service中处理完耗时操作忘记停止并销毁Service的问题
9、如何优化ListView
1) 复用ConvertView
2) 使用ViewHolder 减少View的创建
3) item的布局减少嵌套
4) 数据多使用分页加载
5) 图片异步加载(Glide)
10、横竖屏切换时生命周期变化
如果不设置 android:configChanges 切横屏调用一次生命周期,横屏切竖屏调用两
个生命周期。
设置android:configChanges=" orentation " 生命周期各调用一次
设置android:configChanges=" orentation|keyboardHidden "时,切屏不会调用生命
周期 会调用 onConfigurationChanges方法
11、Android的UI适配
字体使用sp,控件使用dp,多用match_content ,wrap_content,weight属性,
图片放在不同分辨率的文件夹下。
12、RecyclerView和ListView的区别。
Recycler可以设置 ListView,GrideView ,和瀑布流,还可以设置列表的滚动方向
RecyclerView中View的复用不需要开发者自己写代码,已经封装好了。
RecyclerView可以设置Item的局部刷新,给Item添加动画效果。
如果要频繁的刷新数据,给item设置动画,建议使用RecyclerView。
如果只是列表展示 两者区别不大。
13Android异步消息处理机制(Handler)
主要用来子线程更新UI
1) handler,主要用来处理和分发消息(sendMessage(),handlerMessage())
2) Message,线程之间传递,可携带少量信息,用于不同线程之间交换数据,可以
使用what ,arg1,arg2,字段携带整数类型数据, obj携带object对象。
3) MessageQueue,消息队列用于存放Message,先进先出。每个线程只有一个
MessageQueue
4) Looper 循环消息队列取出待处理消息交给Handler处理。
14内存泄漏和内存溢出有什么区别
内存泄漏:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏危
害可以忽略,但内存泄漏堆积后果很严重,无论多少内存,迟早被用光。
内存溢出:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of
memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢
出。内存溢出通俗的讲就是内存不够用。
内存泄漏原因以及解决办法:
1、Handler引起的内存泄漏
将Handler声明为静态内部类,这样就不会持有对外部类的引用,和Activity的生命
周期无关。
2、单例模式引起的内存泄漏
单例模式的Context不要使用Activity的Context,使用Application的Context因为
Application的生命周期和APP一致,所以不会导致内存泄漏。
3、非静态内部类创建静态实例引起的内存泄漏
把内部类修改为静态内部类。
4、非静态匿名内部类引起的内存泄漏
将匿名内部类修改为静态。
5、注册/反注册 未成对使用引起的内存泄漏
注册广播接收器,EventBus等,注意解绑。
6、资源对象没有关闭引起的内存泄漏
在资源不使用的情况下,记得调用 ,close(),destory(),release(),recycler()等方
法。
7、集合对象没有及时清理引起的内存泄漏
通常会把一些对象放在集合里,当不使用的时候及时清理,让相关对象不再被引
用。
15、TCP和HTTP的区别
Http是基于HTTPClient和urlConnention是短链接,请求一次后自动断开,需要重新
请求才能链接。
TCP是基于Socket,长连接,需要三次握手,四次挥手才能取消链接。
网友评论