调整IntentService实现以等待onServiceConnected()

时间:2017-02-18 14:32:37

标签: android multithreading android-service

我有一个始终在运行的服务。它也可以启动和绑定。以下是该服务的摘录:

class LocalService extends Service {
  LocalBinder mBinder = new LocalBinder();

  class LocalBinder extends Binder {
    LocalService getService() { return LocalService.this; }
  }

  int onStartCommand(Intent intent, int flags, int startId) {
    return Service.START_STICKY;
  }

  IBinder onBind(Intent intent) {
    return mBinder;
  }
}

此服务在MainActivity的应用程序启动时启动:

class MainActivity extends AppCompatActivity {
  void onCreate(Bundle) {
    // ...
    Intent intent = new Intent(this, LocalService.class);
    ComponentName component = startService(intent);
    Assert.assertNotNull(component);
  }
}

我需要将命令传递给我的服务。为了做到这一点,我有一个抽象服务LocalBindingService,我可以继承它,当它启动时,绑定到我的服务,调用它上面的方法,然后退出:

class LocalBindingService extends IntentService implements ServiceConnection {
  abstract void onLocalBinding(Intent intent, LocalService service);

  Intent mIntent;

  void onHandleIntent(Intent intent) {
    mIntent = intent;
    Intent localIntent = new Intent(this, LocalService.class);
    boolean serviceFound = bindService(localIntent, this, Context.BIND_AUTO_CREATE);
    Assert.assertTrue(serviceFound);
  }
  void onDestroy() {
    unbindService(this);
    super.onDestroy();
  }

  void onServiceConnected(ComponentName name, IBinder iBinder) {
    LocalService service = ((LocalService.LocalBinder) iBinder).getService();
    onLocalBinding(mIntent, service);
  }
  void onServiceDisconnected(ComponentName) {
    // nothing
  }
}

因为它继承自IntentService,所以它在一个单独的thred中运行。这样就可以轻松地在LocalService上调用方法:

class NotifyService extends LocalBindingService {
  void onLocalBinding(Intent intent, LocalService service) {
    service.notify();
  }
}

但是,我的问题是LocalBindingService在绑定发生之前退出。从我收集的内容来看,它应该继承自Service而不是IntentService,这意味着我必须手动处理该线程。在查看Android guide中的示例时,我无法理解如何调整代码。我真的不明白这个例子中对Looper的使用以及我是否需要它。

有人可以帮我调整这段代码来实现这种行为吗?谢谢,

0 个答案:

没有答案