在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(); } }