一,service
service是一种可以在后台执行长时间运行操作而没有用户界面的应用组件。
二,service和Thread的区别(其实二者没有任何关系的)
(1)Service运行在主线程上,不是独立的,是依托于主线程的,不能执行耗时操作,否则会ANR,注意,服务不是后台。
如果一定要进行耗时操作:
可以新开线程执行耗时操作。(既然service也是新开线程执行耗时操作,但为什么不直接在activity里新开线程呢,因为activity容易销毁。)
也可以使用IntentService异步管理服务。
Thread是程序执行的最小单元,是分配CPU的基本单位,在线程里可以执行耗时操作。
(2)长时间任务如音乐播放,定时播放可以用service,但耗时操作如下载文件,数据库出来使用Thread。
三,开启service的两种方式以及区别
(1)生命周期
startService:
客户端调用startService()后:onCreate(),onStartCommand()
客户端调用stopService()后:onDestroy()
bindService:
客户端调用bindService()后:onCreate(),onBind()
客户端调用unbindService()后:onUnbind(),onDestroy()
(2)步骤
startService:
1,定义一个类继承Service,必须实现的onBind方法返回null即可;
2,在Manifest.xml文件中配置该Service;
3,使用startService(intent)方法和stopService(intent)方法启动和停止该service
bindService:
1,定义一个类继承Service,创建一个继承Binder的实例对象(LocalBinder 的对象) ,提供公共方法供客户端使用;
2,实现onBind()方法
如创建内部类,onBind方法返回该binder
private LocalBinder binder = new LocalBinder();
public class LocalBinder extends Binder{
//声明一个方法,提供给客户端调用实例
BindService getService(){
return BindService.this;
}
}
3,在Manifest.xml文件中配置该Service;
4,在客户端中创建ServiceConnection实例,在回调方法onServiceConnected(ComponentName componentName, IBinder iBinder)中接受binder并获取mService:
BindService.LocalBinder binder = (BindService.LocalBinder) iBinder;
mService = binder.getService();
ServiceConnection的回调方法onServiceDisconnected(ComponentName componentName)在服务崩溃或者服务杀死导致的连接中断时调用
5,客户端中使用bindService(intent,conn,BIND_AUTO_CREATE)方法绑定service,使用unbindService(conn)方法解除绑定。
四,提高Service优先级
1,<service android:name=".MyService" android:priority="1000" /> 将该属性设置为最高,数字越小优先级越低;
2,在onStartCommand里面调用 startForeground()方法把Service提升为前台进程级别,但是在onDestroy里面要调用stopForeground ()方法。
3,在onStartCommand里面返回return Service.START_STICKY;
4,在onDestroy方法里重启service;
五,onStartCommand(Intent intent, int flags, int startId)中flags的意义
START_STICKY:被kill时,保留service的状态为开始状态,但不保留递送的intent对象。然后系统会重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
START_NOT_STICKY:service被异常kill后,不会重启该服务;
START_REDELIVER_INTENT:service被异常kill后,系统会重启该服务,并将intent的值传入。
START_STICKY_COMPATIBILITY:START_STICKY 的兼容版本,但不保证服务被 kill 后一定能重启。
六,IntentService
IntentService是继承并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统service一样,同时,当任务执行结束后,IntentService会自动停止,不需要手动控制或stopSelf()。另外,可以启动IntentService多次,每一次耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,操作方式是串行的。
本质就是一个特殊的service,封装HandlerThread和Handler的异步框架。
内部原理是HandlerThread和Handler实现的异步操作。
1,使用方法
必须实现构造方法和onHandleIntent(Intent intent)方法
在onHandleIntent方法中,因为是异步方法,所以可以进行耗时操作。
2,源码
在onCreate()方法创建了HandlerThread对象。
在onHandleIntent方法中主动调用了stopSelf方法。