Android Bind Service每次都返回false

boolean isBound = bindService(new Intent(SocketServiceController.this, SocketService.class), mConnection, Context.BIND_AUTO_CREATE); 

绑定服务总是为我返回假…有人能告诉我可能出现的错误……

服务代码如下

 public class SocketService extends Service{ @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return myBinder; } private final IBinder myBinder = new LocalBinder(); public class LocalBinder extends Binder { public SocketService getService() { return SocketService.this; } } @Override public void onCreate() { super.onCreate(); } public void IsBoundable(){ Toast.makeText(this,"Is bound", Toast.LENGTH_LONG).show(); } public void onStart(Intent intent, int startId){ super.onStart(intent, startId); Toast.makeText(this,"Service created ...", Toast.LENGTH_LONG).show(); } @Override public void onDestroy() { super.onDestroy(); } 

}

服务控制器代码如下:

  public class SocketServiceController extends Activity{ private SocketService mBoundService; private Boolean mIsBound; public SocketServiceController ssc; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ssc = this; setContentView(R.layout.telnet); Button startButton = (Button)findViewById(R.id.button1); Button endButton = (Button)findViewById(R.id.button2); Button bindButton = (Button)findViewById(R.id.button3); startButton.setOnClickListener(startListener); endButton.setOnClickListener(stopListener); //bindButton.setOnClickListener(this); TextView textView = (TextView)findViewById(R.id.textView1); } private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { mBoundService = ((SocketService.LocalBinder)service).getService(); } @Override public void onServiceDisconnected(ComponentName className) { mBoundService = null; } }; private void doBindService() { boolean isBound = bindService(new Intent(SocketServiceController.this, SocketService.class), mConnection, Context.BIND_AUTO_CREATE); mIsBound = true; //mBoundService.IsBoundable(); } private void doUnbindService() { if (mIsBound) { // Detach our existing connection. unbindService(mConnection); mIsBound = false; } } private OnClickListener startListener = new OnClickListener() { public void onClick(View v){ startService(new Intent(SocketServiceController.this,SocketService.class)); doBindService(); } }; private OnClickListener stopListener = new OnClickListener() { public void onClick(View v){ stopService(new Intent(SocketServiceController.this,SocketService.class)); } }; @Override protected void onDestroy() { super.onDestroy(); doUnbindService(); } 

}

我认为问题可能在绑定服务时。我使用以下代码绑定服务。它正确返回true。

 boolean flag=bindService(mService, mConnection, MODE_PRIVATE); 

mService是服务对象,mConnection-是serviceConnection对象模式

您的代码可能会有一些小变化

 boolean isBound = bindService(mBoundService, mConnection, Context.BIND_AUTO_CREATE); 

它可能会工作..祝你有美好的一天……

我有同样的问题。 经过一段时间的学习,我发现我们的应用程序不知道要绑定哪个服务。 这是因为要么我们没有在清单文件中声明服务,要么我们以错误的方式声明它。

就我而言,我声明为:

   

通过这种方式,Android将了解该服务将包作为vn.abc.SocketService ,但实际上,在我的代码结构中,我的服务包含com.tung.SocketService包(这里的包只是示例)。 这就是Android无法find我在清单文件中声明的服务的原因。

bindService()返回false的一个非常常见的情况是服务未在Manifest中声明。 在这种情况下,您应该在清单文件中声明您的服务。

  ...   ...   

我有类似的错误。 原来这是由于这两个代码块之间的差异:

 @Override public IBinder onBind(Intent arg0) { return new MyBinder(); } 

和:

 private final IBinder mBinder = new MyBinder(); @Override public IBinder onBind(Intent arg0) { return mBinder; } 

第一个块不起作用,第二个块起作用。

我希望这有助于拯救别人花费我跟踪它的时间。

我解决了执行新项目并将代码复制到其中的问题。 可能问题与包名有关。

奇怪的是在Android Studio上我遇到以下情况(项目不能正常工作):

  • 包的名称:com.company.proj.server
  • 应用程序名称:speedtest
  • 服务器名称:syncserver

这奇怪地阻止了服务器在应用程序外部看到

在我工作的新项目中:

  • 包的名称:com.company.proj.server.speedtest
  • 应用程序名称:speedtest
  • 服务器名称:syncserver

注意应用程序的名称是包的最后一个元素。

第一种情况允许应用程序正确执行,向服务发送消息但不从其他应用程序访问服务(在两种情况下都正确设置了标志android:exported =“true”)

我认为绑定服务标志设置错误。 您应该在服务连接中设置标志。

  private ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { mServiceBound = false; } @Override public void onServiceConnected(ComponentName name, IBinder service) { BoundService.MyBinder myBinder = (BoundService.MyBinder) service; mBoundService = myBinder.getService(); mServiceBound = true; } 

};

我在github上做了一个简单的例子。 https://github.com/wingsum93/Bind_Service_Example

我有同样的错误,原因是我忘了启动服务。