志在指尖
用双手敲打未来

Android四大组件之Service

前语
Hi,大家好,上一期咱们讲了如何运用BroadcastReceiver,这一期咱们讲解Android四大组件之Service相关常识。每天一篇技能干货,每天咱们一起进步。
耐心专心不仅仅是美德,更是一笔财富。
1.简介与界说
简介
Service是一个能够在后台履行长期运转操作而不供给用户界面的运用组件。Service可由其他运用组件发动,而且即运用户切换到其他运用,Service仍将在后台继续运转。此外,组件能够绑定到Service,以与之进行交互,乃至是履行进程间通信(IPC)。例如,Service能够处理网络业务、播放音乐,履行文件I/O或与内容供给程序交互,而一切这一切均可在后台进行。
界说
Service是一个专门在后台处理长期任务的Android组件。
1.Service不是一个独自的进程;
2.Service也不是一个独自的线程;
3.Service是一个独自的Android组件,Service运转在主线程上,假如想在Service中处理很占时刻的操作时,有必要在Service中开线程,以降低Activity没有响应的危险;
4.Service不供给用户界面;
它有两种发动办法:startService和bindService。
2.用处
Service有三个常见用处。
1.功用调度:Service接纳指定的播送信息,从而进一步分析和处理事件,最终修改数据、更新界面或许进行其他相关的操作,调度整个运用使其坚持正确的状态。
2.功用供给:Service并不会接纳任何的播送,只接纳指定的播送供给状态数据,这时需求绑定Service,绑定Service时要管理好Service,一般在Activity的onStop函数里进行解绑unBindService操作。
3.长途调用:界说AIDL服务,跨进程调用Service,先界说一个长途调用接口,然后为该接口供给一个IBinder完成类,客户端获取了长途的Service的IBinder目标的署理后,经过该IBinder目标去回调长途Service的特色或办法。
3.运用场景
假如某个程序组件需求在运转时向用户呈现界面,或许程序需求与用户交互,就需求用Activity,否则就应该考虑运用Service。
4.Service与Activity对比
相似点:
1.都是独自的Android组件;
2.都具有独立的生命周期;
3.都是Context的派生类,所以能够调用Context类界说的如getResources()、getContentResolver()等办法;
4.都具有自己生命周期回调办法;Android
不同点:
1.Activity运转于前台有图形用户界面,担任与用户交互;Service通常坐落后台运转,不需求与用户交互,也没有图形用户界面。
5.Service的生命周期
随着运用程序发动Service办法不同,Service的生命周期也略有差异,如下图:
假如运用程序经过startService()办法来发动Service,Service的生命周期如上图左半部分所示。
经过调用startService()办法发动Service:当其他组件调用startService()办法时,Service被创立,而且无限期运转,其自身有必要调用stopSelf()办法或许其他组件调用stopService()办法来中止Service,当Service中止时,体系将其毁掉。
假如运用程序经过bindService()办法来发动Service,Service的生命周期如上图右半部分所示。
经过bindService()办法发动Service:当其他组件调用bindService()办法时,Service被创立。接着客户端经过IBinder接口与Service通信。客户端经过unbindService()办法关闭衔接。多个客户端能绑定到同一个Service,而且当他们都免除绑定时,体系将毁掉Service(Service不需求被中止)
特别阐明:当Activity调用bindService()绑定一个已经过startService()发动的Service时,体系只是把Service内部的IBinder目标传给Activity,并不会把该Service生命周期彻底绑定到该Activity,因而当Activity调用unBindService()办法撤销与该Service的绑定时,也只是堵截该Activity与Service之间的相关,并不能中止该Service组件。要中止该Service组件,还需调用stopService()办法。
在Service的生命周期里,常用的有:
4个手动调用的办法
手动调用办法作用
startService()发动服务
stopService()关闭服务
bindService()绑定服务
unbindService()解绑服务
5个主动调用的办法
内部主动调用的办法作用
onCreate()创立服务
onStartCommand()开端服务
onDestroy()毁掉服务
onBind()绑定服务
onUnbind()解绑服务
6.Service的运用
当咱们开端运用Service的时分当然是发动一个Service了,发动Service的办法和发动Activity很相似,都需求借助Intent来完成,下面咱们就经过一个详细的例子来看一下。
publicclassMyServiceextendsService{publicstaticfinalStringTAG=”MyService”;
@OverridepublicvoidonCreate(){super.onCreate();
Log.d(TAG,”onCreate()executed”);
}
@OverridepublicintonStartCommand(Intentintent,intflags,intstartId){
Log.d(TAG,”onStartCommand()executed”);returnsuper.onStartCommand(intent,flags,startId);
}
@OverridepublicIBinderonBind(Intentintent){returnnull;
}
@OverridepublicvoidonDestroy(){super.onDestroy();
Log.d(TAG,”onDestroy()executed”);
}
}
要创立一个这样的Service,你需求让该类承继Service类,然后重写以下办法:
onCreate()1.假如service没被创立过,调用startService()后会履行onCreate()和onStartCommand()办法;2.假如service已处于运转中,调用startService()不会履行onCreate()办法,只履行onStartCommand()办法。也便是说,onCreate()只会在第一次创立service时分调用,屡次履行startService()不会重复调用onCreate(),此办法适合完成一些初始化作业。
onStartCommand()假如屡次履行了Context的startService()办法,那么Service的onStartCommand()办法也会相应的屡次调用。onStartCommand()办法很重要,咱们在该办法中依据传入的Intent参数进行实际的操作,比方会在此处创立一个线程用于下载数据或播放音乐等。
onBind()Service中的onBind()办法是抽象办法,Service类自身便是抽象类,所以onBind()办法是有必要重写的,即便咱们用不到。
onDestroy()在毁掉的时分会履行Service的该办法。
这几个办法都是回调办法,且在主线程中履行,由Android操作体系在适宜的机遇调用。
留意:每个Service有必要在manifest中经过来声明。

现在咱们经过承继Service的办法界说了咱们自己的MyService类,而且在manifest中声明了咱们的MyService,接下来咱们应该发动咱们自己的服务。
发动Service
第一种办法:咱们是经过一个Intent目标,并调用startService()办法来发动MyService。
IntentstartIntent=newIntent(this,MyService.class);
startService(startIntent);
留意:假如咱们是经过点击Button履行上面的代码,那么第一次点击的时分回履行其间的onCreate()跟onStartCommand()办法,可是当咱们第2次点击的时分就只会履行onStartCommand()办法。
为什么会这样呢?这是由于onCreate()办法只会在Service第一次被创立的时分调用,假如当前Service已经被创立过了(第一次点击创立了MyService),不管怎样调用startService()办法,onCreate()办法都不会再履行。
第二种办法:经过bindService发动Service。
bindService发动服务特色:1.bindService发动的服务和调用者之间是典型的client-server模式。调用者是client,service则是server端。service只有一个,但绑定到service上面的client能够有一个或很多个。这儿所提到的client指的是组件,比方某个Activity。
2.client能够经过IBinder接口获取Service实例,从而完成在client端直接调用Service中的办法以完成灵敏交互,这在经过startService()办法发动中是无法完成的。
3.bindService发动服务的生命周期与其绑定的client息息相关。当client毁掉时,client会主动与Service免除绑定(client会有ServiceConnectionLeaked异常,但程序不会崩溃)。当然,client也能够清晰调用Context的unbindService()办法与Service免除绑定。当没有任何client与Service绑定时,Service会自行毁掉。
发动了之后,当咱们想中止服务的时分该怎么做呢?
中止Service
第一种办法:咱们也是经过一个Intent目标,并调用stopService()办法来中止MyService
IntentstopIntent=newIntent(this,MyService.class);
stopService(stopIntent);
第二种办法:调用unbindService(conn)办法来中止MyService
unbindService(ServiceConnectionconn)
Service和Activity通信
在上面咱们高高兴兴的发动了Service了,可是仔细的你或许发现了,貌似咱们仅仅只是发动了罢了,Activity跟Service并没有多少”沟通”,下面咱们就让Activity跟Service沟通一下。
publicclassMyServiceextendsService{publicstaticfinalStringTAG=”MyService”;privateMyBindermBinder=newMyBinder();
@OverridepublicvoidonCreate(){super.onCreate();
Log.d(TAG,”onCreate()executed”);
}
@OverridepublicintonStartCommand(Intentintent,intflags,intstartId){
Log.d(TAG,”onStartCommand()executed”);returnsuper.onStartCommand(intent,flags,startId);
}
@OverridepublicvoidonDestroy(){super.onDestroy();
Log.d(TAG,”onDestroy()executed”);
}
@OverridepublicIBinderonBind(Intentintent){returnmBinder;
}classMyBinderextendsBinder{publicvoidstartDownload(){
Log.d(“TAG”,”startDownload()executed”);//履行详细的下载任务}
}
}
接下来咱们在MainActivity中经过Button来绑定Service和免除绑定
publicclassMainActivityextendsActivityimplementsOnClickListener{privateButtonbindService;privateButtonunbindService;privateMyService.MyBindermyBinder;privateServiceConnectionconnection=newServiceConnection(){
@OverridepublicvoidonServiceDisconnected(ComponentNamename){
}
@OverridepublicvoidonServiceConnected(ComponentNamename,IBinderservice){
myBinder=(MyService.MyBinder)service;
myBinder.startDownload();
}
};
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindService=(Button)findViewById(R.id.bind_service);
unbindService=(Button)findViewById(R.id.unbind_service);
bindService.setOnClickListener(this);
unbindService.setOnClickListener(this);
}
@OverridepublicvoidonClick(Viewv){switch(v.getId()){caseR.id.bind_service:
IntentbindIntent=newIntent(this,MyService.class);
bindService(bindIntent,connection,BIND_AUTO_CREATE);break;caseR.id.unbind_service:
unbindService(connection);break;default:break;
}
}
}
能够看到,这儿咱们首要创立了一个ServiceConnection的匿名类,在里面重写了onServiceConnected()办法和onServiceDisconnected()办法,这两个办法别离会在Activity与Service树立相关和免除相关的时分调用。在onServiceConnected()办法中,咱们又经过向下转型得到了MyBinder的实例,有了这个实例,Activity和Service之间的联系就变得非常紧密了。现在咱们能够在Activity中依据详细的场景来调用MyBinder中的任何public办法,即完成了Activity指挥Service干什么Service就去干什么的功用。
当然,现在Activity和Service其实还没相关起来了呢,这个功用是在BindService按钮的点击事件里完成的。能够看到,这儿咱们仍然是构建出了一个Intent目标,然后调用bindService()办法将Activity和Service进行绑定。bindService()办法接纳三个参数,第一个参数便是刚刚构建出的Intent目标,第二个参数是前面创立出的ServiceConnection的实例,第三个参数是一个标志位,这儿传入BIND_AUTO_CREATE表明在Activity和Service树立相关后主动创立Service,这会使得MyService中的onCreate()办法得到履行,但onStartCommand()办法不会履行(只有当咱们经过startService()办法恳求发动服务时,调用此办法)。
免除Activity和Service之间的相关,调用
unbindService(connection);
关于毁掉Service阐明
在MyService的内部经过stopSelf()办法来毁掉的;
一个Service有必要要在既没有和任何Activity相关又处理中止状态的时分才会被毁掉;
在Service的onDestroy()办法里去整理掉那些不再运用的资源,防止在Service被毁掉后还会有一些不再运用的目标仍占用着内存;
7.IntentService
IntentService是Service的子类,在介绍IntentService之前,先来了解运用Service时需求留意的两个问题
Service不会专门发动一个线程履行耗时操作,一切的操作都是在主线程中进行的,以至于简单呈现ANR,所以需求手动敞开一个子线程;
Service不会主动中止,需求调用stopSelf()办法或许是stopService()办法中止;
运用IntentService不会呈现这两个问题,由于IntentService在敞开Service时,会主动敞开一个新的线程来履行它,另外,当Service运转完毕后,会主动中止。
8.如何确保服务不会被杀死
第一种办法,返回START_STICKY或START_REDELIVER_INTENT
当Service因内存不足而被体系kill后,一段时刻后内存再次空闲时,体系将会测验从头创立此Service,一旦创立成功后将回调onStartCommand办法,但其间的Intent将是null,除非有挂起的Intent,如pendingintent,这个状态下比较适用于不履行命令、但无限期运转并等待作业的媒体播放器或相似的服务。
/***返回START_STICKY或START_REDELIVER_INTENT
*@paramintent
*@paramflags
*@paramstartId
*@return*/@OverridepublicintonStartCommand(Intentintent,intflags,intstartId){//returnsuper.onStartCommand(intent,flags,startId);returnSTART_STICKY;
}
第二种办法,提高service的优先权
<service
android:name=”com.demo.UploadService”android:enabled=”true”>
结语
Service作为Android的四大组件之一,而且项目开发过程中一些场景下经常被运用到,小伙伴们赶忙上手实操,把它灵敏的运用到项目中,结合上两期的Activity和BroadcastReceiver完成有趣的交互吧。

未经允许不得转载:IT技术网站 » Android四大组件之Service
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载