Android Bind Service每次都返回false

时间:2011-03-15 05:36:11

标签: java android

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

Bind service总是为我返回false ...有人能告诉我我可能犯的错误......

服务代码如下

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();
}

}

7 个答案:

答案 0 :(得分:34)

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

就我而言,我将其声明为:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="vn.abc"
.................

<service android:name=".SocketService" >
    </service>

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

答案 1 :(得分:3)

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

<manifest ... >
   ...
   <application ... >
      <service android:name=".MyService" />
      ...
   </application>
</manifest>

答案 2 :(得分:1)

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

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

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

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

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

它可能有用.. 祝你有美好的一天......

答案 3 :(得分:1)

我有类似的错误。事实证明这是由于这两个代码块之间的区别:

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

private final IBinder mBinder = new MyBinder();

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

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

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

答案 4 :(得分:0)

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

奇怪的是,在Android Studio上我遇到以下情况(项目无效):

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

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

在我工作的新项目中:

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

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

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

答案 5 :(得分:0)

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

 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

答案 6 :(得分:-2)

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