如何启动并绑定到Android中的服务?

时间:2014-07-14 19:35:33

标签: android android-service android-lifecycle

我想在Service中开始Android

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 个答案:

答案 0 :(得分:1)

您要做的是首先绑定到服务然后启动它。 Documentation说:

绑定服务是允许应用程序组件通过调用bindService()绑定到它以创建长期连接(并且通常不允许组件启动它)的服务通过调用startService())

通过调用 bindService()创建的服务的lifecycle与通过调用 startService()创建的服务相比具有不同的回调方法(请参阅流程提供的页面上的图表)。因此,对于使用 bindService()调用创建的服务,没有 onStartCommand()方法,这就是它从未被调用的原因。

通常的做法是首先启动一个服务,然后绑定它(在这种情况下必须适当地实现所有钩子方法)。如果你这样做,将会调用 onStartCommand()

修改

如何启动服务?

您确实启动了该服务。在调用 bindService()后,它正在运行(当然,如果使用IBinder返回正确实现onBind())。

...但onStartCommand newer出现在日志中

由于上述原因,情况如此。

答案 1 :(得分:0)

您是否在清单中声明了BluetoothLeService?

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

除非声明我显示,否则服务将是可运行的。


另外:您确定要同时调用bind并启动服务吗?

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

这是可能的,但相当不常见..

答案 2 :(得分:0)

注释Toast并再试一次。这可能是你崩溃的根源。

Toast.makeText(this,&#34; Service Started&#34;,Toast.LENGTH_LONG).show();