我想在一个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跑完。这个地方不懂,麻烦高手解答一下。
查资料发现要使用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跑完。这个地方不懂,麻烦高手解答一下。
我在onStart()方法里sleep一段时间后,结果仍然没有改变。如果是过一段时间执行的话,我在哪儿里能真正读取到修改后的值呢?
我建议你定义一个回调函数吧,在执行onServiceConnected末尾回调一下