浅谈Activity从建立到显示:
1,Activity 是一个组件:掌控着一群View控件的逻辑和生命周期
2,Window是一个抽象基类:提供了一系列窗口的方法,比如设置背景,标题等等,而它的唯一实现类则是PhoneWindow;每一个activity都对应掌控着这样一个window
3,从代码看,Activity在oncreate()之前创建了一个window对象。
在执行oncreate()中的setcontenView(R.id.layout);会调用window中的setcontenView(),这个方法会创建一个decorView,也是window中的内部类,根据theme ,style设置decorView的样式,decorView又是继承了FrameLayout 根据这个XML-layout 返回需要绘制的视图。
Fragment的状态是可见还是不可见的,如果可见则进行懒加载操作。
onAttach():Fragment与Activity已经完成绑定
onCreate():初始化Fragment。
onCreateView():初始化Fragment的布局。加载布局和findViewById的操作
onActivityCreated():在该方法内可以进行与Activity交互的UI操作,
onStart():Fragment由不可见变为可见状态。
onResume():Fragment处于活动状态,用户可与之交互。
onPause():Fragment处于暂停状态,可见不可交互。
onStop():Fragment完全不可见。
onDestroyView():销毁与Fragment有关的视图,
onDestroy():销毁Fragment。
onDetach():解除与Activity的绑定。
为什么系统不建议在子线程访问UI?
Android的UI控件不是线程安全的,如果在多线程中并发访问可能会导致UI控件处于不可预期的状态这时你可能会问为何系统不对UI控件的访问加上锁机制呢?
因为加锁机制会让UI访问逻辑变的复杂,降低UI的访问效率,因为加锁会阻塞某些线程的执行
Looper死循环为什么不会导致应用卡死?
造成ANR的不是主线程阻塞,而是主线程的Looper消息处理过程发生了任务阻塞,无法响应手势操作,不能及时刷新UI等。
可以在子线程直接new一个Handler吗?怎么做?
不可以,因为在主线程中,Activity内部包含一个Looper对象,它会自动管理Looper,处理子线程中发送过来的消息。而对于子线程而言,没有任何对象帮助我们维护Looper对象,所以需要我们自己手动维护。所以要在子线程开启Handler要先创建Looper,并开启Looper循环
Android中还了解哪些方便线程切换的类
AsyncTask:底层封装了线程池和Handler,便于执行后台任务以及在子线程中进行UI操作。HandlerThread:一种具有消息循环的线程,其内部可使用Handler。IntentService:是一种异步、会自动停止的服务,内部采用HandlerThread。
在Activity中创建一个thread跟在service中创建一个thread的区别?
在Activity中被创建:该Thread的就是为这个Activity服务的,在该Activity中处理一些消息和事件,Activity销毁后,Thread也就结束了
在Service中被创建:这是保证最长生命周期的Thread的唯一方式,只要整个Service不退出,Thread就可以一直在后台执行,一般在Service的onCreate()中创建,在onDestroy()中销毁。所以,在Service中创建的Thread,适合长期执行一些独立于APP的后台任务,比较常见的就是:在Service中保持与服务器端的长连接
网友评论