活动绑定服务并在活动里调用服务的方法。

        如果直接在活动里new了一个服务的对象,是不能调用服务的方法的,因为这个时候服务还没有启动,这个时候需要在activity里调用bindService方法,使activity与服务绑定,绑定服务后,会自动调用服务里的OnBind()方法,返回一个Binder对象给activity使用,通过该对象来调用service里的方法。

   OnBind()
  当组件调用bindService()想要绑定到service时(比如想要执行进程间通讯)系统调用此方法.在你的实现中,你必须提供一个返回一个IBinder来以使客户端能够使用它与service通讯,你必须总是实现这个方法,但是如果你不允许绑定,那么你应返回null. 


    之前一直不理解bindService()方法的原理,下面来写一下自己的理解:

    1、在service里,新建一个内部类MyBinder extends Binder,在这个类里实现与service的通信方法。同时service里有个onBind() 方法,该方法只有在activity调用bindService()时才会执行,返回一个binder对象,即在service里创建的那个内部类MyBinder的对象。

    2、在activity中调用bindService对象时,新建的那个匿名内部类,new ServiceConnect(){

} 这里的onServiceConnect(ComponentName name, IBinder service)这里参数里的service即我们在service的onBinder()方法里返回的那个对象。

        借着这个service对象,就可以操做Service服务里的方法了。


MainActiivty.java

package com.yuanlp.servicedemo;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity {


    private ServiceConnection conn=new ServiceConnection() {

        private MyService services=null;

        @Override
        //服务与活动绑定时触发
        public void onServiceConnected(ComponentName name, IBinder service) {

            MyService.MyBundler bundler= (MyService.MyBundler) service;  //返回的是service里的那个bundler的实例
            services = bundler.getService();
            services.execute();

        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            //服务与活动链接断开时调用
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void startService(View view){
        Intent service = new Intent(this, MyService.class);
        //startService(service);

        bindService(service,conn, Context.BIND_AUTO_CREATE);
    }

    public void stopServicess(View view){
//        Intent stopServices = new Intent(this, MyService.class);
//        stopService(stopServices);
        unbindService(conn);
    }

    public void onDestroy(){

        unbindService(conn);  //当活动销毁时,取消绑定
        super.onDestroy();
    }
}

Myservice.java

package com.yuanlp.servicedemo;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
    private static final String TAG = "MyService";

    public class MyBundler extends Binder {
        MyService getService(){
            return MyService.this;  //返回当前的service对象
        }
    }

   private MyBundler bundler=new MyBundler();

    public MyService() {
        Log.d(TAG, "MyService: 构造方法");
    }

    @Override
    public IBinder onBind(Intent intent) {
       return bundler;
    }

    public void onCreate(){  //再服务创建时启用
        super.onCreate();
    }

    /**
     * 在服务启动的时候调用
     * @param intent
     * @param flags
     * @param startId
     * @return
     */
    public int onStartCommand(Intent intent,int flags,int startId){
        Log.d(TAG, "onStartCommand: ");
        return super.onStartCommand(intent,flags,startId);
    }

    /**
     * 在服务销毁时调用
     */
    public void onDestroy(){
        Log.d(TAG, "onDestroy: ");
        super.onDestroy();
    }


    
    public void execute(){
        Log.d(TAG, "execute: 被执行了");
    }
}