Android-bindService本地服务-初步

在Android开发过程中,Android API 已经有了startService方式,为什么还需要bindService呢?

答:是因为bindService可以实现Activity-->Service里面的方法并返回数据给Activity,可以理解 在自身APP过程中Service与Activity进行通讯(本地服务)

  bindService还可以实现另外强大的功能,需要结合AIDL,实现跨进程Service与Activity进行通讯(远程服务)

定义接口扩展,增强版Binder:

package liudeli.service1.service.inter;

public interface IStudent {

    /**
     * 定义通过ID查询姓名
     * @param id 传入ID
     * @return 返回姓名
     */
    public String queryNameByID(int id);

}

Service具体代码处理:

package liudeli.service1.service;

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

import liudeli.service1.service.inter.IStudent;

public class MyService2 extends Service {

    private static final String TAG = MyService2.class.getSimpleName();

    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "我被绑定了");
        return new MyBinder();
    }

    class MyBinder extends Binder implements IStudent {

        /**
         * 定义通过ID查询姓名
         *
         * @param id 传入ID
         * @return 返回姓名
         */
        @Override
        public String queryNameByID(int id) {
            String result;
            switch (id) {
                case 1:
                    result = "张三";
                    break;
                case 2:
                    result = "李四";
                    break;
                case 3:
                    result = "王五";
                    break;
                default:
                    result = "赵二";
                    break;
            }
            return result;
        }
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.d(TAG, "我被解绑了");
        return super.onUnbind(intent);
    }
}

MainActivity2调用测试:

  // ---------------------------------- 绑定服务

    public void bindService(View view) {
        bindService(new Intent(MainActivity2.this, MyService2.class), connection, Context.BIND_AUTO_CREATE);
    }

    public void unBindService(View view) {
        unbindService(connection);
    }

    private IStudent iStudent;

    /**
     * 服务连接接口
     */
    private ServiceConnection connection = new ServiceConnection() {

        /**
         * 已经连接到服务
         * @param name 服务到详细地址等
         * @param service 服务返回过来到结果
         */
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d("MyService2", "已经连接到服务 name:" + name);

            // 返回到接口,需要强制转成具体定义到接口
            iStudent = (IStudent) service;
        }

        /**
         * 断开与服务到连接
         * @param name 服务到详细地址等
         */
        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d("MyService2", "断开与服务到连接 name:" + name);
            iStudent = null;
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != connection) {
            unbindService(connection);
        }
    }

    public void test(View view) {
        if (null != iStudent) {
            String result = iStudent.queryNameByID(2);
            Toast.makeText(this, result, Toast.LENGTH_LONG).show();
        }
    }
原文地址:https://www.cnblogs.com/android-deli/p/10081676.html