我想我更像是设计问题,而不是“如何绑定服务”问题。我要做的是让一个服务在一个处理蓝牙通信的独立进程中运行。此外,我在每个其他活动中都有几个选项卡。来自每个活动的处理和UI事件产生简单的命令,这些命令必须通过蓝牙传递,如“向上”,“向下”,“向左”或“向右”。由于每个选项卡活动中的结果是相同的,我不想将每个与服务连接起来,并使用相同的消息处理程序。所以我创建了自己的Handler对象和一个“连接器”对象。但是,我不确定如何将此连接器对象与我的服务连接,因为它需要上下文。简单地将应用程序上下文传递给我的连接器对象并以那种方式绑定它是否有意义
我愿意接受任何建议或提示
答案 0 :(得分:0)
我建议不要在这种情况下使用绑定。实际上,我建议在大多数用例中禁止绑定。尝试仅使用意图处理您的活动与另一个线程中运行的服务之间的所有通信。
这意味着: 通过.startActivity()方法从活动中向服务发送命令,并在Intent的附加内容中传递实际命令的详细信息。
通过动态注册的BroadcastReceivers接收活动中服务的事件和结果。您在onResume()中注册一个侦听器,并在Activity中的onPause()中注销它。该服务仅通过广播发送内容(sendBroadcast())。
我更喜欢这种架构。它是松散耦合的,你可以跳过讨厌的部分,你会想知道你的每个活动是否在你不使用时从你的服务中正确解除绑定。另外,你跳过了使用IPC的痛苦,我认为这是一个巨大的优势。
答案 1 :(得分:0)
在这里,我的例子......会让你明白LOL
// My MyServiceInterface.aidl
package com.mad.exam;
interface MyServiceInterface{
int getNumber();
}
//MyService
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
Toast.makeText(this, "Service OnBind()", Toast.LENGTH_LONG).show();
return mBinder;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Toast.makeText(this, "Service Created", Toast.LENGTH_SHORT).show();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Toast.makeText(this, "Service Destroyed ", Toast.LENGTH_SHORT).show();
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
Toast.makeText(this, "Service Started ", Toast.LENGTH_SHORT).show();
}
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
return super.onUnbind(intent);
}
private final MyServiceInterface.Stub mBinder = new MyServiceInterface.Stub() {
public int getNumber() {
return new Random().nextInt(100);
}
};
}
//My Activity
public class ServiceDemo extends Activity implements OnClickListener {
MyServiceInterface mService;
ServiceConnection mConnection;
Button retreive;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.service);
retreive = (Button) findViewById(R.id.retreive);
retreive.setOnClickListener(this);
mConnection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
mService = MyServiceInterface.Stub.asInterface(service);
try {
int i;
i = mService.getNumber();
Toast.makeText(ServiceDemo.this, "The service value is: " + String.valueOf(i),
Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}
public void onClick(View v) {
// TODO Auto-generated method stub
Log.i("My Tag", "Clicked");
Button btn = (Button) v;
Intent callService = new Intent(this, MyService.class);
bindService(callService, mConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Intent callService = new Intent(this, MyService.class);
bindService(callService, mConnection, Context.BIND_AUTO_CREATE);
}
}