如何在Android中启动和绑定服务?

3
我正在尝试启动Android中的一个服务(Service):
Log.d("BLE", "Start Service");
Intent gattServiceIntent = new Intent(this, BluetoothLeService.class);
bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE);
startService(gattServiceIntent);
Log.d("BLE", "Service Started");

BluetoothLeService中,我重写了onStartCommand()函数,这意味着当服务启动时,我会看到log
public class BluetoothLeService extends Service {
   ....  
   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
      // Let it continue running until it is stopped.
      Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
      Log.d("BLE", "onStartCommand");
      return START_STICKY;
}

然而,log如下:
07-14 21:30:23.676: D/BLE(28327): Start Service
07-14 21:30:23.676: D/BLE(28327): Service Started

但是onStartCommand()从未出现在log中。我该如何启动服务?

3个回答

2
您尝试的是先绑定服务,然后再启动它。文档中说: 绑定服务是允许应用程序组件通过调用bindService()来绑定到它以创建长期连接(通常不允许组件通过调用startService()来启动它)的服务。 通过调用bindService()创建的服务的生命周期具有与通过调用startService()创建的服务不同的回调方法(请参见所提供页面上的流程图)。因此,对于使用bindService()调用创建的服务,没有onStartCommand()方法,这就是为什么它从未被调用的原因。
通常的做法是先启动服务,然后再绑定它(在这种情况下,必须适当地实现所有挂钩方法)。如果您按照这种方式操作,则会调用onStartCommand()方法。
编辑: 如何启动服务? 您启动了服务。在调用bindService()之后,它正在运行(当然,如果onBind()正确实现并返回IBinder)。 ...但是onStartCommand从未出现在日志中 这是由上述原因引起的。

0

你在清单文件中声明了BluetoothLeService吗?

<service android:enabled="true" android:name=".BluetoothLeService" />

服务在清单中未声明将无法运行。


另外,你确定要同时调用绑定(bind)和启动(start)服务吗?

bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE);
startService(gattServiceIntent);

这是可能的,但相对不常见。


它在清单中声明,否则会抛出异常。 - Mokus

0

注释掉 Toast,然后再试一次。这可能是你的崩溃源。

Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();


1
那不是问题。 - Mokus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接