Android服务详解Word格式.docx

上传人:b****5 文档编号:21374093 上传时间:2023-01-30 格式:DOCX 页数:23 大小:31.02KB
下载 相关 举报
Android服务详解Word格式.docx_第1页
第1页 / 共23页
Android服务详解Word格式.docx_第2页
第2页 / 共23页
Android服务详解Word格式.docx_第3页
第3页 / 共23页
Android服务详解Word格式.docx_第4页
第4页 / 共23页
Android服务详解Word格式.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

Android服务详解Word格式.docx

《Android服务详解Word格式.docx》由会员分享,可在线阅读,更多相关《Android服务详解Word格式.docx(23页珍藏版)》请在冰豆网上搜索。

Android服务详解Word格式.docx

当服务被终止的时候,用户是看不到效果的。

某些不需要运行或终止提示的服务,如天气更新,日期同步,邮件同步等。

有同学可能会问,后台服务我们可以自己创建ONGOING的Notification这样就成为前台服务吗?

答案是否定的,前台服务是在做了上述工作之后需要调用startForeground(Android2.0及其以后版本)或setForeground(Android2.0以前的版本)使服务成为前台服务。

这样做的好处在于,当服务被外部强制终止掉的时候,ONGOING的Notification任然会移除掉。

按使用方式分类:

startService启动的服务

主要用于启动一个服务执行后台任务,不进行通信。

停止服务使用stopService

bindService启动的服务

该方法启动的服务要进行通信。

停止服务使用unbindService

startService同时也bindService启动的服务

停止服务应同时使用stepService与unbindService

以上面三种方式启动的服务其生命周期也有区别,将在随后给出。

2、Service与Thread的区别

很多时候,你可能会问,为什么要用Service,而不用Thread呢,因为用Thread是很方便的,比起Service也方便多了,下面我详细的来解释一下。

1).Thread:

Thread是程序执行的最小单元,它是分配CPU的基本单位。

可以用Thread来执行一些异步的操作。

2).Service:

Service是Android的一种机制,当它运行的时候如果是LocalService,那么对应的Service是运行在主进程的main线程上的。

如:

onCreate,onStart这些函数在被系统调用的时候都是在主进程的main线程上运行的。

如果是RemoteService,那么对应的Service则是运行在独立进程的main线程上。

因此请不要把Service理解成线程,它跟线程半毛钱的关系都没有!

既然这样,那么我们为什么要用Service呢?

其实这跟Android的系统机制有关,我们先拿Thread来说。

Thread的运行是独立于Activity的,也就是说当一个Activity被finish之后,如果你没有主动停止Thread或者Thread里的run方法没有执行完毕的话,Thread也会一直执行。

因此这里会出现一个问题:

当Activity被finish之后,你不再持有该Thread的引用。

另一方面,你没有办法在不同的Activity中对同一Thread进行控制。

举个例子:

如果你的Thread需要不停地隔一段时间就要连接服务器做某种同步的话,该Thread需要在Activity没有start的时候也在运行。

这个时候当你start一个Activity就没有办法在该Activity里面控制之前创建的Thread。

因此你便需要创建并启动一个Service,在Service里面创建、运行并控制该Thread,这样便解决了该问题(因为任何Activity都可以控制同一Service,而系统也只会创建一个对应Service的实例)。

因此你可以把Service想象成一种消息服务,而你可以在任何有Context的地方调用Context.startService、Context.stopService、Context.bindService,Context.unbindService,来控制它,你也可以在Service里注册BroadcastReceiver,在其他地方通过发送broadcast来控制它,当然这些都是Thread做不到的。

3、Service的生命周期

onCreate  onStart  onDestroy  onBind

1).被启动的服务的生命周期:

如果一个Service被某个Activity调用Context.startService方法启动,那么不管是否有Activity使用bindService绑定或unbindService解除绑定到该Service,该Service都在后台运行。

如果一个Service被startService方法多次启动,那么onCreate方法只会调用一次,onStart将会被调用多次(对应调用startService的次数),并且系统只会创建Service的一个实例(因此你应该知道只需要一次stopService调用)。

该Service将会一直在后台运行,而不管对应程序的Activity是否在运行,直到被调用stopService,或自身的stopSelf方法。

当然如果系统资源不足,Android系统也可能结束服务。

2).被绑定的服务的生命周期:

如果一个Service被某个Activity调用Context.bindService方法绑定启动,不管调用bindService调用几次,onCreate方法都只会调用一次,同时onStart方法始终不会被调用。

当连接建立之后,Service将会一直运行,除非调用Context.unbindService断开连接或者之前调用bindService的Context不存在了(如Activity被finish的时候),系统将会自动停止Service,对应onDestroy将被调用。

3).被启动又被绑定的服务的生命周期:

如果一个Service又被启动又被绑定,则该Service将会一直在后台运行。

并且不管如何调用,onCreate始终只会调用一次,对应startService调用多少次,Service的onStart便会调用多少次。

调用unbindService将不会停止Service,而必须调用stopService或Service的stopSelf来停止服务。

4).当服务被停止时清除服务:

当一个Service被终止(1、调用stopService;

2、调用stopSelf;

3、不再有绑定的连接(没有被启动))时,onDestroy方法将会被调用,在这里你应当做一些清除工作,如停止在Service中创建并运行的线程。

特别注意:

1、你应当知道在调用bindService绑定到Service的时候,你就应当保证在某处调用unbindService解除绑定(尽管Activity被finish的时候绑定会自      动解除,并且Service会自动停止);

2、你应当注意使用startService启动服务之后,一定要使用stopService停止服务,不管你是否使用bindService;

3、同时使用startService与bindService要注意到,Service的终止,需要unbindService与stopService同时调用,才能终止Service,不管startService与bindService的调用顺序,如果先调用unbindService此时服务不会自动终止,再调用stopService之后服务才会停止,如果先调用stopService此时服务也不会终止,而再调用unbindService或者之前调用bindService的Context不存在了(如Activity被finish的时候)之后服务才会自动停止;

4、当在旋转手机屏幕的时候,当手机屏幕在“横”“竖”变换时,此时如果你的Activity如果会自动旋转的话,旋转其实是Activity的重新创建,因此旋转之前的使用bindService建立的连接便会断开(Context不存在了),对应服务的生命周期与上述相同。

5、在sdk2.0及其以后的版本中,对应的onStart已经被否决变为了onStartCommand,不过之前的onStart任然有效。

这意味着,如果你开发的应用程序用的sdk为2.0及其以后的版本,那么你应当使用onStartCommand而不是onStart。

4、startService启动服务

想要用startService启动服务,不管Local还是Remote我们需要做的工作都是一样简单。

当然要记得在Androidmanifest.xml中注册service。

根据上面的生命周期,我们便会给出Service中的代码框架:

 

01

packagecom.newcj.test;

02

03

importandroid.app.Service;

04

importandroid.content.Intent;

05

importandroid.os.IBinder;

06

07

publicclassLocalService1extendsService{

08

09

/**

10

*onBind是Service的虚方法,因此我们不得不实现它。

11

*返回null,表示客服端不能建立到此服务的连接。

12

*/

13

@Override

14

publicIBinderonBind(Intentintent){

15

returnnull;

16

}

17

18

19

publicvoidonCreate(){

20

super.onCreate();

21

22

23

24

publicvoidonStart(Intentintent,intstartId){

25

super.onStart(intent,startId);

26

27

28

29

publicvoidonDestroy(){

30

super.onDestroy();

31

32

33

对应生命周期系统回调函数上面已经说明,在对应地方加上适当的代码即可。

下面是启动与停止Service的代码:

1

//启动一个Activity

2

startActivity(newIntent(this,LocalService1.class));

3

...

4

//停止一个Activity

5

stopService(newIntent(this,LocalService1.class));

对应的Intent为标志服务类的Intent。

5、Local与Remote服务绑定

同样记得在Androidmanifest.xml中注册service

1).Local服务绑定:

Local服务的绑定较简单,首先在Service中我们需要实现Service的抽象方法onBind,并返回一个实现IBinder接口的对象。

Service中的代码:

packagecom.newcj.test;

importandroid.app.Service;

importandroid.content.Intent;

importandroid.os.Binder;

importandroid.os.IBinder;

publicclassLocalServiceextendsService{

*在LocalService中我们直接继承Binder而不是IBinder,因为Binder实现了IBinder接口,这样我们可以少做很多工作。

*@authornewcj

publicclassSimpleBinderextendsBinder{

*获取Service实例

*@return

publicLocalServicegetService(){

returnLocalService.this;

publicintadd(inta,intb){

returna+b;

publicSimpleBindersBinder;

publicvoidonCreate(){

//创建SimpleBinder

34

sBinder=newSimpleBinder();

35

36

37

38

publicIBinderonBind(Intentintent){

39

//返回SimpleBinder对象

40

returnsBinder;

41

42

43

上面的代码关键之处,在于onBind(Intent)这个方法返回了一个实现了IBinder接口的对象,这个对象将用于绑定Service的Activity与LocalService通信。

下面是Activity中的代码:

importandroid.app.Activity;

importandroid.content.ComponentName;

importandroid.content.Context;

importandroid.content.ServiceConnection;

importandroid.os.Bundle;

importandroid.util.Log;

importandroid.view.View;

importandroid.view.View.OnClickListener;

publicclassMainextendsActivity{

privatefinalstaticStringTAG="

SERVICE_TEST"

;

privateServiceConnectionsc;

privatebooleanisBind;

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

sc=newServiceConnection(){

publicvoidonServiceDisconnected(ComponentNamename){

publicvoidonServiceConnected(ComponentNamename,IBinderservice){

LocalService.SimpleBindersBinder=(LocalService.SimpleBinder)service;

Log.v(TAG,"

3+5="

+sBinder.add(3,5));

Log.v(TAG,sBinder.getService().toString());

};

findViewById(R.id.btnBind).setOnClickListener(newOnClickListener(){

publicvoidonClick(Viewv){

bindService(newIntent(Main.this,LocalService.class),sc,Context.BIND_AUTO_CREATE);

isBind=true;

44

});

45

findViewById(R.id.btnUnbind).setOnClickListener(newOnClickListener(){

46

47

48

49

if(isBind){

50

unbindService(sc);

51

isBind=false;

52

53

54

55

56

在Activity中,我们通过ServiceConnection接口来取得建立连接与连接意外丢失的回调。

bindService有三个参数,第一个是用于区分Service的Intent与startService中的Intent一致,第二个是实现了ServiceConnection接口的对象,最后一个是flag标志位。

有两个flag,BIND_DEBUG_UNBIND与BIND_AUTO_CREATE,前者用于调试(详细内容可以查看javadoc上面描述的很清楚),后者默认使用。

unbindService解除绑定,参数则为之前创建的ServiceConnection接口对象。

另外,多次调用unbindService来释放相同的连接会抛出异常,因此我创建了一个boolean变量来判断是否unbindService已经被调用过。

运行结果:

2).Remote服务绑定:

Remote的服务绑定由于服务是在另外一个进程,因此需要用到Android的IPC机制。

这将又是一个很长的话题,因此,我打算写另外一篇Android的IPC机制分析,并在其中进行详述,然后在这里更新链接,敬请关注。

1、Service.onBind如果返回null,则调用bindService会启动Service,但不会连接上Service,因此ServiceConnection.onServiceConnected不会被调用,但你任然需要使用unbindService函数断开它,这样Service才会停止。

6、创建前台服务

前台服务的优点上面已经说明,但设置服务为前台服务,我们需要注意在sdk2.0及其以后版本使用的方法是startForeground与stopForeground,之前版本使用的是setForeground,因此如果你应用程序的最低运行环境要求是2.0,那么这里可以直接运用新方法,如果运行环境是2.0以下,那么为了保证向后兼容性,这里必须使用反射技术来调用新方法。

下面是我仿照ApiDemos重新敲的代码,对某些地方进行了修改,因此更具有说明性:

001

002

003

importjava.lang.reflect.InvocationTargetException;

004

importjava.lang.reflect.Method;

005

006

importandroid.app.Notification;

007

importandroid.app.NotificationManager;

008

importandroid.app.PendingIntent;

009

010

011

012

013

014

publicclassForegroundServiceextendsService{

015

016

privatestaticfinalClass[]mStartForegroundSignature=newClass[]{

017

int.class,Notification.class};

018

privatestaticfinalClass[]mStopForegroundSignatur

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1