第一关:四大组件(计划学习一周,打卡开始时间:2019.6.18)
核心知识点:Activity、Service的生命周期;Activity启动模式;Intent的知识点;startService和bindService。
**收获:
2019.6.25
1.为什么Android有四大组件,而不是三大组件或五大组件?
这个问题从一个最普通的应用场景最好解答,用户点击屏幕操作按钮,调取网络数据,然后通知页面更新数据,并将数据做保存。其中第一步,用户点击屏幕按钮,是前台操作,也即是对应的Activity;第二步,调取网络数据,是后台操作,对应Service;第三步,通知页面更新数据,是前后台通信的过程,这是Broadcast Receiver的工作;第四步,数据保存,是ContentResolver要做的事情。所以,Android系统提供四大组件,是为了满足开发工程当中最典型的需求。
2.onStart()和onStop()方法是从页面是否在前台显示的角度考虑的,onResume()和onPause()方法是从页面是否可以与用户交互(是否获得焦点)的角度来说的。
3.SingleTop使用案例:比如在商品详情页面,点击推荐商品,进入的还是商品详情页,此时,我们可以将该页面设置为singleTop,只需要更新页面里的view即可。
4.SingleTask使用案例:在IM中使用比较多,比如从聊天页面进入点击进入其他页面,然后有了聊天消息通知,点击进入后再次进入到聊天页面,会清掉刚才进入的其他页面,并将聊天消息刷新。
5.SingleInstance:在任务栈里只存在一个activity,这种场景比较少,一般用于系统应用,并且可以被其他应用共享使用,比如来电呼叫页面,整个系统中只能有一个,因为同一时刻只能有一个打电话页面。
6.一般启动模式都是在AndroidManifest文件里写死,但也可以动态设置,代码中可以使用的启动标签一般有如下三个:
intent.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlag(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.setFlag(Intent.FLAG_ACTIVITY_SINGLE_TOP);
其中第一个和第二个组合使用,用来表示singleTask的作用;第一个和第三个组合使用,用来表示singleTop的作用。
7.启动服务有两种方式startService()和bindService();其区别就是该Service是否可以和启动它的组件(Activity)进行通信,bindService()可以拿到Service的binder,来实现进程间通信。
startService()涉及到生命周期方法:
- onCreate():做一些初始化工作,比如创建数据缓存、线程池等。
- onStart():后台任务一般放在这里执行。
- onDestory():页面销毁时调用,用来释放初始化时所申请的资源。
bindService()涉及到的生命周期方法:
- onCreate():做一些初始化工作,比如创建数据缓存、线程池等。
- onBind():Activity需要和Service进行通信的时候,调用该方法。
- onUnbind():该方法在调用unbindService()方法时调用,用来中断activity和Service的连接,默认返回false,但如果需要在onRebind()里做事情的话,需要返回true。
- onRebind():该方法在多次调用bindService()和unbindService()时后调用,一般不在其内部处理什么场景处理,但如果要统计用户行为,会做一些数据统计。
- onDestory():页面销毁时调用,用来释放初始化时所申请的资源。
8.Service的优点:系统支持,创建方便,优先级高,App退出后台不易被杀死;缺点:启动Service涉及到多次IPC,运行效率不高,而且受限于系统接口,使用起来不够灵活。对于一些特殊的需求,比如进程保活、使用第三方sdk服务就需要用Service来实现。
9.使用线程池,运行效率高,配置、使用灵活,方便同一调度管理。
10.广播的最大特点是其发送者和接受者事先是不需要知道对方是否存在的,这样的好处在于,系统的组件可以松耦合的组织在一起。并且,它还可以监听系统事件广播。
11.广播使用注意事项:
- 在onReceiver()方法中不能做耗时操作,操作10s会报ANR。
- 如果在广播(在Service中也一样)当中启动Activity的话,需要给Intent设置Intent.FLAG_ACTIVITY_NEW_TASK标签。
- 监听系统广播,需要在AndroidManifest中申请权限,此外,高版本对系统一些广播做了限制,比如开机启动、网络变化、电池电量、锁屏等,如果需要监听这些广播,需要做系统兼容处理。
- 普通广播是并行、无序执行,有序广播的广播接收器按照优先级串行执行。
12.ContentProvider作为数据的处理源,我们一般不去直接操作它,而是使用ContentResolver来访问ContentProvider,因为它可能供多个app来访问数据。
13.像一些系统内置应用,日历、短信、通讯录等,可能供其他App共享数据,所以使用ContentProvider较多,而对于普通的app,出于安全考虑,一般不会将数据提供给第三方来访问,对app内部的话,完全可以自己来实现一套数据库框架,这样灵活、和可扩展性都比较好,而ContentProvider与系统依赖性较强,灵活性不如线程的网络框架。