Service是什么?
Service服务组件没有UI界面,且属于后台服务中进行,但Service是在主线程中执行
service服务
Android四大组件之一 : 运行在后台,不可见的,执行着一些不为人知的的工作。。
服务不是一个单独的进程,服务对象本身并不意味着他运行在自己的进程中,除非另有规定,否则与承训运行在同一个进程中
服务不是线程 ,服务的代码都是运行在主线程中的,因此如果需要访问网络 或 做延时操作的时候 需要开启子线程来完成 否则会ANR
服务是一个应用程序的组件,可以告诉系统去分配一些工作让他在后台执行(甚至可以没有与用户交互的过程),从调用startService方法开始执行系统分配的共作,直到有客户端或自己将service 停止
服务是一用用程序的组件并且可以为其他的 程序提供一些功能,调用Context.bindService() 与其他的应用程序建立一个长期的连接,进行交互
服务的分类:
本地服务LocalService:
startService:直接启动一个服务 参数是Intent
生命周期:
onCreate onStartCommand onDestroy
当 上下文对象调用startService的时候 Service的生命周期会执行 onCreate onstarteCommand
如果 上下文对象再次调用startService 则service的生命周期会执行 onStartCommand
如果上下文对象调用了 stopService方法 则service会执行 onDestroy方法
当 上下文对象启动了service 上下文对象销毁了 service 不会停止
service的停止方式 只有 client调用stopService 和 Service本身 调用StopSelf 这两个方式
startCommand:
代码都是运行在主线程中的
1.参数: intent 是 startService方法传递过来的参数
flags 标记
startId 启动的 Id
2.返回值:
START_STICKY 粘性服务 常量1 当服务被系统异常杀死的时候 服务会重启 但是 Intent = null
START_NOT_STICKY 非粘性服务 常量2 当服务被系统异常杀死的时候 服务 不会重启
START_REDLIVER_INTENT 常量3 当服务被系统异常杀死的时候 服务会重启 并且 Intent 不为null
START_STICKY_COMPATIBILITY 常量0 当服务被系统异常杀死的时候 服务不一定会被重启 sticky的兼容版本 (了解)
bindService:
远程服务RemoteService:
bindService:
Context.startService();
Context.bindService();为其他的应用提供一个服务没有指定线程 就是运行在主线程中
IntentService有他自己的线程
跨进程通信1.内容提供者 ContentPrivider 2.bindService
一个应用中可以有多个进程
服务service不是一个线程
服务的存在时因为其好管理与线程相比
重点
1.服务不是一个单独的进程 服务本身在进程的内部
2.服务不是线程,是运行在主线程中的
3.服务是一个应用程序的组件,在后台工作,只能被停止stopService()或者自杀stopSelf()要不不会停止;
4.服务是一个应用程序的组件,可以为其他的应用提供一些功能,调用context.bindservice()与其它应用程序建立一个长连接
一个应用可能有多个进程
服务1.本地服务 Localservice 启动startService 和bindService 远程服务RemoteService 别的应用启动 bindService
Service 不能实例化对象,直接用 Service.class即可
当前线程ID
Thread.currentThread().getId();当前线程id
Service有什么用?
1,播放音乐或视频,因为Service处于后台的服务进程,那么他可以长时间的在后台保留,因此他可以管理后台线程或使用子线程管理的组件,如MediaPlayer组件.管理这些线程的生命周期
Service怎么用?
下面为大家讲一下Service的基本用法:
首先创建一个Service的子类,然后在清单文件中注册,与其他三大组件相同,最后在Activity中通过Comtext.startService(Intent i)方法启动Service,在使用的意图中i.setclass();设置你将要启动的Service的class,如果你想在Activity中停止意图使用Context.stopService(Intent i);
其中创建service的子类需要重写onCreate()方法(服务初始化的时候执行,服务初始化的时候执行,只执行一次)、重写onStartCommand(Intent intent, int flags, int startId)方法,(服务启动的时候执行,每次启动都会执行)、重写onDestroy()方法,(服务销毁的时候执行,只执行一次,一般是用于回收onCreate()方法中初始化的一些对象)
onStartCommand(Intent intent, int flags, int startId)种三个参数:
1,intent,启动给服务的意图
2,flags,启动该服务的方式
3,startId本次启动该服务的标识
注意:在创建Service的子类的时候要求必须重写onBind方法
IntentService:
IntentService的父类是Service,处理异步请求的Service,其内有一个工作线程来处理耗时操作
其中IntentService生命周期方法有四种,分别为onCreate()、onStartCommand(Intent,int flags,int startId)、onHandleIntent(Intent) 在子线程执行的,不会阻塞应用程序的主线程、onDestroy()
IntentService用法:
创建IntentService子类时,需要提供一个无参的构造方法且调用super(null)
启动服务:Context.startService(Intent)
停止服务: 任务完成后其自动停止服务
IntentService的使用场景:
在Android开发中,我们或许会碰到这么一种业务需求,一项任务分成几个子任务,子任务按顺序先后执行,子任务全部执行完后,这项任务才算成功。那么,利用几个子线程顺序执行是可以达到这个目的的,但是每个线程必须去手动控制,而且得在一个子线程执行完后,再开启另一个子线程。或者,全部放到一个线程中让其顺序执行。这样都可以做到,但是,如果这是一个后台任务,就得放到Service里面,由于Service和Activity是同级的,所以,要执行耗时任务,就得在Service里面开子线程来执行。那么,有没有一种简单的方法来处理这个过程呢,答案就是IntentService。
什么是IntentService :
IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们去手动控制。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。
粘性Service:
START_STICKY 粘性标识
如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null
START_NOT_STICKY 非粘性标识
“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
START_REDELIVER_INTENT 带数据的粘性标识
重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入
启动Service并控制它的重新启动行为:
public int onStartCommand(Intent intent,int flags,int startId){
return Service.START_STICKY;
}
/**
* 第一个参数: startService的时候传递过来的Intent
* 第二个参数:当前系统给Service的一个标记
* 第三个参数:系统给当前Service分配的一个Id
*
*
* START_STICKY 粘性服务 常量1 当服务被系统异常杀死之后 服务会被重启 但是Intent 值为 null
* START_NOT_STICKY 非粘性服务 常量2 当服务被系统异常杀死之后 服务不会重启
* START_REDELIVER_INTENT 常量3 当服务被系统异常杀死之后 服务会重启 并且 Intent 有值
* START_STICKY_COMPATIBILITY 常量0 当服务被系统异常杀死之后 服务不一定会重启 START_STICKY的兼容版本 了解
*/
增加一个小知识,MediaPlayer 媒体播放类
MediaPlayer 媒体播放类一般用于播放音乐和视频文件,构造方法是MediaPlayer(),静态方法构造:MediaPlayer create(Context context, int resid)
用setDataSource(String path)设置媒体源,setLooping(boolean) 设置是否循环播放,prepare() 预处理,调用start()前必须先调用此方法。
start() 开始播放
pause()暂停播放
stop() 停止播放
isPlaying() 是否正在播放
player.getCurrentPosition();//获得当前播放位置
seekTo()指定播放位置