进程间通讯:Binder:bindService之 onServiceConnected回调

1:bindService官方概述

     

很明显 通过Google官方文档描述,我们知道

1:bindService()的返回值只是表明服务是否存在;

2:真正能代表是否成功绑定服务的是触发onServiceConnected()回调

文档还有这么一句话

 所谓异步操作,即我们执行完bindService(),并 不会马上回调onServiceConnected()当然也不会等待它;而是按照程序的顺序继续执行。这时由于服务还未成功获取到,我们调用服务中的方法就会出错。

2:解决bindService异步问题

既然bindService是异步消息,即bindService线程在执行 bind服务后,会立即返回,如果bindService线程在主线程的话,要及时处理绑定服务后消息,那么我们可以通过开启子线程方式去获取服务是否已经绑定成功

 new Thread(new Runnable() {
            @Override
            public void run() {
                while(true){
                    Utils.delay(20);
                    //等待取得mService
                    if(null != mService){
                        //  绑定服务成功了
                    }
                    //...
 
                }
            }
 
        }).start();

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AIDL (Android Interface Definition Language) 是一种跨进程通信机制,它可以让不同进程的组件进行通信。其中,callback 机制是 AIDL 的重要特性之一,它允许客户端向服务端注册,服务端可以在需要的时候用客户端提供的方法。 下面是一个简单的 AIDL 机制的代码示例: 定义 AIDL 接口: ``` // IMyService.aidl interface IMyService { void registerCallback(IMyCallback cb); void unregisterCallback(IMyCallback cb); } interface IMyCallback { void onResult(int result); } ``` 服务端实现 AIDL 接口: ``` // MyService.java public class MyService extends Service { private List<IMyCallback> callbacks = new ArrayList<>(); private final IMyService.Stub binder = new IMyService.Stub() { @Override public void registerCallback(IMyCallback cb) throws RemoteException { callbacks.add(cb); } @Override public void unregisterCallback(IMyCallback cb) throws RemoteException { callbacks.remove(cb); } }; // 在需要的时候用客户端提供的方法 private void notifyCallbacks(int result) { for (IMyCallback cb : callbacks) { cb.onResult(result); } } @Nullable @Override public IBinder onBind(Intent intent) { return binder; } } ``` 客户端用 AIDL 接口并注册: ``` // MyActivity.java public class MyActivity extends Activity { private IMyService myService; private IMyCallback myCallback = new IMyCallback.Stub() { @Override public void onResult(int result) throws RemoteException { // 处理服务端传来的结果 } }; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { myService = IMyService.Stub.asInterface(service); try { myService.registerCallback(myCallback); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { myService = null; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); // 绑定服务 Intent intent = new Intent(this, MyService.class); bindService(intent, connection, Context.BIND_AUTO_CREATE); } @Override protected void onDestroy() { super.onDestroy(); // 解除注册 if (myService != null) { try { myService.unregisterCallback(myCallback); } catch (RemoteException e) { e.printStackTrace(); } } // 解绑服务 unbindService(connection); } } ``` 在客户端的代码中,我们首先绑定服务,并在连接成功后注册。当服务端需要通知客户端时,它会遍历列表并用客户端提供的方法。在客户端的方法中,我们可以处理服务端传来的结果。最后,在客户端销毁时,我们需要解除注册并解绑服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值