安卓Service中bindService和IBinder实现通信

1.创建一个MyBinder继承自Binder,实现相应回调功能。

public class MyBinder extends Binder {
    private static final String TAG = "MyBinder";

    private MyService mService;

    private OnTestListener mListener;

    public MyBinder(MyService service) {
        this.mService = service;
    }

    public void setMethod(String str) {
        // Activity通过Binder来调用Service的方法将消息传给Service
        mService.setMethod(str);
    }

    public void setMethodBack() {
        // 回调向Activity发送消息
        mListener.onTest("测试成功");
    }

    // MyBinder 里面提供一个注册回调的方法
    public void setOnTestListener(OnTestListener listener) {
        this.mListener = listener;
    }

    //自定义一个回调接口
    public interface OnTestListener {
        void onTest(String str);
    }

}

2.新建一个继承自Service的类MyService,然后在AndroidManifest.xml里注册这个Service,在MyService里实例化一个MyBinder对象mBinder,并在onBind回调方法里面返回这个mBinder对象。

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

    private final MyBinder mBinder = new MyBinder(this);

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 处理Service的逻辑
        return super.onStartCommand(intent, flags, startId);
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        // 如果Service需要被绑定,则返回一个IBinder实例
        return mBinder;
    }


    public void setMethod(String str) {
        Log.e(TAG, str);
        mBinder.setMethodBack();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

3.在Activity里面使用bindService方式启动MyService,也就是绑定了MyService,并在在ServiceConnection里得到一个IBinder对象,就是第MyService 中onBinder返回的mBinder对象。

        serviceIntent = new Intent(this, MyService.class);
        connection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                // 当Service连接成功时调用
                myBinder = (MyBinder) service;
                myBinder.setOnTestListener(new MyBinder.OnTestListener() {
                    @Override
                    public void onTest(String str) {
                        Log.e(TAG, str);
                    }
                });
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                // 当Service连接断开时调用
            }
        };
        bindService(serviceIntent, connection, Context.BIND_AUTO_CREATE);

4.在合适得时机调用mBinder的传递数据的方法setMethod,例如点击事件等。

myBinder.setMethod("123");

5.当在点击事件发送一条消息后,mBinder会获取这条消息,并发送给MyService,在MyService 执行完成后,又会反馈给mBinder,并通过接口回调的方法,将成功信息反馈给Activity,打印日志如下。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值