Подтвердить что ты не робот

Android Bind Service возвращает false каждый раз

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

Служба привязки всегда возвращает 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();
}

}

Код Service Controller выглядит следующим образом:

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

}

4b9b3361

Ответ 1

Я думаю, что проблема может заключаться в привязке службы. Я использую следующий код для привязки службы. Он верно возвращает true.

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

mService - это служебный объект, mConnection - объект serviceConnection Режим

В вашем коде может быть небольшое изменение.

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

Это может сработать. Имейте большой день...

Ответ 2

У меня была та же проблема. По прошествии времени обучения я узнал, что наше приложение не знает, какая служба должна быть связана. Это связано с тем, что либо мы не объявили службу в файле манифеста, либо объявили ее не так.

В моем случае я объявляю это как:

<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 не может найти службу, объявленную в файле манифеста.

Ответ 3

У меня была аналогичная ошибка. Это оказалось связано с различием между этими двумя блоками кода:

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

и

private final IBinder mBinder = new MyBinder();

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

Первый блок не работает, второй блок делает.

Я надеюсь, что это поможет спасти кого-то еще в те часы, которые потребовались мне, чтобы отслеживать это.

Ответ 4

Я решил проблему создания нового проекта и копирования кода в нем. Вероятно, проблема связана с именем пакета.

Странно на Android Studio У меня была следующая ситуация (проект не работает):

  • имя пакета: com.company.proj.server
  • имя приложения: speedtest
  • имя сервера: syncserver

Это странно заблокировало сервер, который будет отображаться вне приложения

В новом проекте у меня было (работает):

  • имя пакета: com.company.proj.server.speedtest
  • имя приложения: speedtest
  • имя сервера: syncserver

Обратите внимание, как имя приложения является последним элементом пакета.

Первая ситуация позволила правильному исполнению приложения для отправки сообщений службе, но не для доступа к сервису из другого приложения (флаг android: exported = "true" был правильно установлен в обоих случаях)

Ответ 5

Я думаю, что флаг связанной службы неверно. вы должны установить флаг в своем сервисном соединении.

 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

У меня была такая же ошибка, и причина в том, что я забыл запустить сервис.