Android基础笔记----Service

本文详细介绍了Android中的Service,包括Service的生命周期、启动Service与绑定Service的区别。重点讲解了如何通过绑定服务实现与Service的通信,以及不同操作对Service生命周期的影响。
摘要由CSDN通过智能技术生成

Android笔记—-Service

1.官方文档:

A Service is an application component that can perform long-running operations in the background and does not provide a user interface. Another application component can start a service and it will continue to run in the background even if the user switches to another application. Additionally, a component can bind to a service to interact with it and even perform interprocess communication (IPC).
大致说明,一个服务是一个在后台运行,没有与用户界面交互的应用组成.其他应用组件可以启动服务,并且让服务保持运行,即使用户切换到另一个应用.每个服务必须在AndroidManifest.xml中被声明.

  • 新建类EchoService继承Service
  • AndroidManifest.xml的标签添加<service android:name="EchoService"></service>声明.
  • MainAcitivity监听两个按钮 调用startservice启动服务,stopService()停止服务.
    startButton.setOnClickListener(this);
    stopButton.setOnClickListener(this);
    ————————————————–
@Override
         public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_startservice:
            startService(serviceIntent);
            break;

        case R.id.btn_stopservice:
            stopService(serviceIntent);
            break;

        default:
            break;
        }
        }

接着在EchoService类重写Service类下的onCreate()和onDestory()方法,加入Log.i();查看服务状态.
运行之后发现当启动服务之后按Back按钮活动销毁之后,查看后泰应用程序,会发现服务还在运行.这个表明服务的生存周期和Activity是无关的.再次启动Activity并且Click停止活动按钮,服务才会onDestroy


  • 服务的绑定
  • 绑定服务和不绑定服务的区别:
    如果服务绑定了Activity,一旦Activity停止,则服务会跟着停止.

在MainActivity实例化两个按钮bind_buttonunbind_button
四个按钮都绑定监听器:

startButton.setOnClickListener(this);
        stopButton.setOnClickListener(this);
        bindButton.setOnClickListener(this);
        unbindButton.setOnClickListener(this);

         @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_startservice:
            startService(serviceIntent);
            break;

        case R.id.btn_stopservice:
            stopService(serviceIntent);
            break;

        case R.id.btn_bind:
            bindService(serviceIntent, this, Context.BIND_AUTO_CREATE);
            break;

        case R.id.btn_unbind:
            unbindService(this);
            break;

        default:
            break;
        }
    }

在EchoService类建立一个内部类, 并且新建对象echoServiceBinder

public class EchoServiceBinder extends Binder{
    }
 private final EchoServiceBinder echoServiceBinder = new EchoServiceBinder();

重写onBind方法并且返回echoServiceBinder

@Override
    public IBinder onBind(Intent intent) {
        Log.i("Service____", "OnBind");
        return echoServiceBinder;
    }

bindService是异步调用和Service进行绑定, 如果绑定成功, 则会调用ServiceConnection的onServiceConnected
当调用bindService方法后就会回调Activity的onServiceConnected,在这个方法中会向Activity中传递一个IBinder的实例,Acitity需要保存这个实例

在mainactivity重写onServiceConnected 成功绑定服务的时候会调用它

@Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.i("Service____", "onBind--连接服务");
    }

运行程序:
1. 当你点击启动服务,Service会显示onCreate状态.当你点击停止服务,Service会显示Destory.

这里写图片描述

2.如果你不点击启动服务,直接点击绑定服务,Service会自动调用onCreate–>onBind–>onServiceConnected必须留意这个现象. 注意Servicedestory之前只会onCreate一次,就是说如果之前已经点击过启动服务,则在绑定服务之前不会执行onCreate.

这里写图片描述

3.如果你通过bind来启动服务,则服务会跟随你Activity的状态生存,即是说,当你按Back退出活动之后,只要你之前已经Bind,则服务会随之退出,注意,如果只是启动服务没有绑定,则退出应用服务还是会在后台执行

这里写图片描述

4.在没有启动服务startService( )的前提下如果绑定之后按解绑按钮执行unbind则服务会destory,如果* 已经启动服务调用startService( )* 若要destory服务,则必须点击停止服务调用stopservice(),才能destory服务即使你按back退出Activity,服务还是不会destory.这一点结合3的区别就在于有没有启动服务调用startService( )

bind service的不同之处在于当绑定的组件销毁后,对应的service也就被kill了。


如何与服务进行通信

绑定服务的一个作用是为了可以和服务通信.

在EchoService类:
1. 新建一个内部类EchoServiceBinder继承自Binder
2. 定义EchoServiceBinder内部成员方法getService()返回当前服务实例
3. 并且新建一个该类的对象,在onBind()方法返回该对象

public class EchoServiceBinder extends Binder{      
        public EchoService getService(){
            return EchoService.this;
        }
    }
    private final EchoServiceBinder echoServiceBinder = new EchoServiceBinder();
    @Override
    public IBinder onBind(Intent intent) {
        Log.i("Service____", "OnBind");
        return echoServiceBinder;
    }
  • 在MainActivity:
    在onServiceConnected()方法获取EchoService类对象:
    echoService = ((EchoService.EchoSerivceBinder)binder).getService()
@Override
    public void onServiceConnected(ComponentName name, IBinder binder) {
        Log.i("Service____", "onBind--连接服务");       
        echoService = ((EchoService.EchoServiceBinder)binder).getService();
    }

之后就可以通过该echoService实例获取其内部类成员,与之通信了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值