Service
四大组件之一,是Android的一种机制,服务是运行在主线程上的,没有界面
1.service和Thread的区别和场景
Thread:
程序执行的最小单元,它是分配CPU的基本单位。
- 生命周期:新建-就绪-运行-死亡-阻塞
- 缺点:无法控制,当activity关闭之后不再持有thread,activity将无法控制thread
Service:
是Android的一种机制,由系统进程托管,服务是运行在主线程上的,不可以进行耗时操作
- 生命周期:onCreate-onStart-onDestroy-onBind-onUnbind
startService之后,onCreate只会调用一次,onstartCommand调用次数与startService调用次数相同
stopService会调用onDestroy方法,一个activity被start又被bind之后,在没有解绑的前提下,stopService不会停止该服务
2.Service和IntentService
谷歌官方不建议在Service中编写耗时的逻辑和操作,否则会引起ANR
- IntentService是继承自Service并处理异步请求的一个类;
- IntentServcie内部有一个工作线程HandlerThread来处理耗时操作,IntentService完成之后会自动停止;
- IntentService内部是通过消息的方式发送给HandlerThread的,然后由Handler中的Looper来处理消息;
- IntentService后台任务执行时顺序的,当有多个任务时,这些任务会按照调用顺序依次执行,完成之后自动停止
3.启动服务和绑定服务
1.先绑定服务后启动服务:绑定服务会转为启动服务运行状态,如果绑定的activity销毁,服务会继续运行
2.先启动服务后绑定服务:服务不会转为绑定服务状态,会和Activity绑定,但是activity销毁,会按启动服务生命周期走
- 启动服务的优先级比绑定服务高
- 服务在其托管进程的主线程中运行(UI线程),如果要执行耗时操作,需在子线程中运行
4.Parcelable和Serializable
序列化:内存中对象-->磁盘
反序列化:磁盘中对象-->内存
Serializable是java提供的序列化接口,Parcelable是安卓特有的,效率上,Parcelable强于Serializable(主要是在内存开销上)
组件中(内存中)传递数据,推荐使用Parcelable,如果序列化到存储设备,推荐Serializable
Serializable:
- 使用:实现Serializable接口
- 特点:内存开销大
Parcelable
- 使用:实现Parcelable接口,需要添加静态成员变量,写的顺序和读的顺序要一致
- 缺点:内存开销小,代码实现麻烦
5.AIDL
进程间通信(IPC)机制,AIDL是服务端和客户端都认可的接口
1.创建AIDL:实体对象,新建AIDL文件,make工程
2.服务端:新建Service,创建binder对象,定义方法
3.客户端:实现ServiceConnection,BindService
6.广播接收器,动态注册于静态注册区别
广播接收器运行在UI线程,不能做耗时操作
为什么要在onResume中注册广播,在onPause中注销广播?
防止内存泄漏,onpause一定会执行,当系统内存紧张时,系统可能会回收 activity,而activity的onstop和ondestroy不一定会被执行
- 使用方式:静态,在清单文件中通过<receiver>标签声明;动态,在代码中调用Context.registerReceiver
- 特点:静态,常住进程中,不受组建生命周期影响;动态,受组件生命周期影响
- 应用场景:静态,时刻监听广播;动态,需要在特定时刻接收广播
网友评论