我有一个始终在运行的服务。它也可以启动和绑定。以下是该服务的摘录:
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
的使用以及我是否需要它。
有人可以帮我调整这段代码来实现这种行为吗?谢谢,