Android Service服务详细解析(上)

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()指定播放位置

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值