onServiceConnected()未被调用。

25

我在使用后台服务时遇到了问题。
我从两个活动中使用该服务。

第一个活动使用startService(intent)启动Service,并使用bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 进行绑定。

这个过程很完美,我可以在 onServiceConnected() 中发送Message

第二个活动仅绑定 Service (因为它已经启动),同样使用bindService(intent, mConnection, Context.BIND_AUTO_CREATE);进行绑定。

现在我的问题是:
在第二个活动中,我有一个Button ,希望在按下时使用服务。但是,在这个活动中onServiceConnected() 没有被调用,所以我无法获取绑定器来创建Messenger 向服务器发送消息。

是否有人知道onServiceConnected()会在何时被调用,或者它可能在等待什么东西?
还有其他解决这个问题的方法吗?

编辑: bindService 返回false,这可能是什么原因呢?

提前感谢您的回答。


如果您想在第一次绑定后调用onRebind,则bindService应返回false - omerfarukdogan
可能是重复的问题:bindService方法后onServiceConnected从未被调用 - TT--
8个回答

38
您需要在Android清单文件中添加以下内容:<service android:name="package.path.to.your.service.class" android:enabled="true"></service>

2
对我来说,不需要 .class。 - Frank Myat Thu
1
在清单文件中添加包名和服务类路径非常重要:package.path.to.your.service.class。同时,务必导入所需的包。 - David Hackro
1
我遇到了这个问题,是因为我将两个项目合并成一个,忘记在主清单文件中添加服务声明。令人烦恼的是,Android 没有给出任何提示。 - vainquit

30
在进一步研究后,我发现这是Android中已知的问题。
我提到的第二个活动是一个在TabActivity中用作内容的活动。
修复方法是在应用程序上下文中调用bindService(...),而不是在活动上下文中使用getApplicationContext().bindService(...)

2
你好,我遇到了同样的问题。你能详细解释一下解决方法吗?如果可能的话,你能看看我的代码并告诉我应该进行哪些更改吗?非常感谢。这个错误已经让我抓狂了一整天。我的代码:http://ideone.com/cV5BJa - Max
你能解释一下为什么我们需要使用getApplicationContext().bindService而不是bindService吗?bindService在我的一个Activity中可以工作,但在另一个Activity中无法工作(getApplicationContext().bindService可以工作)。这很奇怪。 - Thinsky
非常感谢!这正是我所面临的问题,使用应用程序上下文而不是活动上下文确实很有意义。它解决了我的问题!谢谢! - Sjd

9

刚刚我也遇到了这个问题。
onbind返回之前,别忘了实例化你的binder类。 这是一个愚蠢的错误,但确实会发生。希望这能帮助未来的某个人。

private YourBinder thisBinder;

oncreate
{
  thisBinder = new YourBinder(); //don't forget this.
}


public class YourBinder extends Binder
{

}

public IBinder onBind(Intent intent) 
{
  return thisBinder;
}

来自未来,这帮了我很多。谢谢。 - David Tabernero M.

9
在清单文件中添加绑定。
 <service
            android:name=".MyAccessibilityService"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" >
            <intent-filter>
                <action android:name="android.accessibilityservice.AccessibilityService" />
            </intent-filter>

</service>

MyAccessibilityService是你的服务名称。


3
这是我的解决方法:

不要使用

public IBinder onBind(Intent intent) {
    return null;
}

我使用了

public IBinder onBind(Intent intent) {
    return mMessenger.getBinder();
}

如果您不需要特定的实现,它甚至可以与新的Binder()一起使用。 - DrinkBird

0
在我的情况下,是因为我忘记在服务内实例化绑定器,所以 onBind 返回了 null。 我原来的代码是这样的:
    private ServiceBinder mServiceBinder;

用这个替代:

    private ServiceBinder mServiceBinder = new ServiceBinder();

0
<service
            android:name="com.app.triad.tseacro.services.LocationUpdatesService"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
            android:foregroundServiceType="location"
            >
        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService" />
        </intent-filter>
    </service>

0

我曾经是Xamarin开发者,也遇到了同样的问题。后来发现是因为没有给服务正确的名称。因此,应该给服务命名属性。我想这就是Xamarin编译器所做的事情,在Android XML中进行相应的条目。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接