谈谈你对android系统(体系)架构的理解
Linux操作系统为核心,从下往上,依赖关系。
- 应用程序层:包括系统应用以及第三方应用。
- 应用程序框架:提供应用开发所必须的一些API框架,是软件复用的重要手段
- 库:android运行时(核心包(相当于JDK提供的包),虚拟机(优化过的JVM));C/C++的一些库
- Linux核心:提供了电源管理、进程调度、内存管理、网络协议栈、驱动模型等核心系统服务
android中的四大组件以及应用场景
- Activity:在Android应用中负责与用户交互的组件。
- Service:常用于为其他组件提供后台服务或者监控其他组件的运行状态。经常用来执行一些耗时操作。
- BroadcastReceiver:用于监听应用程序中的其他组件。
- ContentProvider:Android应用程序之间实现实时数据交换。
1、Activity的生命周期
生命周期:对象什么时候生,什么时候死,怎么写代码,代码往那里写。
注意:
- 当打开新的Activity,采用透明主题的时候,当前Activity不会回调onStop
- onCreate和onDestroy配对,onStart和onStop配对(是否可见),onResume和onPause配对(是否在前台,可以与用户交互)
- 打开新的Activity的时候,相关的Log为:
1. Main1Activity: onPause
2. Main2Activity: onCreate
3. Main2Activity: onStart
4. Main2Activity: onResume
5. MainA1ctivity: onStop
异常状态下的生命周期:
资源相关的系统配置发生改变或者资源不足:例如屏幕旋转,当前Activity会销毁,并且在onStop之前回调onSaveInstanceState保存数据,在重新创建Activity的时候在onStart之后回调onRestoreInstanceState。其中Bundle数据会传到onCreate(不一定有数据)和onRestoreInstanceState(一定有数据)。
防止屏幕旋转的时候重建,在清单文件中添加配置:
1. android:configChanges="orientation"
2、Fragment的生命周期
正常启动
1. Activity: onCreate
2. Fragment: onAttach
3. Fragment: onCreate
4. Fragment: onCreateView
5. Fragment: onActivityCreated
6. Activity: onStart
7. Activity: onResume
正常退出
1. Activity: onPause
2. Activity: onStop
3. Fragment: onDestroyView
4. Fragment: onDestroy
5. Fragment: onDetach
6. Activity: onDestroy
3、Activity的启动模式
- standard:每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈;
- singleTop:如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例;
- singleTask:如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,即把该Activity以上的Activity实例都pop,并调用其onNewIntent;
- singleInstance:应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例。
4、Activity与Fragment之间的传值
通过findFragmentByTag或者getActivity获得对方的引用(强转)之后,再相互调用对方的public方法,但是这样做一是引入了“强转”的丑陋代码,另外两个类之间各自持有对方的强引用,耦合较大,容易造成内存泄漏。
通过Bundle的方法进行传值,例如以下代码:
1. //Activity中对fragment设置一些参数
2. fragment.setArguments(bundle);
4. //fragment中通过getArguments获得Activity中的方法
5. Bundle arguments = getArguments()
利用eventbus进行通信,这种方法实时性高,而且Activity与Fragment之间可以完全解耦。
1. //Activity中的代码
2. EventBus.getDefault().post("消息");
3. //Fragment中的代码
4. EventBus.getDefault().register(this);
5. @Subscribe
6. public void test(String text) {
7. tv_test.setText(text);
8. }
5、Service
Service分为两种:
- 本地服务,属于同一个应用程序,通过startService来启动或者通过bindService来绑定并且获取代理对象。如果只是想开个服务在后台运行的话,直接startService即可,如果需要相互之间进行传值或者操作的话,就应该通过bindService。
- 远程服务(不同应用程序之间),通过bindService来绑定并且获取代理对象。
对应的生命周期如下:
1. context.startService() ->onCreate()- >onStartCommand()->Service running--调用context.stopService() ->onDestroy()
2. context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind() -> onDestroy()
注意
- Service默认是运行在main线程的,因此Service中如果需要执行耗时操作(大文件的操作,数据库的拷贝,网络请求,文件下载等)的话应该在子线程中完成。
- !特殊情况是:Service在清单文件中指定了在其他进程中运行。
6、Android中的消息传递机制
为什么要使用Handler?
因为屏幕的刷新频率是60Hz,大概16毫秒会刷新一次,所以为了保证UI的流畅性,耗时操作需要在子线程中处理,子线程不能直接对UI进行更新操作。因此需要Handler在子线程发消息给主线程来更新UI。
这里再深入一点,Andro