Service详解

简介:

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()

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值