我想在一个Activity/Service中启动一个新Service,获得它的引用,并操作新的Service。
查资料发现要使用bindService
但是我做了个实验,发现和预期不一样,这是我在调用端写的代码
 private int a = 0;
    private ServiceConnection sc = new ServiceConnection(){
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {            a = ((CommandExecutor.CEBinder)iBinder).getData();
            Log.d("test", ""+a);
        }        @Override
        public void onServiceDisconnected(ComponentName componentName) {
        }
    };    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("test", "onCreate() a="+a);
        //启动命令执行器服务
        Intent service = new Intent(this.getApplicationContext(), CommandExecutor.class);
        this.bindService(service, sc, Context.BIND_AUTO_CREATE);
    }    @Override
    public void onStart(Intent intent, int startId) {
        Log.d("test", "onStart() a="+a);
    }
这是新的Service代码:
public class CommandExecutor extends Service {    private TelephonyManager tel = null;    @Override
    public IBinder onBind(Intent intent) {
        return new CEBinder();
    }
    public class CEBinder extends Binder {
        int getData(){
            return 1;
        }
    }我觉得bindService方法一经调用,在onStart()方法中a的值应该变为1才对。
但实际上我根据输出发现,调用bindService方法后,原来Service中要继续吧onStart()方法执行完,才会触发onServiceConnected()方法。 这样的话,我拿到新Service的引用还有何意义?想要使用引用的话就要等到旧的Service跑完。这个地方不懂,麻烦高手解答一下。

解决方案 »

  1.   

    不是你在调用了bindService就马上会执行 onServiceConnected的... 要过一段时间的啊
      

  2.   


    我在onStart()方法里sleep一段时间后,结果仍然没有改变。如果是过一段时间执行的话,我在哪儿里能真正读取到修改后的值呢?
      

  3.   

    service绑定连接是异步的,不能保证先后顺序!
    我建议你定义一个回调函数吧,在执行onServiceConnected末尾回调一下
      

  4.   

    在 调用 onServiceConnected以后再读啊