启动另一个Activity然后finish,先调用旧Activity的onPause方法,然后调用新的Activity和onCreate->onStart->onResume方法,然后调用旧Activity的onStop->onDestroy方法。
如果没有调用finish那么onDestroy方法不会被调用,而且在onStop之前还会调用onSavedInstanceState方法
onRestart方法执行完了之后还会调用onStart方法
fragment:[SupportFragmentManager,childFragment]
service:
[Android Service的生命周期]
[android-Service和Thread的区别]
Service和Intent Service:没啥区别,只是IntentService在onCreate方法中开启新的HandlerThread去执行。
Service运行的进程和线程:当它运行的时候如果是LocalService,那么对应的Service是运行在主进程的main线程上的。如onCreate,onStart这些函数都是在系统调用的时候在主进程的main线程上运行的。如果是RemoteSevice,那么对应的Service则是运行在独立的main线程上。
- 服务不是单一的进程,服务没有自己的进程,应用程序可以不同,服务运行在相同的进程中
- 服务不是线程,可以在线程中工作
- 在应用中,如果是长时间的在后台运行,而且不需要交互的情况下,使用服务
- 同样是在后台运行,不需要交互的情况下,如果只是完成某个任务,之后就不需要运行,而且可能是多个任务,需要长时间运行的情况下使用线程
- 如果任务占用CPU时间多,资源大的情况下,要使用线程
Thread的运行是独立于Activity的,也就是说当一个Activity被finish之后,如果你没有主动停止Thread或者Thread里的run方法没有执行完毕的话,Thread就会一直执行。
8.View绘画机制
View的绘制主要涉及三个方法:onMeasure()、onLayout()、onDraw()
- onMeasure主要用于计算view的大小,onLayout主要用于确定view在ContentView中的位置,onDraw主要是绘制View。
- 在执行onMeasure()、onLayout()方法时都会通过相应的标志位或者对应的坐标点来判断是否需要执行对应的函数,如我们经常调用的invalidate方法就只会执行onDraw方法,因为此时的视图大小和位置均未发生变化,除非调用requestLayout方法完整强制进行view的绘制,从而执行上面三个方法。
进度条组件:
[ProgressView]
[AnnotationView]
9.事件传递机制
[android 事件处理机制总结,ScrollView ViewPager ListView GridView嵌套小结]
当手指触摸到屏幕时,系统就会调用相应View的onTouchEvent,并传入一系列的action。
dispatchTouchEvent的执行顺序为:
- 首先触发ACTIVITY的dispatchTouchEvent,然后触发ACTIVITY的onUserInteraction
- 然后触发LAYOUT的dispatchTouchEvent,然后触发LAYOUT的onInterceptTouchEvent
这就解释了重写ViewGroup时必须调用super.dispatchTouchEvent();
(1)dispatchTouchEvent:
此方法一般用于初步处理事件,因为动作是由此分发,所以通常会调用super.dispatchTouchEvent。这样就会继续调用onInterceptTouchEvent,再由onInterceptTouchEvent决定事件流向。
(2)onInterceptTouchEvent:
若返回值为true事件会传递到自己的onTouchEvent();若返回值为false传递到下一个View的dispatchTouchEvent();
(3)onTouchEvent():
若返回值为true,事件由自己消耗,后续动作让其处理;若返回值为false,自己不消耗事件了,向上返回让其他的父View的onTouchEvent接受处理
三大方法关系的伪代码:如果当前View拦截事件,就交给自己的onTouchEvent去处理,否则就丢给子View继续走相同的流程。
public boolean dispatchTouchEvent(MotionEvent ev)
{
boolean consume = false;
if(onInterceptTouchEvent(ev))
{
consume = onTouchEvent(ev);
}
else
{
consume = child.dispatchTouchEvent(ev);
}