2011-03-15 8 views
12
boolean isBound = bindService(new Intent(SocketServiceController.this, SocketService.class), mConnection, Context.BIND_AUTO_CREATE); 

servicio de enlace siempre devuelve falsa para mí ... ¿Podría alguien decirme los posibles errores que pude haber hecho ...Android servicio de enlace devuelve falso cada vez que

código de servicio es el siguiente

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

}

código

controlador de servicio es el siguiente:

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

}

Respuesta

1

Creo que el problema podría ser al vincular el servicio. Estoy utilizando el siguiente código para vincular el servicio. Está devolviendo la verdad correctamente.

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

MSERVICE -es el objeto de servicio, mConnection- es serviceConnection objeto modo

Puede haber un pequeño cambio en su código

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

podría funcionar .. Tener un gran día ...

+0

Oye ... todavía me estoy poniendo falso .... lo estoy haciendo en el simulador ... ¿y debería agregar algo extra en el archivo de manifiesto que no sea ...? –

+0

han estado tomando bastante tiempo para resolver este problema ... ¿hay algo más erróneo en este código? –

+5

Entendido: getApplicationContext(). BindService tuvo que usar esto ya que tabspec no se puede vincular a la actividad ... estaba llamando dentro de una pestaña ... –

-2

Tuve el mismo error y el motivo fue que olvidé iniciar el servicio hielo.

+2

Se supone que el enlace inicia el servicio automáticamente. – Sam

30

Tuve el mismo problema. Después de un tiempo de estudiar, descubrí que nuestra aplicación no sabe a qué servicio pertenecer. Esto se debe a que o bien no declaramos el servicio en el archivo de manifiesto o lo declaramos de forma incorrecta.

En mi caso, declarará como:

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

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

De esta manera, Android va a entender que el servicio tiene el paquete como vn.abc.SocketService, pero de hecho, en mi estructura de código, mi servicio tiene el paquete com.tung.SocketService (los paquetes aquí son solo ejemplos). Esa es la razón por la cual Android no puede encontrar el servicio que declare en el archivo de manifiesto.

+2

¡Gracias! Ese fue mi problema Preguntándose cómo es que nadie más sugirió esto ... – Mugen

+2

es una buena práctica verificar si el servicio que estamos utilizando está en nuestro Manifiesto. Gracias Xuan Tung Vu –

+1

También asegúrese de que '' esté solo * dentro * del '' pero no el ''. – gladed

1

Tuve un error similar. Resultó ser debido a la diferencia entre estos dos bloques de código:

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

y:

private final IBinder mBinder = new MyBinder(); 

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

El primer bloque no funciona, el segundo bloque hace.

Espero que esto ayude a salvar a alguien más las horas que me llevó rastrear esto.

0

Resolví el problema haciendo un nuevo proyecto y copiando el código en él. Probablemente el problema estaba relacionado con el nombre del paquete.

extraño en Android Studio que tenían la siguiente situación (proyecto no trabaja):

  • nombre del paquete: com.company.proj.servidor
  • nombre de la aplicación: speedtest
  • nombre del servidor: SyncServer

Esta extraña bloqueado el servidor para ser visto fuera de la aplicación

En el nuevo proyecto que tenía (de trabajo):

  • nombre del paquete: com.company.proj.server.speedtest
  • nombre de la aplicación: speedtest
  • nombre del servidor: SyncServer

aviso cómo el nombre de la aplicación es el último elemento del paquete.

La primera situación permitió que la aplicación se ejecute correctamente, para enviar mensajes al servicio pero no para acceder al servicio desde una aplicación diferente (el androide de la bandera: exportados = "true" se estableció correctamente en ambos casos)

0

Creo que la bandera del servicio encuadernado está configurando mal. debe establecer el indicador en su conexión de servicio.

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

};

había hecho un ejemplo simple en github. https://github.com/wingsum93/Bind_Service_Example

Cuestiones relacionadas