欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Service详解

程序员文章站 2022-05-09 20:53:56
...

简介:

Service为Android的四大组件之一。他与Activity有些类似,都是可以在他们的内部进行一些代码程序的执行操作。但是区别在于,Activity是具有界面,可以有UI界面与用户进行交互,但是Service却是运行在后台的操作,他不具备UI界面,总是静静的在后台运行着。所以,如果某个程序需要呈现某个界面就用Activity,如果不需要进行界面的交互,则用Service。

 

配置与使用

 

配置和使用Service其实和Activity是一样的。

1.写一个类(例如DemoService),然后继承Service,覆写里面的关于生命周期的方法,其中onBind()方法是必须覆写的。

2.在清单文件中声明这个Service类。
 

3.启动Service的时候可以使用startService或者bindService。

继承Service

public class DemoService extends Service {
    private String TAG = "DemoService";
    @Override
    public void onCreate() {
        super.onCreate();
        Log.e(TAG,"onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG,"onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.e(TAG,"onBind");
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e(TAG,"onDestroy");
    }

}

清单文件中配置

<service android:name=".DemoService"></service>

启动Service

Intent intent = new Intent(this,DemoService.class);

startService(intent);

 

关于Service的启动与停止

在Android5.0之前我们可以通过隐式意图启动,但是在5.0之后,Google要求必须使用显式意图来启动Service。

启动service的方式有两种,startService与bindService。

startService():访问者和service没有进行绑定,如果访问者退出之后,service仍然可以在后台进行运行。例如制作一个音乐播放器,用这种模式启动service,即便Activity退出之后,service仍然可以在后台播放音乐。

 

bindService():访问者和service进行了绑定,如果访问者退出之后,service也将退出。

如果使用startService()来启动,由于未和访问者进行绑定,所以可以使用stopService()或者stopSelf()来停止在后台运行的service。

如果使用bindService()来启动,由于与访问者进行了绑定,所以只需要将访问者停止掉就可以停止service。

 

Service生命周期

 

Service的生命周期即是他覆写的方法。

onCreate():创建Service对象的时候使用,有且只调用一次。我们一般在此方法中进行一些初始化组件的操作。

onStartCommand():每次在使用startService()的时候都会调用此方法,一般在此方法中我们可以进行一些具体的方法操作。

onBind():这是Service必须实现的方法,该方法返回一个IBinder对象,我们可以通过这个对象与Service组件进行通信。

onDestroy():Service被关闭之前会调用这个方法。

onUnBind():当Service绑定的所以客户端都断开连接的时候会会回调这个方法。

 

和Activity一样,一般都是在onCreate()中进行一些资源的初始化操作,在onDestroy()中进行一些资源的释放操作。

这里我们举个例子,通过startService()方法来启动Service来查看他的声明周期。

假设有两个按钮,点击之后会执行startService()方法和stopService()方法

Intent intent = new Intent(this,DemoService.class);

    public void onBtn(View view) {
        
        startService(intent);
    }
    
    public void onBtn1(View view){
        stopService(intent);
    }

 

Service代码如下:

public class DemoService extends Service {
    private String TAG = "DemoService";
    @Override
    public void onCreate() {
        super.onCreate();
        Log.e(TAG,"onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG,"onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.e(TAG,"onBind");
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e(TAG,"onDestroy");
    }

}

假设我们先点击按钮一,执行startService()方法,再点击按钮二执行stopService()方法,此时执行的log如下:

onCreat
onStartCommand
onDestroy

如果我们在不关闭Service的情况下,拼命点击三次按钮一,执行startService()方法,log如下:

onCreat
onStartCommand
onStartCommand
onStartCommand

可见在onCreate会创建一个Service对象,如果这个对象不消失,则不会再调用onCreate方法,而只要调用startService()方法,就一定会执行onStartCommand()方法。

所以,当我们使用startService() 启动Service的时候,我们走的生命周期为

onCreate() ——> onStartCommand()——>Service被自己或者调用者停止 ——> onDestroy()

而当我们在使用bindService()启动Service的时候,我们走的生命周期为

onCreate()  ——>  onBind() ——>调用unBindService()取消绑定 ——>unBind() ——> onDestroy()

 

Service详解