Android四大组件之Service---本地服务、远程服务和IntentService

本地服务(LocalService)

调用者和service在同一个进程中,service运行在主进程的main线程中。所以不能进行耗时操作,耗时操作可以采用在service里面创建一个Thread来执行任务。
任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例

两种启动方式

第一种启动方式startService(intent):

通过start方式开启服务service的步骤:

1,定义一个类继承service
2,manifest.xml文件中声明自己定义的service
3,使用context的startService(Intent)方法启动service
4,不在使用时,调用stopService(Intent)方法停止服务

使用start方式启动service的生命周期:

onCreate() --> onStartCommand() --> onStart() --> onDestory()
注意:如果服务已经开启,如果再次调用context.startService()方法,不会重复回调onCreate()方法,service而是会调用onStartCommand()和onStart()方法。

停止服务需要调用context.stopService()方法,服务停止的时候回调onDestory,然后被销毁。

startService特点
一旦服务开启就跟调用者(开启者)没有任何关系了。就算开启者退出或者挂了,服务依然在后台长期的运行,开启者也不能调用服务里面的方法。

第二种启动方式bindService(Intent,ServiceConnection,int)

通过bind的方式开启服务
使用service的步骤:

1,定义一个类继承Service
2,在manifest.xml文件中声明自己定义的service
3,使用context的bindService(Intent,ServiceConnection,int)方法启动service
4,不再使用时,调用unbindService(ServiceConnection)方法停止该服务

使用这种bind方式启动的service的生命周期如下:

onCreate() -- > onBind() --> (ServiceConnection的onServiceConnected)-->onUnbind() -- > onDestory()

注意1:绑定服务不会调用onStart()或者onStartCommand()方法

注意2:绑定服务由哪个context绑定后,就只能由这个context进行解绑,否则会报java.lang.IllegalArgumentException: Service not registered异常。同理,没被绑定的service,调用解绑同样回报这个异常。

注意3:Service中需要创建一个实现IBinder的内部类(这个内部类不一定在Service中实现,但必须在Service中创建它)。
然后在OnBind()的方法中需返回一个IBinder实例,不然onServiceConnected方法不会调用。

注意4:ServiceConnection 的回调方法onServiceDisconnected() 在连接正常关闭的情况下是不会被调用的, 该方法只在Service 被破坏了或者被杀死的时候调用. 例如, 系统资源不足, 要关闭一些Services, 刚好连接绑定的 Service 是被关闭者之一,  这个时候onServiceDisconnected() 就会被调用。

bindService特点:bind的方式开启服务,绑定服务后如果调用者挂了,服务也会跟着挂掉。绑定者可以调用服务里面的方法。

 

远程服务

调用者和service不在同一个进程中,service在单独的进程中的main线程,是一种垮进程通信方式。

绑定远程服务的步骤:

  • 在服务的内部创建一个内部类,提供一个方法,可以间接调用服务的方法
  • 把暴露的接口文件的扩展名改为.aidl文件 去掉访问修饰符
  • 实现服务的onbind方法,继承Bander和实现aidl定义的接口,提供给外界可调用的方法
  • 在activity 中绑定服务。bindService()
  • 在服务成功绑定的时候会回调 onServiceConnected方法 传递一个 IBinder对象
  • aidl定义的接口.Stub.asInterface(binder) 调用接口里面的方法

 

IntentService

IntentService是Service的子类,比普通的Service增加了额外的功能。先看Service本身存在两个问题

  • Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中;
  • Service也不是专门一条新线程,因此不应该在Service中直接处理耗时的任务;

IntentService特征:

  • 会创建独立的worker线程来处理所有的Intent请求;
  • 会创建独立的worker线程来处理onHandleIntent()方法实现的代码,无需处理多线程问题;
  • 所有请求处理完成后,IntentService会自动停止,无需调用stopSelf()方法停止Service;
  • 为Service的onBind()提供默认实现,返回null;
  • 为Service的onStartCommand提供默认实现,将请求Intent添加到队列中;

 

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页