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();
}
}
Ответы
Ответ 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
У меня была такая же ошибка, и причина в том, что я забыл запустить сервис.