android

Service

2020-03-30  本文已影响0人  HOLLE_karry

1.介绍

Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件, 是Android四大组件之一。服务可由其他应用组件启动(如Activity),服务一旦被启动将在后台一直运行,即使启动服务的组件(Activity)已销毁也不受影响。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。Service基本上分为两种形式:

①启动状态
当应用组件(如 Activity)通过调用 startService() 启动服务时,服务即处于“启动”状态。一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响,除非手动调用才能停止服务, 已启动的服务通常是执行单一操作,而且不会将结果返回给调用方。
②绑定状态
当应用组件通过调用 bindService() 绑定到服务时,服务即处于“绑定”状态。绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。 仅当与另一个应用组件绑定时,绑定服务才会运行。 多个组件可以同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。

2.注册Service

在清单文件注册

<manifest ... >
  ...
  <application ... >
      <service android:name=".service.SimpleService" />
      ...
  </application>
</manifest>

3.Service的两种启动方式

startService
•启动服务

startService(new Intent(this, SimpleService.class)); 

•停止服务

stopService(new Intent(this, SimpleService.class)); 

4.创建Service

①创建一个MyService继承自Service
②重写父类的onCreate()、onStartCommand()和onDestroy()方法
必须要实现的方法onBind

public class MyService extends Service {
    private final MyBind bind=new MyBind();
    class MyBind extends Binder{
        public void call(String msg){
            methodInService(msg);
        }
    }
    private void methodInService(String msg) {
        Log.e("tag", msg);
    }
    @Override
    public IBinder onBind(Intent intent) {//绑定服务时才会调用必须要实现的方法  
        return null;
    }
    @Override
    public void onCreate() {//首次创建服务时,系统将调用此方法来执行一次性设置程序,如果服务已在运行,则不会调用此方法,该方法只被调用一次
        super.onCreate();
        Log.e("tag", "onCreate()");
    }
    @Override
    public void onDestroy() {//服务销毁时的回调
        super.onDestroy();
        Log.e("tag", "onDestroy()");
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {//每次通过startService()方法启动Service时都会被回调。
        Log.e("tag", "onStartCommand()");
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public boolean onUnbind(Intent intent) {//解绑服务
        Log.e("tag", "onUnbind()");
        return super.onUnbind(intent);
    }
}

5.startService的生命周期

onCreate()-->onStartCommand()(服务运行)-->onDestory()(服务停止)

小结:
(1)service整体的生命时间是从onCreate()被调用开始,到onDestroy()方法返回为止。
(2)和activity一样,service在onCreate()中进行它的初始化工作,在onDestroy()中释放残留的资源。比如,一个音乐播放service可以在onCreate()中创建播放音乐的线程,在onDestory()中停止这个线程。
(3)onCreate() 和 onDestroy()会被所有的service调用,不论service是通过startService()还是bindService()建立。
(4)service积极活动的生命时间是从onStartCommand() 或onBind()被调用开始,它们各自处理由startService方法传过来的Intent对象。
如果service是被开启的,那么它的活动生命周期和整个进程生命周期一同结束
如果service是被绑定的,它们它的活动生命周期是在onUnbind()方法返 回后结束。
❤注意:尽管一个被开启的service是通过调用 stopSelf() 或 stopService()来停止的,没有一个对应的回调函数与之对应,即没有onStop()回调方法。所以,当调用了停止的方法,除非这个service和客户组件绑定,否则系统将会直接销毁它,onDestory()方法会被调用,并且是这个时候唯一会被调用的回调方法。

6.bindService 生命周期

onCreate()-->onBind()-->onUnbind()-->onDestory()

小结:
(1)由于Android 中的Service使用了onBind 的方法去绑定服务,返回一个Ibinder对象进行操作,而我们要获取具体的Service方法的内容的时候,我们需要Ibinder对象返回具体的Service对象才能操作,所以说具体的Service对象必须首先实现Binder对象,这个样子的话我们才能利用bindService的方法对Service进行绑定,获取Binder对象之后获取具体的Service对象,然后才获取Service中的方法等等。所以我们需要注意的是bindService的方式去绑定服务获取的必定是实现了Binder的对象,所以这是我们必须使用Binder的方式去获取Service的方式而不是直接使用Service的类,这个是Android内部实现所约束的。
(2)如果你的service被开启并且接受绑定,那么当系统调用你的 onUnbind()方法时,如果你想要在下次客户端绑定的时候接受一个onRebind()的调用(而不是调用 onBind()),你可以选择在 onUnbind()中返回true。onRebind()的返回值为void,但是客户端仍然在它的 onServiceConnected()回调方法中得到 IBinder 对象。
(3)startService()和bindService()两种模式是完全独立的。你可以绑定一个已经通过startService()方法启动的服务。例如:一个后台播放音乐服务可以通过startService(intend)对象来播放音乐。可能用户在播放过程中要执行一些操作比如获取歌曲的一些信息,此时activity可以通过调用bindServices()方法与Service建立连接。这种情况下,stopServices()方法实际上不会停止服务,直到最后一次绑定关闭。

7.startService和bindService区别

①启动服务中使用StartService()方法来进行方法的调用,调用者和服务之间没有联系,即使调用者退出了,服务依然在进行, onCreate()- >onStartCommand()->onDestroy(),注意其中没有onStart(),主要是被onStartCommand()方法给取代了,onStart方法不推荐使用了。
②绑定服务中使用bindService()方法来绑定服务,调用者和绑定者绑在一起,调用者一旦退出服务也就终止了onCreate()->onBind()->onUnbind()->onDestroy()。

8.Activity和Service之间的数据传递

Activity 与Service交互
startService()

Service是和Intent绑定的 ,通过Intent的startService启动服务

bindService()

先继承Service。完成里面的onBind,返回一个自己重写的Binder,在本例中是MyBinder。MyBinder里面一个call()方法,可以直接调用Service里面的方法。同时需要在Service里面写好public set/get方法,为后面的Activity访问做好基本set/get操作。

Service与Activity交互
可以使用接口回调的方法和广播的形式从service向activity传送数据

上一篇下一篇

猜你喜欢

热点阅读