如何等到服务绑定?
How to wait until service is bound?
我正在为我的应用程序编写蓝牙服务。我对 android 中的服务了解不多,但我设法启动了一个服务并按照我想要的方式使用它。
当我尝试在 Activity 的 onCreate()
方法上使用服务中的函数时,我的问题就在一开始就出现了(它没有足够的时间来绑定服务)。
我将代码结构化为 3 classes:
蓝牙服务:
Class 实现服务
public class BluetoothService extends Service implements IScanService {
private final IBinder bluetoothBinder = new BluetoothBinder();
@Override
public IBinder onBind(Intent intent) {
return bluetoothBinder;
}
public class BluetoothBinder extends Binder {
public BluetoothService getService() {
return BluetoothService.this;
}
}
// Other functions
}
蓝牙Activity:
处理蓝牙服务连接的摘要class(为了可重用性)。
public abstract class BluetoothActivity extends AppCompatActivity {
protected BluetoothService bluetoothService;
protected volatile Boolean isBound = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Connecting to the service
Intent intent = new Intent(this, BluetoothService.class);
bindService(intent, connection, Context.BIND_AUTO_CREATE);
}
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
BluetoothService.BluetoothBinder binder = (BluetoothService.BluetoothBinder) service;
bluetoothService = binder.getService();
isBound = true;
}
@Override
public void onServiceDisconnected(ComponentName className) {
isBound = false;
}
};
// Other functions
}
扫描Activity:
Activity class 从 BluetoothActivity 扩展并在 'onCreate()'.
上使用 BluetoothService 方法
变量 'isBound' 旨在用于了解服务是否已绑定(或者我们是否必须等待)。
我尝试了什么:
- 使用 'wait()' 和 'notify()' 但对我不起作用。
- 使用 'while(!isBound)' 等待,但应用程序刚刚崩溃。
- 使用处理程序等待 x 毫秒。这行得通,但我知道不是这样,因为服务可能未绑定。
所以我的问题是如何等待 'onCreate()' 方法直到 'isBound' 变为真?
我刚刚意识到我可以在 BluetoothService
上创建两个函数并在 onServiceConnected()
和 onServiceDisconnected()
上调用它们:
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
BluetoothActivity.this.onServiceConnected(name, (BluetoothService.BluetoothBinder) binder);
}
@Override
public void onServiceDisconnected(ComponentName name) {
BluetoothActivity.this.onServiceDisconnected(name);
}
};
protected void onServiceConnected(ComponentName name, BluetoothService.BluetoothBinder binder){
bluetoothService = binder.getService();
}
protected void onServiceDisconnected(ComponentName name){
bluetoothService = null;
}
然后在扩展 class:
上覆盖它们
@Override
protected void onServiceConnected(ComponentName name, BluetoothService.BluetoothBinder binder) {
super.onServiceConnected(name, binder);
//TODO
}
@Override
protected void onServiceDisconnected(ComponentName name) {
// TODO
super.onServiceDisconnected(name);
}
我正在为我的应用程序编写蓝牙服务。我对 android 中的服务了解不多,但我设法启动了一个服务并按照我想要的方式使用它。
当我尝试在 Activity 的 onCreate()
方法上使用服务中的函数时,我的问题就在一开始就出现了(它没有足够的时间来绑定服务)。
我将代码结构化为 3 classes:
蓝牙服务: Class 实现服务
public class BluetoothService extends Service implements IScanService { private final IBinder bluetoothBinder = new BluetoothBinder(); @Override public IBinder onBind(Intent intent) { return bluetoothBinder; } public class BluetoothBinder extends Binder { public BluetoothService getService() { return BluetoothService.this; } } // Other functions }
蓝牙Activity: 处理蓝牙服务连接的摘要class(为了可重用性)。
public abstract class BluetoothActivity extends AppCompatActivity { protected BluetoothService bluetoothService; protected volatile Boolean isBound = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Connecting to the service Intent intent = new Intent(this, BluetoothService.class); bindService(intent, connection, Context.BIND_AUTO_CREATE); } private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { BluetoothService.BluetoothBinder binder = (BluetoothService.BluetoothBinder) service; bluetoothService = binder.getService(); isBound = true; } @Override public void onServiceDisconnected(ComponentName className) { isBound = false; } }; // Other functions }
扫描Activity: Activity class 从 BluetoothActivity 扩展并在 'onCreate()'.
上使用 BluetoothService 方法
变量 'isBound' 旨在用于了解服务是否已绑定(或者我们是否必须等待)。
我尝试了什么:
- 使用 'wait()' 和 'notify()' 但对我不起作用。
- 使用 'while(!isBound)' 等待,但应用程序刚刚崩溃。
- 使用处理程序等待 x 毫秒。这行得通,但我知道不是这样,因为服务可能未绑定。
所以我的问题是如何等待 'onCreate()' 方法直到 'isBound' 变为真?
我刚刚意识到我可以在 BluetoothService
上创建两个函数并在 onServiceConnected()
和 onServiceDisconnected()
上调用它们:
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
BluetoothActivity.this.onServiceConnected(name, (BluetoothService.BluetoothBinder) binder);
}
@Override
public void onServiceDisconnected(ComponentName name) {
BluetoothActivity.this.onServiceDisconnected(name);
}
};
protected void onServiceConnected(ComponentName name, BluetoothService.BluetoothBinder binder){
bluetoothService = binder.getService();
}
protected void onServiceDisconnected(ComponentName name){
bluetoothService = null;
}
然后在扩展 class:
上覆盖它们@Override
protected void onServiceConnected(ComponentName name, BluetoothService.BluetoothBinder binder) {
super.onServiceConnected(name, binder);
//TODO
}
@Override
protected void onServiceDisconnected(ComponentName name) {
// TODO
super.onServiceDisconnected(name);
}